대용량 파일을 직접 서버에 업로드하지 않고 S3와 같은 스토리지 서비스에 안전하게 업로드할 수 있는 방법으로 Pre-signed URL이 자주 활용됩니다. 이 글에서는 Pre-signed URL의 개념과 함께 Java에서 Pre-signed URL을 생성하고 사용하는 방법을 실제 코드 예제와 함께 자세히 설명하겠습니다.
Pre-signed URL이란?
Pre-signed URL은 특정 파일에 대해 제한된 시간 동안 접근이 가능하도록 서명된 URL입니다. 이 URL을 통해 사용자는 인증 없이도 파일을 업로드하거나 다운로드할 수 있습니다. 주로 다음과 같은 목적에 활용됩니다.
- 클라이언트가 직접 S3에 파일 업로드
- 서버 리소스 사용 최소화
- 인증 없는 제한된 액세스 제공
- 임시 파일 다운로드/업로드 허용
전체 흐름 요약
- 서버에서 Pre-signed URL 생성 (Java)
- 클라이언트에서 해당 URL로 파일 업로드 (JavaScript 또는 Postman 등)
- S3에 파일 저장 완료
1. Java로 Pre-signed URL 생성하기
Amazon S3를 기준으로 설명합니다. AWS SDK for Java v2를 사용합니다.
✅ Maven 의존성
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>2.20.22</version>
</dependency>
✅ Java 코드 예제
import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
import software.amazon.awssdk.services.s3.presigner.model.PresignedPutObjectRequest;
import java.net.URL;
import java.time.Duration;
public class PreSignedUrlGenerator {
public static void main(String[] args) {
String bucketName = "my-bucket-name";
String objectKey = "uploads/sample.txt";
S3Presigner presigner = S3Presigner.builder()
.region(Region.AP_NORTHEAST_2) // 서울 리전
.credentialsProvider(ProfileCredentialsProvider.create())
.build();
PutObjectRequest objectRequest = PutObjectRequest.builder()
.bucket(bucketName)
.key(objectKey)
.contentType("text/plain")
.build();
PresignedPutObjectRequest presignedRequest = presigner.presignPutObject(r -> r
.signatureDuration(Duration.ofMinutes(10))
.putObjectRequest(objectRequest));
URL url = presignedRequest.url();
System.out.println("Pre-signed URL: " + url.toString());
presigner.close();
}
}
위 코드를 실행하면 10분 동안 유효한 파일 업로드용 Pre-signed URL이 출력됩니다.
2. 클라이언트에서 파일 업로드하기
JavaScript, Python, Postman 등 다양한 방법으로 이 URL에 업로드할 수 있습니다.
✅ 예시 (cURL 사용)
curl -X PUT -T sample.txt "https://your-bucket.s3.amazonaws.com/uploads/sample.txt?X-Amz-..."
✅ JavaScript 예시 (브라우저 환경)
const file = document.querySelector("#fileInput").files[0];
fetch("https://your-presigned-url", {
method: "PUT",
headers: {
"Content-Type": file.type
},
body: file
})
.then(response => {
if (response.ok) alert("업로드 성공!");
else alert("업로드 실패");
});
자주 묻는 질문 (FAQ)
Q1. Pre-signed URL은 다운로드에도 사용할 수 있나요?
네. GetObjectRequest를 기반으로 하면 다운로드용 Pre-signed URL도 생성할 수 있습니다.
Q2. URL 유효시간은 얼마나 설정할 수 있나요?
보통 최대 7일까지 설정할 수 있지만, AWS 정책이나 보안 설정에 따라 다릅니다.
Q3. 업로드 시 파일 크기 제한은 없나요?
Pre-signed URL 자체는 제한이 없지만, S3 설정 또는 브라우저 제한을 고려해야 합니다.
마무리
Pre-signed URL은 보안성과 확장성을 동시에 확보할 수 있는 매우 유용한 기술입니다. 특히 파일 업로드 API를 경량화하고 싶거나, 클라이언트 중심의 아키텍처를 설계할 때 큰 도움이 됩니다. Java 기반 서버에서 손쉽게 Pre-signed URL을 생성하고 활용해보세요.
'프로그래밍 > Java' 카테고리의 다른 글
TDD 실전 사례: 자바로 시작하는 테스트 주도 개발 (0) | 2025.05.27 |
---|---|
CompletableFuture.get()과 join()의 차이점 (1) | 2025.05.18 |
Spring Cloud에서 Resilience4j로 Circuit Breaker 구현하기 (0) | 2025.05.11 |
@Transactional을 commit 하게 하려면? (0) | 2025.05.10 |
REST API 버전 관리 – URL 방식 vs 헤더 방식 비교 (0) | 2025.05.08 |