Spring Boot에서 AWS S3에 파일 업로드 시 403 에러 발생:
The request signature we calculated does not match the signature you provided.
Check your key and signing method. (Service: S3, Status Code: 403)
1. YAML 설정에 따옴표 추가
2. AWS SDK v1 → v2 마이그레이션
3. 새로운 IAM 사용자 및 Access Key 생성
4. application.yaml 중복 설정 제거
AWS SDK v2의 서명 계산 과정에서:
1. HTTP 헤더에 metadata가 포함됨 (x-amz-meta-original-filename)
2. 한국어가 URL 인코딩되면서 서명 계산에 사용되는 값이 달라짐
3. 서버에서 검증 시 서명 불일치 → 403 에러
AWS CLI로 같은 자격 증명 테스트:
AWS_ACCESS_KEY_ID="AKIA..." \
AWS_SECRET_ACCESS_KEY="zgTF..." \
aws s3 cp test.txt s3://test-buket/test.txt --region ap-northeast-2
→ 성공! (자격 증명은 문제 없음을 확인)
metadata에 한국어 파일명 포함으로 인한 서명 문제!
❌ 문제 코드
PutObjectRequest putObjectRequest = PutObjectRequest.builder()
.bucket(bucketName)
.key(s3Key)
.contentType(file.getContentType())
.metadata(java.util.Map.of("original-filename", originalFilename)) // 한국어!
.build();
✅ 해결: metadata 제거
PutObjectRequest putObjectRequest = PutObjectRequest.builder()
.bucket(bucketName)
.key(s3Key)
.contentType(file.getContentType())
.build();