CDN(Content Delivery Network)는 지리적 제약 없이 전세계 사용자에게 빠르고 안전하게 컨텐츠를 전송할 수 있는 컨텐츠 전송 기술을 의미한다.
CDN은 서버와 사용자 사이의 물리적인 거리를 줄여 컨텐츠 로딩에 소요되는 시간을 최소화한다.
각 지역에 캐시 서버(PoP, Points of Presence)를 분산 배치해 근접한 사용자의 요청에 원본서버가 아닌 캐시서버가 컨텐츠를 전달한다.
CDN은 분산된 서버 네트워크를 사용해 사용자들에게 리소스를 제공함으로써 사이트 성능을 향상시킨다.
CDN은 서버 부하(서버 로드)를 줄이고, 이에따라 서버 비용이 절감되고, 트래픽 급증(traffic spikes)처리에 적합하다.
CDN의 성능 이점은 다음의 원칙에 의해 이루어진다.
인터넷을 통해 비즈니스를 운영하거나 웹 사이트에서 그래픽 이미지, 동양상 파일등의 컨텐츠를 제공한다면 CDN 서비스를 이용할 필요가 있다.
CDN은 아래와 같은 곳에서 사용한다.
하지만 특정 국가나 지역만을 타겟으로 하는 웹서비스를 운영한다면 CDN 서비스를 활용할 필요가없다.
이 경우 CDN을 이용하면 오히려 불필요한 연결지점이 늘어나 웹 사이트의 성능저하를 불러올 수 있기 때문이다.
CDN을 사용하여 origin server에서 리소스를 제공할 때 사용자와 사용자 근처에 있는 CDN 서버간에 새로운 연결이 만들어진다.
CDN과 origin server 간의 데이터 전송은 CDN의 네트워크에 발생한다.
이를 통해
일부 CDN은 인터넷에 분산된 여러 CDN 서버들을 통해 트래픽을 origin server로 라우팅함으로서 향상시킨다.
여러 CDN끼리의 연결은 Border Gateway Protocol(BGP)보다 안정적이고, 잘 최적화된 경로를 통해 발생한다.
BGP는 인터넷 라우팅 프로토콜이지만 성능 지향적이 아니다. 이에따라 BGP가 결정한 경로는 CDN 서버간에 최적화 경로보다 성능이 떨어질 수 있다.
CDN server에 리소스를 캐싱하면 리소스를 제공받기 위해 origin server까지 요청을 할 필요가 없다. 이런 이유로 리소스를 더 빠르게 제공받을 수 있다.
가장 일반적인 방법은 필요한 리소스를 CDN server에서 pull 리소스 하는 것이다. 이것은 origin pull이라고 한다.
특정 리소스를 캐시 CDN에서 처음 요청하면 CDN은 origin server에 요청하고 응답받은걸 캐시한다.
이런 방식으로 캐시되지 않은 리소스들이 캐시된다.
CDN은 캐시제거를 사용해 캐시에서 필요하지 않는 리소스들을 제거하는 방식을 사용한다.(Cache eviction)
사이트 오너는 명시적으로 캐시에 있는 리소스를 제거할 수 있다.
캐시는 한정된 저장용량을 가지고 있다. 저장 용량을 모두 채우게 되면 최근에 접근하지 않은 리소스들을 제거하거나 용량이 큰 리소스들을 제거한다.
하나의 CDN 서버에서 제거된 리소스가 전체 CDN에서 제거되었음을 의미하지는 않는다.
(여러 개의 CDN서버 중 1개의 CDN서버에서 제거되는 경우)
Purging은 Cache eviction처럼 기다리는 것이 아닌 바로 제거하는 매커니즘이다.
CDN 서버에서 캐시된 리소스를 즉각 삭제를 지원하는 경우 동적인 컨텐츠를 관리하는데 용이하다.
이 방식을 사용해 언제 업데이트 되는지 모르는 동적인 리소스의 캐싱 기간을 최대한 길게 유지할 수 있다.
이 기법을 hold-till-told-caching이라고 한다.
규모에 따라 퍼징을 사용할 때 cache tags, 삭제 캐시 키(surrogate cache keys)라는 개념을 사용한다.
이 매커니즘은 하나의 리소스에 식발자(tag)를 연결한 후 태그를 사용해 세분화된 삭제를 할 수 있따.
예를 들어 사이트 하단 footer가 포함된 /about, /blog
리소스에 footer
라는 태그를 추가한다.
사이트 하단 footer가 update되면 footer
태그를 가진 CDN에 있는 모든 리소스를 Purging한다.
리소스를 캐싱하는 방법은 공용(public), 개인(private), 정적(static), 동적(dynamic)에 따라 달라진다.
공용 리소스(Public Resources)
공용 리소스는 개인정보를 포함하고 있지 않으므로 CDN에 캐시할 수 있다. 헤더(header)에 Cache-Control: no-store
, Cache-Control: private
이 없으면 캐시 가능하다.
개인 리소스(Private Resources)
개인 리소스는 개인정보를 포함하고 있으므로 CDN에 캐시되면 안된다.
개인 리소스는 헤더(header)에 Cache-Control: private
로 표시된다.
정적 컨텐츠(Static content)
정적 컨턴체는 자주 변경되지 않는 이미지, 비디오, 라이브러리 등 리소스 유형이다.
static contetn는 변경되지 않으므로 6개월 또는 1년 등 긴 TTL(Time to Live)로 캐시해야 한다.
동적 컨텐츠(Dynamic content)
동적 컨텐츠는 APi 응답, 쇼핑몰 같은 리소스의 유형이다. 이런 리소스가 자주변경된다고 캐싱이 되지 않는 것은 아니다.
예를 들어, 트래픽이 몰리는 시간, 매우 짧은 시간(예를 들어 5초정도)동안 캐싱하면 데이터 갱신 영향을 최소화하면서 origin server에 부하를 줄일 수 있다.
https://library.gabia.com/contents/infrahosting/8985/
https://hasudoki.tistory.com/entry/CDNContents-Delivery-Network-%EA%B0%9C%EB%85%90-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0%EC%9B%B9-%EC%B5%9C%EC%A0%81%ED%99%94