CDN
CDN이 가까운 엣지에서 콘텐츠를 캐시해 지연과 원본 부하를 줄이는 원리와 캐시 무효화 전략을 이해합니다.
지금까지 네트워크의 계층별 동작 원리와 프로토콜을 살펴보았습니다.
이제 실제 서비스를 운영할 때 필수적인 네트워크 인프라 구성 요소를 다루겠습니다.
첫 번째는 CDN(Content Delivery Network)입니다.
왜 CDN이 필요한가
서울에 있는 서버에서 브라질 사용자에게 웹 페이지를 보낸다고 합시다.
광섬유 안의 빛은 진공보다 느리고 실제 해저 케이블 경로도 직선이 아니므로, 서울과 상파울루 사이의 왕복 지연은 물리적 하한만으로도 매우 큽니다.
실제 왕복 시간에는 라우팅·장비 처리·혼잡도 더해집니다. 지명만으로 고정 지연을 정할 수 없으므로 서비스 경로에서 측정해야 합니다.
CDN은 전 세계에 분산된 엣지 서버에 콘텐츠의 복사본을 캐시하고, 사용자에게 네트워크상 가까운 엣지에서 응답합니다.
이 “가까움”은 단순한 지도상의 거리뿐 아니라 DNS 응답, Anycast 라우팅, ISP 피어링, 엣지의 부하 상태에 따라 결정됩니다.
CDN의 동작 원리
공유 캐시의 기본 분기는 아래와 같습니다. 캐시 키·Vary가 맞는지, 요청과 응답 지시문이 재사용을 허용하는지까지 판단하며 stale 확장 정책은 별도로 적용합니다.
공유 캐시가 저장된 응답을 재사용하는 분기
캐시 키와 Vary가 맞는 저장 응답을 찾습니다. 304의 메타데이터를 반영하고 저장 본문을 사용합니다. 각 단계의 값과 전환 이유를 비교합니다.
CDN · 공유 캐시 판단
저장본이 있어도, 즉시 재사용할 수 있는지 판단합니다
캐시 키·Vary가 맞는 저장 응답과 신선도·지시문을 확인합니다. no-cache는 재검증을 요구하며, 저장본이 없으면 가져옵니다. stale 확장 정책은 아래 기본 분기에서 제외합니다.
청록색 예 경로는 저장본의 즉시 재사용입니다. 아니요는 상위 캐시 또는 원본에서 재검증·가져오기를 진행합니다. 재검증의 304·새 응답·오류 분기는 이 기본 그림에서 생략했습니다.
이 예의 조건
- 본문과 전체 도표의 예를 따라 저장본 조회부터 본문 재사용까지 진행합니다.
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 저장본 조회 캐시 키와 Vary가 맞는 저장 응답을 찾습니다. |
|
|
| 재사용 판단 신선한 응답에도 no-cache 지시를 적용합니다. |
|
|
| 조건부 검증 저장 ETag로 상위 캐시나 원본에 검증합니다. |
|
|
| 본문 재사용 304의 메타데이터를 반영하고 저장 본문을 사용합니다. |
|
|
공유 캐시가 저장된 응답을 재사용하는 분기
캐시 키와 Vary가 맞는 저장 응답을 찾습니다. 304의 메타데이터를 반영하고 저장 본문을 사용합니다. 각 단계의 값과 전환 이유를 비교합니다.
CDN · 공유 캐시 판단
저장본이 있어도, 즉시 재사용할 수 있는지 판단합니다
캐시 키·Vary가 맞는 저장 응답과 신선도·지시문을 확인합니다. no-cache는 재검증을 요구하며, 저장본이 없으면 가져옵니다. stale 확장 정책은 아래 기본 분기에서 제외합니다.
청록색 예 경로는 저장본의 즉시 재사용입니다. 아니요는 상위 캐시 또는 원본에서 재검증·가져오기를 진행합니다. 재검증의 304·새 응답·오류 분기는 이 기본 그림에서 생략했습니다.
이 예의 조건
- 본문과 전체 도표의 예를 따라 저장본 조회부터 본문 재사용까지 진행합니다.
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 저장본 조회 캐시 키와 Vary가 맞는 저장 응답을 찾습니다. |
|
|
| 재사용 판단 신선한 응답에도 no-cache 지시를 적용합니다. |
|
|
| 조건부 검증 저장 ETag로 상위 캐시나 원본에 검증합니다. |
|
|
| 본문 재사용 304의 메타데이터를 반영하고 저장 본문을 사용합니다. |
|
|
캐시의 유효 기간은 HTTP의 Cache-Control 헤더로 제어합니다.
s-maxage는 공유 캐시에만 적용되는 신선도 수명이며 그 캐시에서 max-age보다 우선합니다. no-cache는 저장 금지가 아니라 재사용 전 성공적인 검증이 필요하다는 뜻입니다. 상위 캐시가 검증에 응답할 수도 있어 항상 원본 서버까지 도달하는 것은 아닙니다.
Cache-Control: max-age=86400 → 신선도 수명 24시간
Cache-Control: s-maxage=3600 → 공유 캐시의 신선도 수명 1시간
Cache-Control: no-cache → 재사용 전에 검증 필요
Cache-Control: no-store → 저장 금지
Cache-Control: stale-while-revalidate=60 → 신선도 만료 후 60초 동안
재검증 중 낡은 응답 사용 허용max-age는 저장을 강제하거나 수신 시점부터 그 시간만큼 항상 신선하다는 뜻이 아닙니다. 응답의 나이(Age)와 다른 지시문도 적용됩니다. 개인화 응답은 private·no-store와 캐시 키를 함께 설계해야 합니다.
예시: 같은 응답의 공유 캐시와 브라우저 수명
응답에 max-age=86400, s-maxage=3600이 있고, 캐시가 계산한 현재 나이(current_age)가 2,400초라고 합시다. 저장은 허용되어 있고 캐시 키·Vary도 맞으며 다른 재검증 지시문은 없습니다. 공유 캐시는 s-maxage를 택하므로 남은 신선도는 3,600 − 2,400 = 1,200초입니다. 브라우저의 개인 캐시는 s-maxage를 적용하지 않아 86,400 − 2,400 = 84,000초입니다. 두 캐시가 같은 응답을 가지고도 재검증 시점이 다른 이유입니다. 여기의 현재 나이는 응답 헤더와 전송·보관 시간을 반영해 이미 계산된 값이며, 수신한 Age 숫자만 무조건 빼는 실험은 아닙니다.
재검증을 독립 판단하기
같은 URL과 Vary에 맞는 저장 응답이 있고 현재 나이는 1,200초입니다. 응답에 max-age=3600, no-cache가 함께 있다면 지금 저장 본문을 바로 사용할 수 있을까요? 원래 응답의 강한 ETag를 조건으로 보냈고, 그 태그와 맞는 304 응답을 받았을 때의 행동도 설명해 보세요.
수명과 재사용 허가를 나누는 풀이
수명 계산상으로는 신선하지만, 인자 없는 no-cache가 재사용 전 성공적인 검증을 요구하므로 곧바로 사용할 수 없습니다. 해당 저장 응답을 검증하는 304를 받으면 필요한 헤더를 갱신하고 저장된 본문을 재사용합니다. 304가 새 본문을 전부 내려준다는 뜻은 아닙니다. no-store로 저장 자체를 금지하는 경우와도 구분합니다. 이 조건과 수명 계산은 RFC 9111의 신선도·검증·응답 지시문에 근거합니다.
캐시 무효화 전략
코드를 배포했을 때 CDN 캐시가 갱신되지 않으면, 사용자는 여전히 이전 버전을 받습니다.
| 전략 | 효과와 조건 |
|---|---|
| 파일명 해싱 | main.abc123.js처럼 내용별 URL을 바꿉니다. 빌드 자동화와 함께 HTML의 참조도 새 URL로 갱신해야 합니다. |
| 퍼지 | API로 캐시를 무효화합니다. 삭제 범위·전파 시간·성공 확인 방식은 CDN마다 다릅니다. |
| 캐시 태그 | 관련 응답을 묶어 무효화합니다. 지원 기능과 태그 설계가 필요합니다. |
| 짧은 TTL | 신선도 수명을 줄입니다. 만료가 자동 다운로드를 뜻하지는 않으며 다음 요청 시 재검증·가져오기가 발생합니다. |
| 버전 쿼리 | ?v=2로 URL을 구분합니다. 쿼리 항목이 CDN 캐시 키에 포함되는지 확인해야 합니다. |
대표 CDN 서비스
아래는 제품군을 구분하는 예시입니다. 플랜·무료 한도와 제공 기능은 시점 및 계약에 따라 달라지므로 적용 시 각 서비스의 현재 조건을 확인해야 합니다. Cloudflare, CloudFront, Fastly, Vercel, Netlify의 플랜은 서로 같은 무료 사용 범위를 뜻하지 않습니다.
서비스 특징 진입 방식 용도
──────────────────────────────────────────────────────────────────────────
Cloudflare CDN+DDoS+WAF+DNS 통합 무료/유료 플랜 범용
AWS CloudFront AWS 생태계 통합 무료 플랜+유료 플랜 AWS 서비스
Akamai 대형 글로벌 CDN 엔터프라이즈 중심 대기업
Fastly 실시간 퍼지, Edge 무료 한도+사용량/계약 API/동적
Vercel/Netlify 프론트엔드 배포 통합 무료 플랜+사용량 제한 정적 사이트CDN은 정적 파일에만 유용한 것이 아닙니다.
API 응답 캐싱, 엣지에서의 요청 조작(Edge Functions), 이미지 최적화(리사이징, 포맷 변환) 등 점점 더 많은 로직이 엣지로 이동하고 있습니다.
캐시 적중률만 높이는 대신 원본 요청 수, Age와 제공 버전, 퍼지 전파를 함께 봅니다. 갑작스러운 미스가 원본에 몰릴 때는 요청 병합이나 origin shield의 적용 범위도 확인합니다.
다음 절에서는 트래픽을 여러 서버로 분배하는 로드 밸런서를 다루겠습니다.