그리미
파일 공유 구현해보자 본문
코드는 https://github.com/C4-ComeTrue/my-storage/pull/12 에서 확인하실 수 있으십니다.
파일 공유 시 중요하게 생각했던 것은 링크 관리였습니다.
String shareLink = LocalDateTime.now() + UUID.randomUUID().toString();
위와 같이 링크를 구성하면 높은 확률로 링크가 중복될 가능성이 줄어듭니다.
https://stackoverflow.com/questions/1155008/how-unique-is-uuid
How unique is UUID?
How safe is it to use UUID to uniquely identify something (I'm using it for files uploaded to the server)? As I understand it, it is based off random numbers. However, it seems to me that given eno...
stackoverflow.com
정말 정말 Unique 하지만 중복 체크 쿼리 하나면 보다 Unique 함을 보장할 수 있다는 판단에 중복 체크를 해주었습니다.
공유 파일 다운 요청때 사용자로 부터 저장될 경로를 입력받습니다.
다만 이런 경우 경로 순회 문제에 주의 기울여야합니다.
https://support.google.com/faqs/answer/7496913?hl=ko
경로 순회 취약성 - Google 고객센터
도움이 되었나요? 어떻게 하면 개선할 수 있을까요? 예아니요
support.google.com
/../../
와 같은 형식으로 보안을 해칠 수 있기 때문입니다.
Path userDesignatedPath = Paths.get(userPath).resolve(fileMetadata.getOriginalFileName()).normalize();
자바에서 지원되는 Paths 의 normalize를 통해 이 문제를 해결할 수 있습니다.
파일이 삭제된 경우는 파일 공유 링크를 통해 파일을 다운 받는 것은 부자연스럽다 생각합니다. 해당 경우가 발생하면 CANNOT_FOUND_FILE 를 클라이언트에게 전달하게 구현하였습니다.
// 파일이 삭제된 경우에는 파일 공유 링크로 다운 받을 수 없다.
public FileMetadata findBy(Long fileId) {
return fileRepository.findById(fileId).orElseThrow(ErrorCode.CANNOT_FOUND_FILE::serviceException);
}
구현을 하다보니 파일 공유는 시간 지역성이 포인트라는 것을 알게 되었습니다.
파일 공유 기간 동안 같은 파일을 다운 받기 위한 요청이 자주 들어올 것으로 예상되기 때문입니다.
캐시를 적극 도입하는 방식을 통해 성능을 개선하면 재밌을 거 같습니다.
'프로젝트' 카테고리의 다른 글
공연 예매 프로젝트 개발 일지(1) - 객체 역할과 책임 그리고 협력 (0) | 2023.09.11 |
---|