🎯 Goals
- 퍼블릭 버킷 에 대해 DDoS 급 파일 다운로드 요청 방지
- IP 기반으로 특정 사용자와 동일 AWS EC2 에서만 S3 오브젝트 업로드 가능
- S3 오브젝트 다운로드시 인가 로직 추가
(ex. JWT)
가장 중요한 것은 과도한 클라우드 비용이 발생을 방지하는 것.
클라우드 비용 폭탄이 일부 파일 유출보다 더 큰 문제.
1. CloudFront
Contents Delivery Network (CDN) 역할
When to use
- S3 버킷이 Public 상태 일 때
S3 엔드포인트를 숨기고(Private) CloundFront URI 로만 접근 가능하게 할 수 있다.
- 가독성이 떨어지는 S3 주소를 그대로 사용하고 싶지 않을 때
EndPoint 주소를 Route53 과 연결하여 가독성 있는 주소로 변경 가능하다.
2. WAF
Web Application Firewall
⚠️ S3 에 WAF 를 적용하고 싶다면, CloudFront 와 함께 사용해야만 한다.
⚠️WAF 는 단위 기간 동안 총 10,000개 IP 주소만 접근 제한할 수 있다.
높은 rate 의 요청이 순간적으로 10,000개가 넘어가면 10,000개 까지만 접근 제한하고 그 넘어의 IP 는 막아내지 못한다.
(추가 비용은 없음)
When to use
- 특정 IP 주소에서만 리소스 접근이 가능하게 할 때
- 특정 IP 주소의 과도한 Request 를 방지하고자 할 때
헤더 문자열 검사는 "우리 서비스 사용자" 로는 제한 가능한데 불특정 사용자 다수에겐 의미가 없음.. (인증이 아니라 인가가 필요함)
=> 헤더 문자열 검사를 '업로드' 에만 하면 BJ, 관리자에게만 헤더 문자열을 줌으로써 인가 가능.
Pros | Cons |
---|
IP 없이 특정 사용자들에게만 업로드 권한을 부여할 수 있음 | 동적으로 임시 문자열 값을 변경하기 어렵기 때문에 임시 비밀번호로는 부적절 |
3. Lambda
오로지 파일 다운로드만 수행하는 람다 콜 (JWT 검증만 람다 -> 회원 등급 검사) -> 파일 다운로드.
혹은 람다 호출시 임시 비밀번호를 입력하게끔 강제하여 인증된 사람만 다운로드 가능.
When to use
- 인증/인가에 커스터마이징 된 키 값을 사용할 때
(ex. JWT)
단점
- 리전별 concurrency rate limit (1,000)
- 파일 확장자를 미리 알기 어려움
=> 브라우저별 대응이 필요함.
4. S3 pre-signed URLs
The pre-signed URLs are valid only for the specified duration.
When to use
- 일정 시간동안만 URL 로 다운로드를 허용하고자 할 때
단점
- 시간이 지나면 파일을 받을 수 없기 때문에
쪽지 기반의 리워드가 제한됨.
- Public 한 리소스에 사용할 수 없음.
📝 결정
- ✅ 퍼블릭 버킷 에 대해 DDoS 급 파일 다운로드 요청 방지
- ✅ IP 기반으로 특정 사용자와 동일 AWS EC2 에서만 S3 오브젝트 업로드 가능
- ❌ S3 오브젝트 다운로드시 인가 로직 추가
중요한 2가지 요구사항을 만족시키는 CloudFront + WAF 를 사용하기로 했다.
🔗 Reference