[AWS] CloudFront 바르게 이해하기
들어가며
정적 웹사이트를 운영하다 보면 다음과 같은 문제를 마주하게 됩니다:
- 전 세계 사용자에게 빠른 콘텐츠 전송이 필요함
- S3에서 직접 파일을 제공하면 비용이 높아짐
- 보안을 위해 S3 버킷을 공개하지 않고 싶음
- 이미지나 동영상 같은 대용량 파일의 로딩 속도가 느림
이런 문제들을 해결하기 위해 Amazon CloudFront를 사용할 수 있습니다. CloudFront는 AWS의 콘텐츠 전송 네트워크(CDN) 서비스로, 전 세계 엣지 로케이션을 통해 사용자에게 콘텐츠를 빠르고 안전하게 전달합니다1. 이 글에서는 CloudFront를 올바르게 설정하고 활용하는 방법을 알아봅니다.
CloudFront란?
기본 개념
Amazon CloudFront는 전 세계에 분산된 엣지 로케이션(Edge Location)을 통해 콘텐츠를 캐싱하고 전송하는 CDN 서비스입니다. 사용자가 콘텐츠를 요청하면 가장 가까운 엣지 로케이션에서 응답하므로 지연 시간을 최소화할 수 있습니다.
CloudFront의 전 세계 인프라 구조: S3 오리진에서 시작하여 전 세계 엣지 로케이션과 Regional 엣지 캐시를 통해 사용자에게 콘텐츠를 전달하는 구조를 보여줍니다.

CloudFront의 주요 특징
- 전 세계 엣지 로케이션: 400개 이상의 엣지 로케이션을 통해 낮은 지연 시간 제공
- 다양한 오리진 지원: S3, ALB, EC2, Lambda, 커스텀 오리진 등
- 보안 강화: AWS WAF, AWS Shield와 통합하여 DDoS 공격 방어
- 비용 효율성: S3에서 직접 전송하는 것보다 저렴한 데이터 전송 비용
- HTTPS 지원: SSL/TLS 인증서를 통한 보안 연결
CloudFront 동작 방식
사용자 요청 → 가장 가까운 엣지 로케이션
↓
캐시에 콘텐츠가 있는가?
├─ Yes → 엣지에서 즉시 응답 (캐시 히트)
└─ No → 오리진(S3 등)에서 콘텐츠 가져오기 → 캐시 저장 → 사용자에게 응답
S3와 CloudFront 함께 사용하기
왜 S3만으로는 부족한가?
S3에서 직접 파일을 제공하는 것도 가능하지만, 다음과 같은 한계가 있습니다:
- 비용: S3에서 인터넷으로 직접 전송하는 비용이 높음
- 성능: 사용자 위치에 따라 지연 시간이 길어질 수 있음
- 보안: 버킷을 공개해야 하므로 보안 위험 증가
- 확장성: 트래픽이 급증하면 S3에 부하가 집중됨
S3만 사용할 때의 문제점: 전 세계 사용자들이 모두 한 지역의 S3 오리진으로 직접 요청을 보내면서 트래픽이 집중되고, 지리적으로 먼 사용자는 높은 지연 시간을 경험하게 됩니다.

