☁️ 클라우드

CDN

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)을 추적하세요.

🔗 관련 용어

📚 더 배우기