파일 업로드 API를 연동하려던 중, 백엔드 분께 아래와 같은 설명을 받았다.
“presignedurl 발급 받고
presignedurl로 s3에 올린 후
→ 파일 개수만큼 위 1,2번 반복 후
presignedurl 발급 때 만들어진 모든 id를
answer의 value값으로 보내주시면 될 것 같아요.”
처음 봤을 땐 솔직히 이게 무슨 말인지 감이 잘 안 왔다.
Presigned URL? id를 보내라고? answer의 value? 의문이 줄줄이 이어졌다.
그래서 우선, 이 내용을 이해하기 위해 S3 Presigned URL이란 무엇인지부터 정리하고 가려고 한다.
Amazon S3 (Simple Storage Service)는 AWS에서 제공하는
객체 스토리지 서비스로, 다양한 형태의 데이터를 인터넷 상에서 안전하게 저장하고 관리할 수 있는 공간이다.
S3에 저장된 파일을 다른 사용자와 공유하는 방식은 다음과 같다.
Presigned URL은 S3에 저장된 특정 객체에 대해 일시적인 접근 권한을 부여한 URL이다.
URL을 생성한 사용자의 권한을 기반으로 작동
일반적으로 파일 업로드(PUT) 또는 다운로드(GET) 용도로 사용
만료 시간(예: 10분, 1시간 등)을 지정할 수 있다
"presignedurl 발급 받고 → s3에 올리고 → id를 answer에 담아 보내달라"
이걸 단계별로 정리하면 다음과 같다.
Presigned URL 발급 요청
클라이언트는 서버에 Presigned URL 발급을 요청한다.
이때 서버는 S3 업로드용 URL과 함께 해당 파일을 식별할 수 있는 ID (Key)를 함께 응답한다.
클라이언트가 S3에 파일 업로드
응답받은 URL로 클라이언트가 직접 S3에 파일을 업로드한다. (PUT 요청)
파일이 여러 개일 경우
위 과정을 파일 개수만큼 반복한다.
각 파일마다 Presigned URL과 Key를 받아서 각각 업로드한다.
업로드 완료 후, Key 목록 전송
업로드한 모든 파일의 Key(ID)를 배열로 모아 서버로 전송한다.
예: answer.value = [key1, key2, key3]
서버는 해당 Key를 저장
이후 필요한 요청에서 해당 Key를 기반으로 다운로드용 Presigned URL을 다시 생성하거나, 다른 처리를 할 수 있다.
Presigned URL은 클라이언트가 직접 S3에 안전하게 파일을 업로드할 수 있게 해주는 임시 URL이다.
서버가 발급한 URL을 통해 클라이언트는 별도 인증 없이 S3에 직접 파일을 올릴 수 있다.
이때 발급된 파일의 Key만 서버로 전달하면 되고, 이후 서버는 해당 Key를 활용해 파일을 조회하거나 다운로드 URL을 다시 생성할 수 있다.
처음엔 Presigned URL이라는 단어조차 생소했지만, 개념과 흐름을 하나씩 정리해보니 이 방식이 왜 널리 쓰이는지 이해할 수 있었다.
S3에 직접 업로드하면서도 보안과 효율을 동시에 챙길 수 있는 구조.
앞으로는 더 복잡한 업로드 흐름에서도 Presigned URL을 자신 있게 활용할 수 있을 것 같다.
[참고자료]