- 이슈
BO 에서 대용량 엑셀 다운로드 시 서버에 영향을 줌 (서버 부하)
- 대응 : pre-signed URL
: S3 오브젝트에 일정시간 동안만 접근 가능한 임시 URL을 발급하는 방식
BO 엑셀 다운로드에 쓸 수 있는 경우
적합한 시나리오
| 대용량 엑셀 파일 | 서버에서 |
| 비동기 생성 | 데이터 많아 생성 시간이 걸릴 때 => 생성 완료 후 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시간 후 자동 삭제