파일 업로드를 하기 위해 graphql
로 업로드하는 로직을 연구하고 있었다. 해당 로직은 예제를 참고해서 완성했고, 서버에서 API
가 정상 작동함을 확인하였다.
하지만, 서버 앞 단의 미들웨어가 문제였다.
Mesh Gateway
라는 미들웨어인데, MSA
서버들의 데이터 소스를 graphql
스키마로 변환 및 통합한다. 프론트엔드는 해당 미들웨어에 대한 URL만 알면 된다.
이 Mesh Gateway
를 경유해서 파일 업로드 API
요청을 하면, 미들웨어가 버전이 너무 낮아 작동하지 않는 것을 발견했다.
해당 미들웨어를 뜯어내고 다른 걸로 교체하는 것은 백엔드와 인프라에 너무 많은 작업 시간을 소요하는 작업이었다.
그래서 다른 방법을 찾게 되었다.
Presigned URL
은 서버를 통해 파일 업로드를 하지 않고, 클라이언트가 클라우드 스토리지 서비스에 직접 업로드할 수 있도록 인증된 URL
을 제공하는 방식이다.
URL
이라는 String
값을 프론트엔드에게 주기만 하면 되므로, 미들웨어 문제가 발생하지 않으면서 파일을 업로드할 수 있었다.
Presigned URL
을 생성한 후, 클라이언트에게 제공한다.Presigned URL
을 사용해서 클라우드 스토리지 서비스에 직접 업로드한다.Presigned URL
은 제한된 기간 동안만 유효하기 때문에 보안이 우수하다. JWT Refresh
토큰과 같은 느낌이다.Presigned URL
이 노출되면, URL
유효 기간동안 누구나 해당 URL
에 접근할 수 있으므로 보안 위험 요소가 있다. 따라서 유효 기간을 짧게 설정해야 한다.S3
에 실제로 업로드하는 책임은 프론트엔드 개발자로 옮겨졌기 때문...Presigned URL
을 생성하기 전에 클라이언트 파일이 업로드 조건을 충족하는 지에 대해 사전 검증을 수행하긴 하지만, 이것만으로는 부족하다.
왜냐하면 사전 검증 요청에 포함된 파일 정보 등이 조작될 가능성도 있기 때문이다.
따라서 파일이 실제로 업로드된 뒤에, 서버가 해당 파일을 검증하는 사후 검증 로직도 필요하다.
S3
에 업로드되는 파일 중, 이미지나 동영상 같은 파일들은 추후 사용자에게 보여질 필요도 있다.
이런 대용량 정적 콘텐츠 배포에는 CDN
을 사용하면, 사용자에게 더 빨리 콘텐츠를 제공할 수 있을 것이다.