Amazon CloudFront 정리
1. CloudFront 개요
CloudFront란?
- Content Delivery Network (CDN) - 콘텐츠 전송 네트워크
- 전 세계 수백 개의 Edge Location에서 콘텐츠 캐싱
- 읽기 성능 향상, 사용자 경험 개선
보안 기능
- DDoS 방어 (전 세계 분산 구조)
- AWS Shield 통합
- AWS WAF (Web Application Firewall) 통합
2. CloudFront Origins (원본)
지원하는 Origin 유형
| Origin 유형 | 설명 | 보안 |
|---|
| S3 Bucket | 파일 배포 및 캐싱, S3 업로드도 가능 | OAC (Origin Access Control) |
| VPC Origin | VPC Private Subnet 내 애플리케이션 | ALB/NLB/EC2 |
| Custom Origin (HTTP) | S3 정적 웹사이트, 모든 퍼블릭 HTTP 백엔드 | - |
S3를 Origin으로 사용 시
┌─── Edge (LA) ───┐
│ │
S3 Bucket ←─────────┼─── Edge (Mumbai)│ ←── Users
(Origin) Private │ │ (전 세계)
↑ AWS ├─── Edge (Melbourne)
│ │ │
OAC └─── Edge (São Paulo)
+
Bucket Policy
- OAC (Origin Access Control) + S3 Bucket Policy로 보안
3. CloudFront vs S3 Cross Region Replication
| 비교 항목 | CloudFront | S3 Cross Region Replication |
|---|
| 네트워크 | Global Edge Network | 리전별 설정 필요 |
| 업데이트 | TTL 기반 캐싱 (예: 1일) | 거의 실시간 |
| 특징 | 캐싱 | 읽기 전용 |
| 용도 | 정적 콘텐츠 (전 세계 배포) | 동적 콘텐츠 (특정 리전 저지연) |
4. CloudFront 캐싱
기본 개념
- 캐시는 각 Edge Location에 존재
- Cache Key로 객체 식별
- Cache Hit 비율 최대화 = Origin 요청 최소화
CreateInvalidation API로 캐시 강제 갱신 가능
동작 흐름
Client → Edge Location → [캐시 확인]
↓
┌─── Cache Hit → 즉시 반환
│
└─── Cache Miss → Origin에서 가져옴 → 캐시 저장 → 반환
↓
TTL 후 만료
5. Cache Key
기본 Cache Key 구성
Cache Key = hostname + resource portion of URL
예: mywebsite.com + /content/stories/example-story.html
Cache Key 확장
- 사용자, 디바이스, 언어, 위치에 따라 콘텐츠가 다른 경우
- Cache Policy로 추가 요소 포함 가능:
- HTTP Headers
- Cookies
- Query Strings
6. Cache Policy (캐시 정책)
캐시 기준 설정
| 요소 | 옵션 |
|---|
| HTTP Headers | None, Whitelist |
| Cookies | None, Whitelist, Include All-Except, All |
| Query Strings | None, Whitelist, Include All-Except, All |
TTL 설정
- 0초 ~ 1년 설정 가능
- Origin에서
Cache-Control, Expires 헤더로도 설정 가능
HTTP Headers 옵션
| 옵션 | 설명 | 캐싱 성능 |
|---|
| None | 기본 헤더만 포함, 헤더 전달 안 함 | 최고 |
| Whitelist | 지정한 헤더만 Cache Key에 포함 + Origin에 전달 | 중간 |
Query Strings 옵션
| 옵션 | 설명 | 캐싱 성능 |
|---|
| None | Query String 무시, 전달 안 함 | 최고 |
| Whitelist | 지정한 것만 포함 + 전달 | 좋음 |
| Include All-Except | 지정한 것 제외하고 포함 + 전달 | 중간 |
| All | 모든 Query String 포함 + 전달 | 최저 |
7. Origin Request Policy
개요
- Cache Key에는 포함하지 않고 Origin 요청에만 포함할 값 지정
- 캐시 중복 방지
포함 가능 항목
- HTTP Headers: None, Whitelist, All viewer headers
- Cookies: None, Whitelist, All
- Query Strings: None, Whitelist, All
Cache Policy vs Origin Request Policy
Client 요청:
GET /content/stories/example-story.html?ref=123abc&split-pages=false
Headers: User-Agent, Authorization, Date, Keep-Alive
Cookie: session_id=12344321
┌─────────────────────────────────────────────────────┐
│ Cache Policy │
│ Cache Key: │
│ - mywebsite.com │
│ - /content/stories/example-story.html │
│ - Header: Authorization │
└─────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ Origin Request Policy │
│ Forward to Origin: │
│ - Headers: User-Agent, Authorization │
│ - Cookies: session_id │
│ - Query Strings: ref │
└─────────────────────────────────────────────────────┘
Origin으로 전달되는 요청:
GET /content/stories/example-story.html?ref=123abc
Headers: User-Agent, Authorization
Cookie: session_id=12344321
8. Cache Invalidation (캐시 무효화)
필요한 상황
- Origin 파일 업데이트 후 TTL 만료 전 캐시 갱신 필요
무효화 방법
CreateInvalidation API 사용
- 전체 무효화:
/*
- 특정 경로:
/images/*, /index.html
동작
S3 Bucket (Origin)
│ 파일 업데이트
↓
CloudFront에 Invalidation 요청
│
↓
┌─────────────────┐ ┌─────────────────┐
│ Edge Location 1 │ │ Edge Location 2 │
│ 캐시 무효화 │ │ 캐시 무효화 │
└─────────────────┘ └─────────────────┘
9. Cache Behaviors (캐시 동작)
개요
- URL 경로 패턴별 다른 설정 적용
- 다른 Origin으로 라우팅 가능
경로 패턴 예시
| 패턴 | Origin | 용도 |
|---|
/images/* | S3 Bucket | 이미지 파일 |
/api/* | ALB | API 요청 |
/* | S3 Bucket | 기본 (항상 마지막 처리) |
로그인 페이지 예시
CloudFront Distribution
│
├─ /login → EC2 (인증 서버) → Signed Cookies 생성
│
└─ /* (default) → S3 Bucket (Signed Cookies 필요)
10. Static vs Dynamic 분리 전략
Cache Hit 최대화 방법
┌─────────────────────────────────────────────────────┐
│ CloudFront CDN Layer │
│ │
│ Static Content │ Dynamic Content │
│ (S3) │ (ALB + EC2) │
│ │ │
│ - 헤더/세션 캐싱 없음 │ - 적절한 헤더/쿠키 캐싱 │
│ - 캐시 히트율 최대화 │ │
└─────────────────────────────────────────────────────┘
11. ALB/EC2를 Origin으로 사용
방법 1: VPC Origins (권장)
- VPC Private Subnet 내 애플리케이션 배포 가능
- 인터넷에 노출 불필요
Users → CloudFront Edge → VPC Origin → Private Subnet
├─ ALB
├─ NLB
└─ EC2
방법 2: Public Network
ALB 사용 시:
Edge Location (Public IP)
↓ Allow Edge Location IPs
ALB (Must be Public)
↓ Allow ALB Security Group
EC2 (Can be Private)
EC2 직접 사용 시:
Edge Location (Public IP)
↓ Allow Edge Location IPs
EC2 (Must be Public)
💡 Edge Location IP 목록:
http://d7uri8nf7uskq.cloudfront.net/tools/list-cloudfront-ips
12. Geo Restriction (지역 제한)
설정 방식
| 방식 | 설명 |
|---|
| Allowlist | 지정 국가에서만 접근 허용 |
| Blocklist | 지정 국가에서 접근 차단 |
특징
- 3rd party Geo-IP 데이터베이스로 국가 판별
- 사용 사례: 저작권법에 따른 콘텐츠 접근 제어
13. Signed URL / Signed Cookies
용도
Signed URL vs Signed Cookies
| 구분 | Signed URL | Signed Cookies |
|---|
| 대상 | 개별 파일 (파일당 1개 URL) | 여러 파일 (1개 쿠키로 다수 파일) |
정책에 포함되는 정보
- URL 만료 시간
- 접근 가능 IP 범위
- Trusted Signers (서명 가능한 AWS 계정)
URL 유효 기간 권장
| 콘텐츠 유형 | 유효 기간 |
|---|
| 공유 콘텐츠 (영화, 음악) | 짧게 (몇 분) |
| 개인 콘텐츠 | 길게 (몇 년까지 가능) |
동작 흐름
1. Client → Application (인증/인가)
2. Application → AWS SDK로 Signed URL 생성
3. Application → Client에 Signed URL 반환
4. Client → CloudFront (Signed URL로 요청)
5. CloudFront → OAC → S3 → 객체 반환
14. CloudFront Signed URL vs S3 Pre-Signed URL
| 비교 항목 | CloudFront Signed URL | S3 Pre-Signed URL |
|---|
| 접근 범위 | 경로 기반 (Origin 무관) | 특정 S3 객체 |
| 키 관리 | 계정 전체 Key Pair (root 관리) | IAM Principal의 키 |
| 필터링 | IP, 경로, 날짜, 만료 | 제한적 |
| 캐싱 | ✅ 활용 가능 | ❌ 직접 S3 접근 |
| 권장 용도 | CloudFront 배포 콘텐츠 | S3 직접 접근 |
15. Signed URL 서명 프로세스
서명자 유형
| 유형 | 설명 | 권장 |
|---|
| Trusted Key Group | API로 키 생성/교체, IAM으로 보안 | ✅ 권장 |
| AWS Account Key Pair | root 계정 + 콘솔로 관리 | ❌ 비권장 |
키 사용 방식
┌─────────────────────────────────────────┐
│ Key Pair 생성 │
│ - Private Key: 애플리케이션 (EC2 등) │
│ - Public Key: CloudFront에 업로드 │
└─────────────────────────────────────────┘
│
↓
┌─────────────────────────────────────────┐
│ Private Key로 URL 서명 (애플리케이션) │
└─────────────────────────────────────────┘
│
↓
┌─────────────────────────────────────────┐
│ Public Key로 URL 검증 (CloudFront) │
└─────────────────────────────────────────┘
16. CloudFront 요금
Price Classes
| Price Class | 설명 | 비용 | 성능 |
|---|
| Price Class All | 모든 리전 | 높음 | 최고 |
| Price Class 200 | 대부분 리전 (고비용 리전 제외) | 중간 | 좋음 |
| Price Class 100 | 최저가 리전만 | 최저 | 제한적 |
비용 절감 방법
- Edge Location 수를 줄여 비용 절감
- Price Class 100/200 선택
17. Multiple Origins (다중 Origin)
경로 패턴별 Origin 라우팅
CloudFront Distribution
│
├─ /api/* → ALB (API 서버)
│
└─ /* → S3 Bucket (정적 파일)
18. Origin Groups (고가용성)
구성
- Primary Origin + Secondary Origin
- Primary 실패 시 Secondary로 자동 전환
동작 흐름
Client → CloudFront → Primary Origin (Origin A)
│
┌─────┴─────┐
│ 정상 응답 │ → 반환
│ │
│ 에러 응답 │ → Secondary Origin (Origin B) 시도
└───────────┘
S3 + CloudFront 리전 레벨 고가용성
Origin Group
├─ Primary: S3 Bucket (us-east-1)
│ ↓ Replication
└─ Secondary: S3 Bucket (eu-west-1)
19. Field Level Encryption
개요
- 민감한 정보를 Edge에서 암호화
- HTTPS에 추가적인 보안 레이어
- 비대칭 암호화 사용
동작 흐름
Client → Edge Location → ALB → Web Server
│ │
Public Key로 Private Key로
암호화 복호화
설정
- POST 요청의 특정 필드 지정 (최대 10개)
- Public Key 지정하여 암호화
20. Real-Time Logs
개요
- CloudFront 요청을 실시간으로 Kinesis Data Streams에 전송
- 콘텐츠 전송 성능 모니터링, 분석, 조치
설정 옵션
- Sampling Rate: 로그를 받을 요청 비율
- 특정 필드 선택
- 특정 Cache Behaviors (경로 패턴) 선택
아키텍처 예시
CloudFront → Kinesis Data Streams → Lambda (실시간 처리)
│
└→ Kinesis Data Firehose → S3/Redshift (저장/분석)
핵심 요약
Cache 최적화 전략
| 전략 | 설명 |
|---|
| Cache Key 최소화 | 불필요한 헤더/쿠키/쿼리 제외 |
| Static/Dynamic 분리 | 정적 콘텐츠는 캐싱, 동적은 별도 처리 |
| 적절한 TTL 설정 | 콘텐츠 특성에 맞게 |
| Cache Behaviors 활용 | 경로별 최적화된 설정 |
Origin 유형별 사용 사례
| Origin | 사용 사례 |
|---|
| S3 Bucket | 정적 웹사이트, 이미지, 미디어 |
| VPC Origin (ALB/EC2) | Private Subnet 앱, API |
| Custom HTTP | 기존 HTTP 서버, S3 정적 웹사이트 |
보안 기능 요약
| 기능 | 용도 |
|---|
| OAC | S3 Origin 보안 |
| Geo Restriction | 국가별 접근 제어 |
| Signed URL/Cookies | 프리미엄 콘텐츠 보호 |
| Field Level Encryption | 민감 필드 암호화 |