CDN(Content Delivery Network)은 세계 곳곳에 둔 서버(엣지, edge)들이 원본 서버(오리진, origin)의 응답을 복사해 두었다가 사용자와 가까운 곳에서 대신 내주는 네트워크다. 물리적 거리가 줄어 응답이 빨라지고, 오리진으로 가는 요청이 줄어 서버 부담도 줄어든다.
동작
사용자 → 가까운 엣지
캐시 있음(HIT) → 엣지가 바로 응답
캐시 없음(MISS) → 엣지가 오리진에 요청 → 받아서 저장하고 응답- 사용자를 가까운 엣지로 보내는 일은 보통 DNS와 CNAME 응답이나 애니캐스트(Anycast) 라우팅이 맡는다
- 엣지가 무엇을 얼마나 저장할지는 오리진이 응답에 붙이는
Cache-Control헤더로 정한다.s-maxage는 CDN 같은 공유 캐시에만 적용되는 수명이고,private이면 공유 캐시는 저장하지 않는다(public은 원래라면 저장되지 않을 응답도 저장해도 된다는 표시다) → 브라우저 캐시 - 배포 뒤 옛 파일이 남으면 퍼지(purge, 캐시 무효화)를 하거나, 처음부터 파일 이름에 해시를 넣어 무효화가 필요 없게 만든다
무엇을 올리나
- 해시가 붙은 JS·CSS, 이미지, 폰트, 동영상 같은 정적 파일이 기본이다. 정적 파일만 앱 서버에서 떼어 CDN으로 보내는 구성은 버전 스큐와 정적 자산 오프로드에 있다
- 빌드 때 만들어 둔 HTML(SSG)도 그대로 CDN에서 응답할 수 있다 → CSR·SSR·SSG·ISR
- 요즘 CDN은 캐시 외에 TLS 종료(HTTP와 HTTPS), DDoS(Distributed Denial of Service) 방어, 이미지 변환, 엣지에서 코드 실행까지 맡는 경우가 많다
주의
- 사용자마다 다른 응답(로그인 정보가 담긴 HTML 등)을 공유 캐시에 넣으면 남의 화면이 보이는 사고가 난다. 개인화 응답은
private이나no-store로 둔다 - 같은 URL이라도 헤더에 따라 응답이 달라지면
Vary헤더로 알려 줘야 캐시가 섞이지 않는다
명세: RFC 9111 §5.2.2.10 — s-maxage · RFC 9111 §5.2.2.7 — private · RFC 9111 §4.1 — Vary 출처: MDN — CDN · MDN — HTTP caching