CloudFront를 사용하면?
CloudFront를 S3 앞에 배치하면 다음과 같은 이점을 얻을 수 있습니다:
- 비용 절감: CloudFront에서 전송하는 데이터는 S3에서 전송하는 것보다 저렴
- 성능 향상: 엣지 로케이션에서 캐싱하여 응답 속도 향상
- 보안 강화: OAC를 통해 S3 버킷을 비공개로 유지하면서 CloudFront를 통해서만 접근 가능
- 부하 분산: 엣지 로케이션에 트래픽이 분산되어 오리진 부하 감소
CloudFront 배포 생성하기
1. 기본 배포 설정
AWS 콘솔에서 CloudFront 배포를 생성할 때 다음 설정을 고려해야 합니다:
오리진 설정
Origin Domain: your-bucket.s3.amazonaws.com
Origin Path: (선택사항) 특정 경로만 사용하는 경우
Origin Access: Origin Access Control (OAC) 권장
캐시 동작 설정
Viewer Protocol Policy: Redirect HTTP to HTTPS (권장)
Allowed HTTP Methods: GET, HEAD, OPTIONS (정적 콘텐츠의 경우)
Cache Policy: CachingOptimized (정적 콘텐츠)
2. Origin Access Control (OAC) 설정
OAC(Origin Access Control)는 CloudFront를 통해서만 S3 버킷에 접근할 수 있도록 하는 보안 기능입니다2. 이전의 OAI(Origin Access Identity)를 대체하는 최신 방법입니다.
OAC의 장점
- 세분화된 정책: 더 유연한 IAM 정책 구성 가능
- POST 메서드 지원: OAI에서는 불가능했던 POST 요청 지원
- AWS Signature Version 4: 더 안전한 인증 방식
- SSE-KMS 지원: 서버 측 암호화(SSE-KMS) 사용 가능
OAC 설정 방법
1단계: OAC 생성
AWS 콘솔에서 CloudFront → Origin Access Control → Create control setting:
Name: s3-oac
Description: OAC for S3 bucket access
Signing behavior: Sign requests (recommended)
Signing protocol: SigV4
Origin type: S3
2단계: S3 버킷 정책 설정
OAC를 생성하면 ARN이 생성됩니다. 이를 사용하여 S3 버킷 정책을 설정합니다:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCloudFrontServicePrincipal",
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::your-bucket/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID"
}
}
}
]
}
3단계: CloudFront 배포에 OAC 연결
CloudFront 배포의 오리진 설정에서 생성한 OAC를 선택합니다.
OAC vs OAI 비교
| 특징 | OAI (구버전) | OAC (신버전) |
|---|---|---|
| POST 메서드 | ❌ 지원 안 함 | ✅ 지원 |
| SSE-KMS | ❌ 지원 안 함 | ✅ 지원 |
| 정책 유연성 | 제한적 | 높음 |
| SigV4 | ❌ | ✅ |
| 권장 여부 | ❌ 구버전 | ✅ 권장 |
3. S3 버킷 정책 설정
OAC를 사용할 때는 S3 버킷을 비공개(Private)로 유지하고, CloudFront를 통해서만 접근할 수 있도록 설정합니다.
❌ 잘못된 설정: 버킷을 공개로 설정
// S3 버킷 정책 - 공개 접근 허용 (보안 위험)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::your-bucket/*"
}
]
}
✅ 올바른 설정: OAC를 통한 접근만 허용
// S3 버킷 정책 - CloudFront OAC만 허용
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCloudFrontOAC",
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::your-bucket/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::123456789012:distribution/E1234567890ABC"
}
}
}
]
}
CloudFront 캐싱 전략
캐시 정책 선택
CloudFront는 다양한 캐시 정책을 제공합니다:
1. CachingOptimized (정적 콘텐츠)
정적 파일(이미지, CSS, JS 등)에 적합:
Cache-Control 헤더: 존중
TTL: 최대 1년
쿼리 문자열: 무시
2. CachingDisabled (동적 콘텐츠)
동적 콘텐츠나 API 응답에 적합:
캐싱: 비활성화
모든 요청을 오리진으로 전달
3. Elemental-MediaPackage (비디오 스트리밍)
비디오 스트리밍에 최적화:
비디오 세그먼트 캐싱
부분 콘텐츠 요청 지원
커스텀 캐시 정책 생성
특정 요구사항이 있다면 커스텀 캐시 정책을 생성할 수 있습니다:
Minimum TTL: 0 (초)
Maximum TTL: 31536000 (1년)
Default TTL: 86400 (1일)
쿼리 문자열: 지정된 쿼리 문자열만 포함
헤더: 특정 헤더를 캐시 키에 포함
캐시 무효화 (Invalidation)
콘텐츠를 업데이트했을 때 캐시를 즉시 갱신하려면 무효화를 사용합니다:
# AWS CLI를 사용한 캐시 무효화
aws cloudfront create-invalidation \
--distribution-id E1234567890ABC \
--paths "/*" "/images/*"
주의: 무효화는 비용이 발생할 수 있으므로 필요한 경로만 지정하는 것이 좋습니다.
/*는 모든 캐시를 무효화하므로 신중하게 사용해야 합니다.
성능 최적화
1. 압축 활성화
CloudFront는 자동으로 콘텐츠를 압축하여 전송합니다:
Compress Objects Automatically: Yes
지원 형식: text/html, text/css, application/javascript, application/json 등
2. HTTP/2 및 HTTP/3 지원
최신 프로토콜을 사용하여 성능 향상:
HTTP Version: HTTP/2, HTTP/3
자동으로 최신 프로토콜 사용
3. 지리적 제한 (Geo Restriction)
특정 국가에서만 접근을 허용하거나 차단:
Restriction Type:
- Whitelist: 허용 목록
- Blacklist: 차단 목록
보안 강화
1. AWS WAF 통합
AWS WAF(Web Application Firewall)는 웹 애플리케이션을 보호하는 방화벽 서비스로, CloudFront와 통합하여 웹 공격을 방어할 수 있습니다3.
CloudFront와 AWS WAF를 통합하여 웹 공격을 방어:
보호 기능:
- SQL Injection 방어
- XSS 방어
- Rate Limiting
- IP 화이트리스트/블랙리스트
2. AWS Shield
DDoS 공격으로부터 자동 보호:
AWS Shield Standard: 모든 CloudFront 배포에 자동 적용
AWS Shield Advanced: 추가 보호 및 비용 보호
3. 사용자 지정 도메인 및 SSL/TLS
자체 도메인을 사용하고 SSL 인증서를 적용:
Custom Domain: www.example.com
SSL Certificate: ACM(AWS Certificate Manager)에서 발급
Minimum Protocol Version: TLSv1.2_2021 (권장)
실전 활용 시나리오
시나리오 1: 정적 웹사이트 호스팅
S3 + CloudFront를 사용하여 정적 웹사이트를 호스팅:
구성:
- S3 버킷: 웹사이트 파일 저장
- CloudFront: CDN으로 콘텐츠 전송
- OAC: S3 버킷 보호
- Route 53: 도메인 연결 (선택사항)
장점:
- 서버 관리 불필요
- 전 세계 빠른 접근
- 비용 효율적
시나리오 2: 이미지/동영상 CDN
대용량 미디어 파일을 CloudFront로 제공:
구성:
- S3: 원본 파일 저장
- CloudFront: 캐싱 및 전송
- CloudFront Functions: 이미지 최적화 (선택사항)
최적화:
- 적절한 캐시 TTL 설정
- 압축 활성화
- HTTP/2, HTTP/3 사용
시나리오 3: API 가속화
ALB나 API Gateway 앞에 CloudFront를 배치:
구성:
- CloudFront: 엣지 캐싱
- ALB/API Gateway: 백엔드 API
- 캐시 정책: CachingDisabled 또는 짧은 TTL
장점:
- 엣지에서 정적 응답 캐싱
- 동적 요청은 오리진으로 전달
- 지연 시간 감소
비용 최적화
CloudFront vs S3 직접 전송 비용 비교
CloudFront를 사용하면 데이터 전송 비용을 절감할 수 있습니다:
예시 (한국 리전 기준):
- S3 → 인터넷: $0.12/GB
- CloudFront → 인터넷: $0.12/GB (첫 10TB, 아시아 태평양 지역)
추가 이점:
- S3 → CloudFront 전송: 무료
- 캐싱으로 실제 전송량 감소
- 한국 사용자에게 더 빠른 응답 속도 제공
비용 절감 팁
- 적절한 캐시 TTL 설정: 자주 변경되지 않는 콘텐츠는 긴 TTL 설정
- 압축 활성화: 전송 데이터량 감소
- 지역별 가격 고려: 일부 지역은 더 저렴한 요금 적용
- 캐시 히트율 모니터링: CloudWatch를 통해 캐시 효율 확인
마무리
CloudFront를 올바르게 사용하면:
- 성능 향상: 엣지 캐싱으로 전 세계 사용자에게 빠른 콘텐츠 전달
- 비용 절감: S3 직접 전송보다 저렴한 데이터 전송 비용
- 보안 강화: OAC를 통한 S3 버킷 보호 및 HTTPS 강제
- 확장성: 급증하는 트래픽에 자동으로 대응
S3와 CloudFront를 함께 사용하면 서버 관리 없이 전 세계 사용자에게 빠르고 안전하게 콘텐츠를 제공할 수 있으며, 비용 효율적인 정적 웹사이트 호스팅 솔루션을 구축할 수 있습니다.
참고 자료:
-
AWS 공식 문서: Amazon CloudFront - CloudFront 서비스 개요 및 기능 ↩
-
AWS 블로그: CloudFront Origin Access Control (OAC) 소개 - OAC 설정 방법 및 OAI와의 차이점 ↩
-
AWS 공식 문서: AWS WAF - AWS WAF 서비스 개요 및 기능 ↩
댓글남기기