S3를 사용하게 되면서 업로드 시 서버에서 Presigned URL을 생성해 클라이언트로 반환한 뒤 클라이언트가 URL로 PUT요청을 통해 파일을 업로드하도록 구현해보았다.
public PresignedPutObjectRequest presignPut(String bucket, String key, Duration ttl)
{
PutObjectRequest putObjectRequest = PutObjectRequest.builder()
.bucket(bucket)
.key(key)
.build();
PutObjectPresignRequest presignRequest = PutObjectPresignRequest.builder()
.signatureDuration(ttl)
.putObjectRequest(putObjectRequest)
.build();
return s3Presigner.presignPutObject(presignRequest);
}
이 경우, S3는 클라이언트가 보내는 파일의 크기를 제한하지 않고 모두 업로드한다. 만약 악의적인 클라이언트가 매우 큰 파일을 업로드한다면, S3의 비용이 많이 증가하게 될 것이기에 업로드 파일의 크기를 제한할 수 있는 방법이 필요하다.
우선 PUT 메서드를 계속 사용하는 경우,
.contentLength(5*1024*1024L) // 최대 5MB
를 지정할 수 있다는 것 같아 테스트해보았지만, 포스트맨때문인지, 다른 이유가 있어서인지 업로드 요청이 차단되었다.
contentLength가 지정된 값과 동일하면 문제가 발생하지 않을까 싶어 명시한 값으로 수정해 요청해보았지만, 타임아웃이 발생했다.
원인을 알기 위해서는 S3 내부 원리에 대해 더 자세히 알아보아야 할 것 같다.
다만 확실한 것은 S3 Presigned URL PUT 방식은 업로드할 파일의 크기를 제한하기 어렵다는 점이다.
만약 클라이언트가 파일을 백엔드로 보낸 뒤, 백엔드에서 파일 크기 등을 검증 한 뒤 직접 S3로 업로드하는 경우라면 문제가 없겠지만 이 경우 백엔드의 리소스를 많이 소모하기에 대부분은 클라이언트가 바로 S3로 업로드하는 것을 원할 것이다.
이처럼 신뢰할 수 없는 클라이언트의 업로드를 제어하기 위해서는 PUT이 아닌 POST를 사용해 정책을 강제할 필요가 있다.
AWS SDK for Java V2는 PUT, GET만을 지원할 뿐 POST URL 생성은 지원하지 않기에 직접 SigV4로 Policy를 서명하도록 구현해야한다.
https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/API/sigv4-authentication-HTTPPOST.html
Authenticating Requests: Browser-Based Uploads Using POST (AWS Signature Version 4) - Amazon Simple Storage Service
Authenticating Requests: Browser-Based Uploads Using POST (AWS Signature Version 4) Amazon S3 supports HTTP POST requests so that users can upload content directly to Amazon S3. Using HTTP POST to upload content simplifies uploads and reduces upload latenc
docs.aws.amazon.com
https://github.com/bumsoft/spring-s3-presigned-post-sigv4
GitHub - bumsoft/spring-s3-presigned-post-sigv4
Contribute to bumsoft/spring-s3-presigned-post-sigv4 development by creating an account on GitHub.
github.com
'인프라' 카테고리의 다른 글
| AWS: IAM Billing 읽기 권한 (0) | 2025.10.21 |
|---|---|
| Blue-Green Deployment (자동화) (0) | 2025.10.18 |
| AWS: IAM 사용자 생성 (0) | 2025.10.18 |
| AWS CLI: describe-rules --listener-arn (0) | 2025.10.18 |
| Blue-Green Deployment (기본) (0) | 2025.10.17 |