S3 Presigned URL 업로드시 PUT이냐 POST냐

AWS는 Presigned URL을 두 가지 방식으로 제공한다.
김보람's avatar
Nov 19, 2025
S3 Presigned URL 업로드시 PUT이냐 POST냐

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 업로드 구조를 짜는 데 크게 문제가 없다.

Share article

RN 삽질 일지