카테고리 없음

Pre-signed URL 이란?

1son 2026. 5. 26. 13:01

- 이슈 

BO 에서 대용량 엑셀 다운로드 시 서버에 영향을 줌 (서버 부하) 

 

- 대응 : pre-signed URL 

: S3 오브젝트에 일정시간 동안만 접근 가능한 임시 URL을 발급하는 방식 

 

 


 

BO 엑셀 다운로드에 쓸 수 있는 경우 

적합한 시나리오 

대용량 엑셀 파일 서버에서 미리 생성해 S3 에 저장 후 URL 발급
비동기 생성 데이터 많아 생성 시간이 걸릴 때 => 생성 완료 후 URL 전달 
반복 다운로드  동일 파일을 여러 번 다운로드할 때 S3 캐싱 활용
서버 부하 분산 파일 전송을 S3가 직접 처리하므로 WAS 부하 감소 

 

 

굳이 필요없는 시나리오 

- 소량 데이터, 즉시 생성 가능한 경우 -> 그냥 API 에서 직접 파일 반환이 단순 

- 파일을 저장한 S3 인프라가 없는 경우

 

 


 

 

일반적인 구현 흐름 

[BO 사용자]
    │
    ▼
[1] 다운로드 요청 (GET /api/excel/download)
    │
    ▼
[2] 서버: 엑셀 생성 → S3 업로드
    │
    ▼
[3] 서버: Pre-signed URL 발급 (유효기간 예: 5분)
    │
    ▼
[4] 클라이언트: Pre-signed URL로 직접 S3에서 파일 다운로드

 

 

 


 

[1] BO 사용자 → 다운로드 요청

사용자가 버튼 클릭
→ 브라우저가 API 서버에 HTTP 요청
→ GET /api/excel/download

단순히 "엑셀 줘" 하고 서버에 요청

 

 

[2] 서버: 엑셀 생성 → S3 업로드

① DB 조회
   → 필요한 데이터 가져옴

② 엑셀 파일 생성
   → 가져온 데이터로 .xlsx 파일 만듦
   → 아직 서버 메모리에만 존재

③ S3 업로드
   → 만든 파일을 S3 창고에 저장
   → 이제 S3에 파일이 존재

 

나는 여기서 DB 조회를 여전히 하고 있으면 

- DB 조회 부하는 여전히 WAS 에 존재 

 

pre-signed URL을 왜 사용하는가? 

 

Pre-signed URL이 줄여주는 부하 vs 못 줄이는 부하

       
단계 기존 방식 Pre-signed URL 부하 감소?
DB 조회 WAS WAS ❌ 동일
엑셀 생성 WAS WAS ❌ 동일
파일 전송 WAS S3 ✅ 감소

 

 

그럼 뭘 위해 쓰는 건가 ?

Pre-signed URL이 해결하는 건 파일 전송 부하

특히 이런 상황

  • 파일이 수십 MB 이상으로 커서 전송 자체가 오래 걸릴 때
  • 동시에 많은 사람이 다운로드할 때 WAS 네트워크 대역폭이 부족할 때

 

 pre-signed URL 이 줄여주는 부하는?

- 기존 방식에서 WAS -> 사용자 브라우저로 파일을 전송하는 구간 

 


기존 방식

[DB] ──데이터──▶ [WAS] ──파일 전송──▶ [브라우저]
                   ↑
           여기서 파일을 들고
           직접 브라우저까지 전달

 

파일이 크면 WAS가 그 파일을 붙들고 전송 완료될 때까지 계속 자원을 점유합니다.

동시에 10명이 다운로드하면 WAS가 10개 파일을 동시에 들고 전송 중인 상태가 됩니다.

 

Pre-signed URL 방식

[DB] ──데이터──▶ [WAS] ──파일 업로드──▶ [S3] ──파일 전송──▶ [브라우저]
                   ↑                              ↑
             여기까지만 관여            파일 전송은 S3가 담당
             URL 주고 끝

 

WAS는 S3에 올리고 URL만 주면 끝이라 파일 전송 동안 자원을 점유하지 않음

 

즉 , 핵심은

WAS가 파일을 직접 들고 전달하냐 vs S3가 전달하냐

 

 


 

[3] 서버: Pre-signed URL 발급

S3에 저장된 파일의 주소를 만드는 단계

→ "이 파일을 5분간 누구나 다운로드할 수 있는 URL 만들어줘"
→ S3가 서명이 담긴 임시 URL 발급

예) https://s3.amazonaws.com/bucket/report.xlsx?서명&만료시간

 

[4] URL → 클라이언트 → S3에서 다운로드

① 서버가 URL을 BO 브라우저에 반환
② 브라우저가 그 URL로 자동 접근
③ S3가 서명 확인 후 파일 전송
④ 사용자 PC에 파일 다운로드 완료

 

전체를 한 장으로

[사용자]          [API 서버]              [S3]
   │                  │                    │
   │─── 엑셀 요청 ───▶│                    │
   │                  │                    │
   │                  │── DB 조회, 엑셀 생성│
   │                  │                    │
   │                  │─── 파일 업로드 ───▶│ 저장
   │                  │                    │
   │                  │◀── URL 발급 ───────│
   │                  │                    │
   │◀─── URL 반환 ────│                    │
   │                  │                    │
   │─────────── URL로 직접 요청 ──────────▶│
   │                  │                    │
   │◀─────────── 파일 다운로드 ────────────│

 

서버는 URL만 전달하고 빠지고, 실제 파일 전송은 S3가 직접 합니다.

 

WAS는 "엑셀 만들어서 S3에 올리고 URL 전달"까지만 하고 끝

이후 실제 파일 전송은 WAS 관여 없이 S3

브라우저 직접 처리


 

 

 

pre-signed URL 에 대해서 알아두어야 할 것

1. 유효기간 설정

Pre-signed URL은 만료시간이 있습니다.

  • 너무 짧으면 → 사용자가 다운로드 전에 만료될 수 있음
  • 너무 길면 → URL 유출 시 보안 위험

BO 내부용이면 5~10분이 적당합니다.


2. URL이 유출되면 누구나 다운로드 가능

Pre-signed URL은 인증 없이 접근 가능합니다.

→ URL만 알면 로그인 안 해도 파일 다운로드 가능
→ 카톡으로 URL 공유하면 상대방도 다운로드 가능

BO에서 민감한 데이터(고객 정보 등) 다운로드라면 유효기간을 짧게 가져가는 게 중요


3. 다운로드 후 S3 파일 처리

S3에 올린 파일을 그대로 두면 계속 쌓입니다.

  • S3 Lifecycle 정책으로 일정 시간 후 자동 삭제 설정 권장
  • 예) 1시간 후 자동 삭제