CDN
Content Delivery Network
콘텐츠를 전 세계 엣지 서버에 캐싱. 지연 시간 감소. CloudFront, Cloudflare.
Content Delivery Network
콘텐츠를 전 세계 엣지 서버에 캐싱. 지연 시간 감소. CloudFront, Cloudflare.
CDN(Content Delivery Network)은 전 세계에 분산된 엣지 서버 네트워크를 통해 콘텐츠를 사용자와 가까운 위치에서 제공하는 기술입니다. 원본 서버(Origin)에서 콘텐츠를 가져와 엣지 서버에 캐싱하고, 사용자 요청 시 가장 가까운 엣지에서 응답함으로써 지연 시간(Latency)을 획기적으로 줄입니다.
CDN의 핵심 원리는 캐싱(Caching)과 지리적 분산입니다. 이미지, CSS, JavaScript, 비디오 같은 정적 콘텐츠는 TTL(Time To Live) 동안 엣지에 저장되어 반복 요청 시 원본 서버에 부하를 주지 않습니다. 대형 CDN 제공자들은 전 세계 200개 이상의 PoP(Point of Presence)를 운영합니다.
현대 CDN은 단순 캐싱을 넘어 DDoS 방어, WAF(Web Application Firewall), 이미지 최적화, 비디오 스트리밍, 엣지 컴퓨팅 기능까지 제공합니다. Cloudflare Workers, AWS Lambda@Edge 같은 서비스로 엣지에서 코드를 실행할 수도 있습니다.
주요 CDN 제공자로는 Cloudflare(무료 플랜 제공, 전 세계 310+ PoP), AWS CloudFront(AWS 서비스 연동), Akamai(엔터프라이즈 시장 1위), Fastly(실시간 퍼지, 개발자 친화적) 등이 있습니다. 한국에서는 SK Broadband, KT 등 국내 CDN도 선택지입니다.
# AWS CloudFront CDK 설정
import * as cloudfront from 'aws-cdk-lib/aws-cloudfront';
import * as origins from 'aws-cdk-lib/aws-cloudfront-origins';
import * as s3 from 'aws-cdk-lib/aws-s3';
// S3 버킷 생성
const bucket = new s3.Bucket(this, 'WebsiteBucket', {
websiteIndexDocument: 'index.html',
});
// CloudFront 배포 생성
const distribution = new cloudfront.Distribution(this, 'CDN', {
defaultBehavior: {
origin: new origins.S3Origin(bucket),
viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
cachePolicy: cloudfront.CachePolicy.CACHING_OPTIMIZED,
compress: true,
},
// 커스텀 캐시 정책
additionalBehaviors: {
'/api/*': {
origin: new origins.HttpOrigin('api.example.com'),
cachePolicy: cloudfront.CachePolicy.CACHING_DISABLED,
originRequestPolicy: cloudfront.OriginRequestPolicy.ALL_VIEWER,
},
'/static/*': {
origin: new origins.S3Origin(bucket),
cachePolicy: new cloudfront.CachePolicy(this, 'StaticCache', {
maxTtl: Duration.days(365),
defaultTtl: Duration.days(30),
minTtl: Duration.hours(1),
}),
},
},
// 지역 제한 (한국, 일본, 미국만 허용)
geoRestriction: cloudfront.GeoRestriction.allowlist('KR', 'JP', 'US'),
// 커스텀 도메인
domainNames: ['cdn.example.com'],
certificate: myCertificate,
});
"TTFB가 2초인데 CDN 붙이면 200ms 이하로 줄일 수 있습니다. 정적 에셋은 CloudFront로 서빙하고, 이미지는 WebP 자동 변환 활성화하면 대역폭도 40% 정도 절감됩니다. 글로벌 서비스면 Cloudflare도 고려해볼 만해요, 무료 플랜도 꽤 괜찮습니다."
"CDN 캐시 전략을 설계한 경험이 있습니다. 정적 파일은 해시된 파일명으로 immutable 캐시를 걸고, HTML은 stale-while-revalidate로 빠른 응답과 최신성을 둘 다 확보했어요. 캐시 무효화는 파일명 변경 방식으로 즉시 반영되게 했고, 긴급 시 CloudFront Invalidation API로 수동 퍼지도 구현했습니다."
"배포 후 CSS가 깨졌다는 리포트가 들어오네요. CDN 캐시 문제 같습니다. 빌드 시 파일명에 해시를 안 붙여서 브라우저가 옛날 CSS를 캐시하고 있어요. 일단 CloudFront에서 /*.css 패턴으로 Invalidation 실행하고, CI/CD에서 해시 파일명 적용하는 게 근본 해결책입니다."
사용자별 개인정보나 인증 토큰이 포함된 응답을 CDN에 캐싱하면 다른 사용자에게 노출됩니다. API 응답이나 동적 콘텐츠는 Cache-Control: private 또는 no-store를 명시하세요.
max-age=31536000(1년)으로 설정했는데 파일명 해시가 없으면, 업데이트 후에도 사용자가 오래된 파일을 계속 받습니다. CloudFront Invalidation은 비용이 발생하고(월 1000건 무료) 전파에 시간이 걸립니다.
정적 에셋은 content-hash 파일명(main.a1b2c3d4.js)으로 immutable 캐시, HTML은 no-cache 또는 짧은 TTL로 설정하세요. Cache-Control 응답 헤더를 원본 서버에서 정확히 설정하고, CDN 모니터링으로 캐시 적중률(CHR)을 추적하세요.