첨부파일 업로드 In NKS
게시판에 달려있는 첨부파일을 기능을 만들어야 한다.
간단한 작업이지만 깊게 보자면 사실 고민할 포인트는 너무나도 많다.
1. 중복파일 관리
2. 파일에 대한 접근관리(ACL)
3. 파일 암호화
4. 심플한 아키텍쳐
일단 단순하게 파일 업/다운로드 부터 시작해 보자!.
천리길도...........
네이버 클라우드를 사용하다 보니 전통(?)적인 방식으로 적용하기 보다는 클라우드 환경에 맞게 우아(?)하게 생각s.
보통 b2b에서는 온-프라미스 방식으로 운영한다. 그렇기 때문에 단순하게 NAS나 SAN 이용한다.
보통은 싼마이 NAS를 이용한다.
물론 S3를 자체 구축해서 붙이는 CASE도 있었지만 일반적이지 않다. (XX정보통신에서 한 번 희귀한 경험을 해봤다)
b2c에서의 환경은 대부분 클라우드 환경이다 보니 S3와 CDN을 이용하는것 같다.
물론 S3 링크로 직접 파일 다운로드를 할 수 있지만 주소가 노출 되면.... 그리고 필연적으로 주소가 노출 될 수 밖에 없는 구조다. 따라서 CDN으로 한 번 감싸고 CDN에서 제공해주는 보안 요소를 추가해주면 깔끔s하다.
네이버 클라우드에서 "글러벌 엣지"라는 서비스를 해주고 있다.
https://www.ncloud.com/product/contentDelivery/globalEdge
NAVER CLOUD PLATFORM
cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification
www.ncloud.com
Refer만 설정 해도 최소한의 컨텐츠 보호를 할 수 있다. JWT같은 부가적인 기능들도 설정가능하다...굳s!!
미디어 서비스에만 필요한 녀석이라서고 생각했는데 기본적인 파일들까지도 이용하면 좋을 것 같다.
파일 업/다운로드에 사용되는 대역폭을 CDN으로 위임해 본 서버는 비지니스로직 관련 트래픽만 전념할 수 있도록 설계를 한다. 본 서버가 한결 쾌적해 진다.
물론 CDN을 이용하지 못하는 환경에서는 보안적인 부분은 직접 처리를 해야 한다.
S3에 대한 프락시 엔드포인트를 만들어줘야 한다. 즉, 우리 내 엔드포인트를 들어올 때 보안적인 부분을 해결하고 필요한 내용을 가공해서 바로 방출한다.
파일명만 변경해서 바로 S3스트림을 프락시해주는 로직이다.
fun download(@PathVariable("fileId") fileId:String): ResponseEntity<InputStreamResource> {
val fileDto = ServiceUtils.getFileService().get(fileId) ?: throw Exception("file is null")
val s3 = getAmazonS3Client()
val path = ServiceUtils.getFileService().downloadDirPath(fileId) + fileDto.ext
val s3Object = s3.getObject("blob", path)
val resource = InputStreamResource(s3Object.objectContent)
return ResponseEntity.ok()
.contentLength(s3Object.objectMetadata.contentLength)
.contentType(MediaType.parseMediaType("application/octet-stream"))
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileDto.name + "\"")
.body(resource)
}
우린 글러발 엣지를 사용하겠다. ㅋ