CDN은 Content Delivery Network의 약자로, 컨텐츠(웹페이지나 이미지, 동영상 등) 전송 네트워크를 의미한다.
CDN 없이도 온라인 서비스들이 동작은 하지만 많은 서비스들이 CDN을 사용하는데는 이유가 있다.
해당 컨텐츠를 제공하는 서버가 사용자 기준에서 원격지에 위치해 있다면, 컨텐츠의 다운로드 시간이 오래 걸리는 문제가 발생할 수 있다.
규모가 큰 사이트의 경우에는 세계 각국의 무수한 사용자가 해당 서버로 몰리게 되고, 수많은 요청을 감당해야한다는 어려움이있다.
CDN은 이러한 문제를 해결하기 위한 기술이다. CDN은 전 세계에 분산된 서버 네트워크를 통해 컨텐츠를 효율적으로 전송한다.
CDN을 사용하면 사용자는 지리적으로 가까운 서버 또는 가장 빠르게 서비스를 제공할 수 있는 서버를 통해 컨텐츠를 다운로드할 수 있으므로, 다운로드 시간이 단축되고 웹사이트나 애플리케이션의 성능이 향상된다.
내용을 모두 복사에서두는 것을 미러 사이트라고 하는데, CND는 그렇게 서버 전체의 기능은 똑같이 따라하는 것은 아니고, 컨텐츠 전달이라는 용도에 특화된 것이라 보면 된다.
이 CDN서버에는 사이트의 각종 이미지나 기타 정적 요소들이 상당수 저장, 캐싱 되어있다. 때문에 보다 빠르게 사이트를 이용할 수 있다.
비유하자면, 손님들이 본사가 아니라 체인점으로 가는 것이라 할 수 있겠다.
그렇다면 CDN에 캐싱되는 데이터는 언제 캐싱되는 걸까?
이는 설정하기에 따라 여러 방식이 사용된다.
캐싱은 정적 캐싱
과 동적 캐싱
으로 나뉠 수 있다. (정적컨텐츠, 동적컨텐츠랑은 완전히 다른 개념)
정적캐싱
: 캐싱할 것들을 미리 각 엣지에 보내는 것.
동적캐싱
: 사용자가 요청을 보낼 때마다 보낼 컨텐츠가 엣지에 있는지 먼저 확인한 다음에 있으면 (cache hit)바로 사용자에게 보내고, 없으면 (cashe miss)일 때 서버에 요청을 받아오는 것.
비유하자면, 체인점들이 식재료를 미리 받와와서 있는게 정적 캐싱이고, 주문 들어왔는데 냉장고에 없으면 본사에 요청하는게 동적 캐싱이라 할 수 있겠다.
가벼운 컨텐츠들이라면 동적 캐싱 써도 큰 문제가 없겠지만, 동영상이나 무거운 게임파일 같은 것은 정적캐싱 해놓아야 사용자가 이용하기에 불편이 없을 것이다. 이처럼 필요나 용도, 비용에 따라 적합한 방식을 쓰면 된다.
정적컨텐츠
: HTML,CSS,JavaScript파일이나 문서, 이미지 , 동영상 처럼 그 내용이 고정된 것.
동적컨텐츠
: 사용자가 입력한 내용이나, 어떤 게시판의 최신글 불러오기 같은 API 요청, 그때그때 데이터베이스 등의 변수에 따라서 내용이 변할 수 있는 것.
일반적으로, CDN은 정적인 컨텐츠을 처리하는 데 사용된다. 동적인 컨텐츠는 여전히 백엔드 서버에서 처리되며, CDN은 정적인 컨텐츠를 처리하는 데 집중된다. 정적컨텐츠는 캐싱하기 쉬워도, API요청의 결과 같은 동적컨텐츠는 캐싱하는것이 까다롭고 크게 의미가 없을 수 있기 때문이다.
하지만 모든 CDN업체가 그런 것은 아니다.
동적 콘텐츠도 캐싱을 하되, 여러 방법을 고안해서 동적 컨텐츠 전달 속도를 높이는 곳들도 있다. Cloudflare
, Akamai
, AWS의 CloudFront
, Azure의 CDN
등은 동적컨텐츠를 바이트 단위로 분석해서, 딱 바뀐 부분만 새로 받아오도록해서 속도를 높이기도하고, 서버에서 사용자까지 전달되는 경로를 최적화하기도 하고, 데이터를 압축하거나 handshake등의 과정을 간소화하기도 한다.
또한 동적컨텐츠의 필요나 특성에 따라서는 지정된 시간에 한해서 캐싱되도록 할 수도 있다. 날씨 같은 경우 초 단위로 업데이트 될 필요는 없으니말이다.
이처럼 데이터가 캐시에 얼마나 남아있을지 지정하는 값을 Time-To-Live, TTL이라고 한다. 같은 사이트나 서비에에서도 컨텐츠의 종류마다 각각 적합한 TTL을 지정할 수 있다.
그럼 사이트 주소를 검색하면 어떻게되는 걸까?
DNS는 해상 사이트의 주소를 입력하면 서버의 IP가 아닌 CDN주로 소료 연결해준다. 그렇게 대신 요청을 받은 CDN은 이제 세계 각지의 서버들(Edge)들 중에서 클라이언트에게 가장 빠르게 서비스를 제공할 수 있는 엣지를 선택해서 그 서버와 사용자를 주선해주게된다.
반드시 물리적으로 가까운 엣지는 아니다. 지역에 따라 트래픽이 몰리는 곳도 있기 때문에 이를 고려하기도 한다. 이처럼 좋은 CDN은 각 엣지들이 잘 돌아가는지를 꾸준히 헬스체크해서 안좋은 엣지를 걸러내기도 한다.
이렇게 CDN을 사용하면 CDN 업체에 나가는 비용도 있겠지만, 본 서버를 돌리는 비용도 줄어 그로써 아끼는 비용이 더 크기 때문에 CDN을 사용한다. 서버로 직접 요청들이 들어오지 않기때문에 대역폭이 비용이 크게 절감된다.
대역폭 : 대역폭은 동시에 얼마나 많은 데이터가 오고갈 수 있는가
비유) 몇차선인지 하는 도로의 너비 <대역"폭" = 도로"폭">
전송속도 : 물리적 거리를 얼마나 빠르게 이동하는가
비유) 도로의 제한속도
이것들이 둘 다 빠르면 되게 빠른 것이다.
결국 CDN의 대역폭 비용을 줄여준다는 것은 본사로 손님들이 직접 찾아오는 것이 아니니까 본사로 가는 길을 넓게 깔 필요가 없다는 것이다. 그런 측면에서 서버 호스팅 비용이 절감되고, 가용성과 안정성도 향상된다. 본서버가 받는 부담이 덜어지니까 과부하로 인한 오류의 위험성도 확 줄어들고 이 CDN중 하나에 이상이 생겨도 신속히 다른 엣지로 연결되기 때문에 보다 안정적인 서비스를 사용자들에게 제공할 수 있다.
좋은 CDN업체들은 웹사이트를 계속 유지하면서도 DDos 공격들로부터 서버를 보호하기 위한 다양한 방법들을 고안해서 제공한다. 정상적인 요청과 공격요청을 구분해내고 특정 시점의 요청 수를 제한하기도하고, 집중된 요청들을 수많은 엣지들로 분산시키는 등 DDos를 무력화 시킬 방안들을 가지고 있다.
또한 컨텐츠의 암호화도 CDN을 통해 향상시킬 수 있다. 좋은 CDN업체들은 이 엣지들과 사용자간의 연결에 있어서 최신의 검정된 인증 방식들을 사용하기 때문에 내가 서버에서 구현한 인증서의 보안 등급이 낮더라도 방문자들은 CDN에서 제공하는 보다 강력한 보안을 누리게 된다. 이처럼 보안도 CDN업체를 선택할 때 중요한 고려 요소이다.
이 CDN을 해킹에서 악성코드를 유포하는 등의 공격도 있기 때문에 사용할 CDN회사가 보안 측면에서 충분한 역량을 갖췄는지도 꼼꼼히 따져볼 필요가 있다.
참고문헌 : 얄팍한 코딩사전