프로그래밍/Java

파일 업로드를 위한 Pre-signed URL 사용법 (Java 예제 포함)

Jinwookoh 2025. 5. 16. 23:34

 

 

대용량 파일을 직접 서버에 업로드하지 않고 S3와 같은 스토리지 서비스에 안전하게 업로드할 수 있는 방법으로 Pre-signed URL이 자주 활용됩니다. 이 글에서는 Pre-signed URL의 개념과 함께 Java에서 Pre-signed URL을 생성하고 사용하는 방법을 실제 코드 예제와 함께 자세히 설명하겠습니다.


Pre-signed URL이란?

Pre-signed URL은 특정 파일에 대해 제한된 시간 동안 접근이 가능하도록 서명된 URL입니다. 이 URL을 통해 사용자는 인증 없이도 파일을 업로드하거나 다운로드할 수 있습니다. 주로 다음과 같은 목적에 활용됩니다.

  • 클라이언트가 직접 S3에 파일 업로드
  • 서버 리소스 사용 최소화
  • 인증 없는 제한된 액세스 제공
  • 임시 파일 다운로드/업로드 허용

전체 흐름 요약

  1. 서버에서 Pre-signed URL 생성 (Java)
  2. 클라이언트에서 해당 URL로 파일 업로드 (JavaScript 또는 Postman 등)
  3. 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을 생성하고 활용해보세요.