Infra/Cloud

Presigned URL

baek-dev 2025. 5. 17. 15:24

Presigned URL이란? (S3 사전 서명 URL)

Presigned URL(Presigned URL, 사전 서명된 URL)AWS S3에 있는 객체를 제한된 시간 동안만 접근할 수 있게 만들어주는 임시 URL임.
이 URL은 S3에 직접 접근 권한이 없는 사용자에게도 안전하게 업로드/다운로드 권한을 위임하는 방식으로 사용됨.


1. 왜 Presigned URL이 필요한가?

  • 사용자가 AWS 인증 정보를 갖고 있지 않아도, 특정 파일만 안전하게 접근하도록 허용하고자 할 때 사용됨
  • S3에 대한 IAM 권한 없이, 제한된 시간/동작만 허용하는 보안 기능임
  • API 서버를 거치지 않고 S3에 직접 파일을 업로드/다운로드함으로써 트래픽과 비용을 절감할 수 있음

2. Presigned URL의 동작 방식

  1. 서버에서 AWS SDK 를 통해 Presigned URL을 생성함
  2. 클라이언트에게 이 URL을 전달함
  3. 클라이언트는 이 URL을 사용해 S3에 직접 파일 업로드 또는 다운로드를 수행함
  4. URL은 지정된 시간 내에서만 유효하며, 시간이 지나면 접근 불가

3. 업로드 / 다운로드 구분

 

목적 HTTP Method 예시
업로드 (PutObject) PUT 이미지, 파일 업로드
다운로드 (GetObject) GET 사용자에게 파일 보여주기

4. Java (Spring)에서 Presigned URL 생성 예시

@Autowired
private AmazonS3 amazonS3;

public String generatePresignedUrl(String bucket, String key, int expirationMinutes) {
    Date expiration = new Date();
    expiration.setTime(System.currentTimeMillis() + expirationMinutes * 60 * 1000);

    GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucket, key)
        .withMethod(HttpMethod.PUT) // 또는 HttpMethod.GET
        .withExpiration(expiration);

    URL url = amazonS3.generatePresignedUrl(request);
    return url.toString();
}

5. 클라이언트에서 파일 업로드 예시 (JavaScript)

fetch(presignedUrl, {
  method: 'PUT',
  headers: {
    'Content-Type': 'image/png'
  },
  body: selectedFile
})
.then(res => {
  if (res.ok) console.log('업로드 성공');
});

6. Presigned URL 특징 및 제한사항

항목 설명
유효 시간 제한 최대 7일까지 설정 가능 (일반적으로 수 분~수십 분 설정)
접근 제한 특정 객체 하나에만 유효함 (key 기준)
보안성 URL 자체가 인증 토큰 역할 → 유출되면 누구나 접근 가능함
HTTP Method 제한 GET, PUT, DELETE 등 지정한 메서드만 허용됨
Content-Type 업로드 시 반드시 명확하게 설정해야 함 (S3 설정에 따라 Content-MD5 등 필요할 수도 있음)

7. 실무에서의 활용 사례

사례 설명
사용자 프로필 이미지 업로드 Presigned PUT URL을 발급하여 직접 S3에 업로드함
첨부파일 다운로드 Presigned GET URL을 발급하여 다운로드 링크 생성
공개하지 않은 콘텐츠 접근 정해진 시간 동안만 유효한 다운로드 링크 제공
서버 리소스 절약 대용량 파일은 서버를 거치지 않고 직접 S3로 업로드 처리함

8. Presigned URL 보안 주의사항

  • 유효 시간을 짧게 설정할 것 (보통 5~15분)
  • 클라이언트에게 전달하는 URL은 HTTPS로만 전송할 것
  • 업로드용 URL은 PUT, 다운로드용 URL은 GET으로 method를 명확히 제한할 것
  • 업로드 완료 후, 별도의 권한으로 접근 가능한 URL을 DB에 저장하거나 로그로 남기지 말 것

정리

Presigned URL은 AWS S3 객체에 대해 일시적으로 인증된 접근 권한을 부여하는 URL임.
이를 통해 서버가 직접 파일을 처리하지 않아도, 클라이언트가 안전하게 직접 S3에 업로드/다운로드 할 수 있음.
보안 설정과 유효 시간에 주의하면서, 트래픽 절감 및 성능 향상 목적으로 실무에서 자주 활용됨.

 

 

 

 

출처 : ChatGPT

'Infra > Cloud' 카테고리의 다른 글

AWS Lambda  (0) 2025.04.12
ECR  (0) 2025.04.11
[AWS] AWS S3(Simple Storage Service)  (0) 2025.03.10