서버 중계 업로드

서버 중계 업로드는 말그대로 파일의 관리 주체를 서버 중심으로 하는 것이다.

기본적으로 multipart/form-data로 이미지 전송하여
백엔드에서 파일크기, MIME type, 확장자 , 이미지 디코딩 검증을 수행하여 R2에 업로드하는 방식이다.

해당 방식은 한 곳(서버)에서 모든걸 담당한다는 점에서 검증을 안정적으로 처리할 수 있다.

그러나 백엔드에 부하가 발생하며 대용량/대량 업로드에 불리하다.

장점

  • 구현 단순
  • 프론트 구현 쉬움
  • R2 CORS 설정 불필요 또는 최소화
  • 백엔드에서 검증 일원화 가능
  • object key 생성 통제 쉬움
  • DB 실패 시 보상 삭제 처리 쉬움
  • 관리자 업로드에 적합

단점

  • 백엔드가 파일 트래픽을 모두 감당
  • 파일 크기가 커지면 서버 부담 증가
  • 동시 업로드가 많으면 병목 가능
  • 요청 시간이 길어질 수 있음
  • 대용량 업로드에는 부적합

presigned PUT URL

presigned PUT URL 방식은 서버에서 직접 파일을 처리하는 것이 아닌
버킷 자체에서 url를 생성하고 해당 url으로 직접 업로드 하는 방식이다.

해당 방식을 통해 서버의 부담을 줄일 수 있다.
그러나 해당 방식에도 추가적인 이슈가 존재한다.

  • client가 bucket에 직접 파일 전송
  • 파일 정상적으로 저장
  • 그러나 서버에 예기치 않은 문제로 인해 데이터 저장 실패

그렇다면 client가 직접 올린 해당 파일을 서버에서 알 수 없기에
최종적으로 버킷에는 고아 객체가 계속 쌓일 것이다.

장점

  • 백엔드 트래픽 부담 감소
  • 대용량/대량 업로드에 유리
  • 브라우저가 R2에 직접 업로드
  • 업로드 진행률 처리에 유리
  • 확장성 좋음

단점

  • 구현 흐름 복잡
  • R2 CORS 설정 필요
  • presigned URL 발급 API 필요
  • confirm API 필요
  • 미확정 객체 정리 필요
  • 파일 검증이 사전/사후로 나뉨
  • DB와 R2 사이 정합성 관리가 더 어려움

출처 및 참고자료

velog 1
https://ipekogosu.tistory.com/59
https://developers.cloudflare.com/r2/api/s3/presigned-urls/