
React Native에서 이미지를 업로드할 때, 서버를 거치지 않고 S3에 바로 올리는 구조를 자주 쓰게 된다. 이때 서버에서 내려주는 게 바로 S3 Presigned URL이다.
백단이 제공해준 명세서만 확인하고 PUT or POST 메서드를 사용하는데 급 궁금해져서 찾아본다
🔍 Presigned URL?
Presigned URL은 서버가 AWS S3에 어떤 파일을 업로드할 수 있도록 서명을 포함한 임시 URL을 만들어서 보내주는 것이다.
이 URL은 유효기간이 있고, 그 시간 동안만 접근할 수 있다.
의미는 간단하다.
서버는 파일을 직접 저장하지 않아도 된다
클라이언트는 서명된 URL만 있으면 S3에 직접 업로드할 수 있다
보안적으로도 괜찮고, 서버 부하도 줄어든다
앱에서 이미지 업로드를 구현할 때 제일 많이 쓰는 방식이기도 하다.
🔥 중요한 포인트: Presigned URL은 두 종류다
RN에서 Presigned URL 업로드가 헷갈리는 가장 큰 이유가 바로 이거다.
AWS는 Presigned URL을 두 가지 방식으로 제공한다.
1) Presigned PUT URL
2) Presigned POST URL
두 방식은 업로드 방식부터 사용해야 할 데이터 형태가 완전히 다르다.
이 차이를 정확히 알아야 업로드 실패를 막을 수 있다.
✔ Presigned PUT 방식
PUT 방식은 서버가 URL 하나만 내려주는 형태다.
특징은 이렇다:
업로드 방식은 HTTP PUT
S3는 요청의 body를 “파일의 실제 바이트 내용”으로 그대로 저장한다
그래서 multipart/form-data(FormData)로 보내면 안 된다
파일의 순수한 바이너리 데이터를 그대로 보내야 한다
Content-Type 등 메타정보는 presign 생성 시와 일치해야 한다
딱 하나만 기억해두면 된다.
👉 PUT 방식 = 파일의 순수한 바이너리를 그대로 보내는 방식
이 방식이 최근 서버들에서 가장 흔하게 사용하는듯
✔ Presigned POST 방식
POST 방식은 PUT 방식과 달리, URL과 함께 여러 fields 값들을 내려준다.
특징은 다음과 같다:
업로드 방식은 HTTP POST
업로드는 multipart/form-data, 즉 FormData 구조로 보내야 한다
서버에서 내려준 fields 값이 서명에 포함되어 있기 때문에 그대로 넣어야 한다
파일도 FormData 안에 넣어서 함께 전송하는 구조
핵심은 하나다.
👉 POST 방식 = FormData 방식 전용 구조
PUT과는 정반대라고 보면 된다.
🧠 정리
간단하게 구분하면 이렇다.
PUT Presigned URL → 바이너리 업로드
POST Presigned URL → FormData 업로드
RN에서 업로드가 실패하는 대부분의 이유가 바로
“Presigned URL이 어떤 방식인지 모르고 잘못된 방식으로 보내는 것”이다.
그래서 서버로부터 Presigned URL을 받을 때는 항상 다음을 확인해야 한다:
이 URL이 PUT인지 POST인지
Content-Type을 고정해야 하는지
fields 값이 있는지 (POST인 경우)
만료 시간은 얼마나 되는지
이 네 가지를 알아두면 RN에서 S3 업로드 구조를 짜는 데 크게 문제가 없다.