참고 자료

https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/PresignedUrlUploadObject.html

개념

미리 서명된 URL을 사용하여 다른 사람이 Amazon S3 버킷에 객체를 업로드하도록 허용할 수 있습니다. 미리 서명된 URL을 사용하면 상대방에게 AWS 보안 자격 증명이나 권한이 없어도 업로드할 수 있습니다. 미리 서명된 URL은 이를 생성하는 사용자의 권한에 따라 제한됩니다. 즉, 객체를 업로드하기 위해 미리 서명된 URL을 수신하는 경우, URL의 생성자가 해당 객체를 업로드하는 데 필요한 권한을 보유하는 경우에만 객체를 업로드할 수 있습니다.

when?

사용자가 URL을 사용하여 객체를 업로드하는 경우 Amazon S3는 지정된 버킷에 객체를 생성합니다.

why?

[1] 브라우저→ 서버→ S3

서버에서 S3 버킷으로 파일을 업로드 하려면 우선 업로드 하려는 파일을 브라우저에서 서버로 보낸 뒤, 해당 파일을 S3 버킷으로 업로드 하는 과정을 거쳐야 한다. 이 과정은 자원이 많이 소모되고 비효율적인데, 그 이유는 *저장하지도 않을 무거운 이미지 파일을 서버로 전송하는 과정이 포함되어 있기 때문이다.

[2] 브라우저(presigned URL)→ 서버→ S3

브라우저의 보안이 굉장히 취약하다. preSigned URL을 발급 받는 과정에서 S3에 대한 접근 인증 권한을 가진 credential을 탈취 당하게 된다면 누구나 나의 S3 버켓에 접근할 수 있게 된다. 프로덕션 환경에서 credential을 탈취 당해 유저가 등록한 이미지들이 모두 삭제됐다고 생각해보면 정말 엄청난 재앙이 아닐 수 없다.

[3] 백엔드(presinged URL)→ 브라우저→ 서버→ S3


*저장하지도 않을 이미지에는 무엇이 있을까?

미리보기 이미지, 수정된 이미지, 사용자 업로드 이미지 , 버전 관리 이미지, 타사 이미지, 임시 파일

how to flow

<aside>

preSignedURL 요청 : 클라이언트→ 서버→ S3

preSignedURL 전달 : S3 → 서버→ 클라이언트

이미지 upload: 클라이언트→ S3

*요청 종료 알림 : 클라이언트→ 서버