Content Delivery Network의 약자인 CDN. 속도 개선을 위해 CDN을 써야 한다는 말은 자주 들리는데 정확히 어떤 배경에서 나온 건지, 어떻게 동작하는지가 궁금했다. 이번 포스팅에서는 CDN의 개념과 원리, 그리고 장점에 대해 알아보고자 한다.
CDN이란?
콘텐츠 전송 네트워크(CDN)는 본래 지리적으로 분산된 여러 개의 서버 네트워크를 말한다. 우리가 사용하는 웹 어플리케이션은 웹 페이지, 이미지, 동영상 등의 여러 가지 콘텐츠들을 포함한다. 이들 콘텐츠는 서버에서 클라이언트로 인터넷망을 통해 전송되는데, 사용자가 해당 서버에서 멀리 떨어져 있는 경우 동영상 또는 이미지와 같은 대용량 파일을 로드하는 데 시간이 오래 걸린다. 이때 CDN이라는 분산된 서버를 각지에 배치하면 속도상의 이점을 챙길 수 있다. 웹 콘텐츠를 유저와 가까운 지역의 서버에서 전송할 수 있기 때문이다.
CDN이 등장하게 된 이유
서버는 본래 컴퓨터라는 물리적 디바이스에 크게 좌우된다. 방문자(클라이언트)의 요청에 따라 컨텐츠를 보내주며, 너무 많은 요청이 들어올 경우 당연히 부하가 생긴다. 그런데 트래픽이 많은 웹사이트의 경우, 전 세계에서 수많은 요청들이 들어온다. 유튜브, 넷플릭스, 아마존과 같은 글로벌 서비스의 경우 수천 명에서 수억 명의 유저를 보유하고 있으며, 유저들의 지역도 대륙을 넘나든다. 한국에 서버가 있는 웹사이트를 아시아, 북미, 유럽, 아프리카 등 전 세계 각지의 사람들이 방문한다면 어떤 일이 벌어질까?
우선 사용자 측면에서는 거리가 먼 지역에서 접속할 수록 콘텐츠를 불러오는 속도가 현저히 느려질 것이다. 처음 들어보는 외국 사이트에 접속했을 때 이미지나 웹 페이지가 매우 느리게 뜨는 경험을 한 번쯤 해봤을 것이다.
이는 서버 측면에서 더욱 심각한 문제가 되는데, 세계 각지에서 들어오는 수많은 요청들을 감당해야 한다는 것이다. 요청들을 감당하다 보면 서버에 과부하가 걸리기 쉽상인데, 유저가 수백만에 달하는 글로벌 서비스들은 서버용으로 엄청난 슈퍼컴퓨터라도 돌리고 있는 것일까? 기계 자체도 좋아야 하겠지만, 가장 효율적인 방법은 이런 요청들을 여러 곳에다 분산시키는 것이다. 여기에 쓰이는 대표적인 기술이 바로 CDN이다.
콘텐츠 전송 네트워크(CDN)의 주 목적은 이러한 통신 지연을 줄이는 것이다. 웹 사이트(서버)와 사용자(클라이언트) 간의 통신 트래픽은 물리적으로 대단히 먼 거리를 이동해야 한다. 또한 클라이언트에서 서버로 요청을 한 번 보낸 뒤에는 응답까지 반환받아야 하는 양방향 통신이 이루어져야 한 번의 HTTP 통신이 완료된다. CDN은 클라이언트와 서버 간에 중간 서버를 두어 통신의 효율성을 높이는 방법이다. 세계 각지에 분산된 웹 서버를 두어 웹 트래픽과 대역폭 소비를 줄이며, 애플리케이션 사용자의 콘텐츠 이용 경험을 개선한다.
요청을 여러 곳에다 분산시킨다는 것
CDN은 사용자의 요청을 처리하는 곳을 여러 군데에 두어서 나눠서 처리할 수 있게끔 한다. 다만 똑같은 기능을 하는 서버를 여러 대 둔다기보다는, 컨텐츠 전달이라는 용도에 특화되게끔 서버를 분산시킨다. 자신의 블로그가 한 CDN 업체의 서비스를 사용한다고 해보자. 이 CDN 업체는 전 세계 곳곳에 서버를 두고 있을 것이다. 어느 날 우연히 알고리즘을 잘 탄 결과, 미국에 있는 존이라는 사람이 우연히 내 블로그에 접속하게 되었다고 해보자. 그럼 존의 컴퓨터는 한국의 블로그 서버가 아니라, 북미에 있는 업체의 CDN 서버로 요청을 보내게 된다. 이 CDN 서버에는 내 블로그의 각종 이미지를 비롯한 정적 요소들이 상당수 캐싱되어 있을 것이다. 따라서 한국 서버를 거칠 필요도 없이 빠르게 이미지를 받아볼 수 있게 되는 것이다. 이렇게 되면 서버 부담이 훨씬 덜하다.
이렇게 CDN을 둬서 제3의 서버로 요청을 받는다는 것은, DNS에서 내 블로그 서버를 원본이 있는 origin 서버가 아닌 각각의 CDN 서버로 연결되도록 바꿔줘야 한다는 것이기도 하다. 마치 전화번호부에 프랜차이즈 본사의 전화번호 대신, 우리 동네 체인점 격인 CDN의 전화번호를 적는 것과도 같다. 이는 도메인을 구매한 사이트에서 설정해주면 된다.
대신 요청을 받은 CDN은 이제 세계 각지의 서버들(이것을 Edge라고 한다) 중 가장 빠르게 서비스를 제공할 수 있는 엣지를 선택해서, 그 서버와 사용자를 주선해주게 된다. 선정 기준에는 물리적 거리뿐 아니라 요청 트래픽 수준도 고려될 수 있다. 좋은 CDN 업체들은 각 엣지들이 잘 돌아가고 있는지 꾸준히 헬스체크를 해서 상태가 안 좋은 엣지들을 걸러내기도 한다.
CDN 동작의 핵심, 캐싱
캐싱은 더 빠른 데이터 액세스를 위해 동일한 데이터의 여러 복사본을 저장하는 프로세스다. CDN이 빠르게 동작하려면 사이트의 이미지, 파일 등의 리소스들에 대한 캐싱이 필수적이다. 기본적으로 CDN의 리소스 동적 캐싱 과정은 다음과 같다.
- 지리적으로 멀리 떨어진 웹 사이트 방문자는 사이트에서 정적 웹 콘텐츠를 처음 요청한다.
- 요청이 웹 애플리케이션 서버 또는 오리진 서버에 도달한다. 오리진 서버는 사용자에게 응답을 보낸다. 또한 해당 방문자와 지리적으로 가장 가까운 CDN POP에 응답 복사본을 보낸다.
- CDN POP 서버는 복사본을 캐싱된 파일로 저장한다.
- 다음에 해당 방문자 또는 해당 위치에 있는 다른 방문자가 동일한 요청을 하면, 오리진 서버가 아닌 캐싱 서버가 응답을 보낸다.
즉, 사용자가 요청을 보낼 때마다 보낼 컨텐츠가 엣지에 있는지 먼저 확인한다. 있다면 (cache hit), 바로 사용자에게 보낸다. 없다면 (cache miss), 그때 서버에 요청해서 받아온다. 이밖에도 캐싱할 리소스들을 미리 각각의 엣지에 보내 저장하는 정적 캐싱 방법도 있다. 용도에 따라 적합한 방식을 사용하면 된다. 다만 고려할 점은 캐싱할 콘텐츠의 종류다.
전송 가능한 콘텐츠의 종류
정적 콘텐츠
정적 컨텐츠는 웹 사이트 헤더 이미지, 로고 및 글꼴 스타일 등 잘 변하지 않는 콘텐츠를 말한다. 이들 데이터는 자주 수정될 필요가 없기 때문에 쉽게 캐싱 가능하며, CDN에 저장하는 데 적합하다. 기본적으로 이러한 정적 콘텐츠만 캐싱하는 업체들도 있다.
동적 콘텐츠
소셜 미디어 뉴스 피드, 날씨 보고서, 로그인 상태 및 채팅 메시지와 같은 동적 콘텐츠는 웹 사이트 사용자마다 다르다. API 요청 결과 같은 동적 컨텐츠는 보다 세심한 정책에 따라 캐싱되어야 하며, 쉽게 캐싱해두기 까다롭다. 대표적인 CDN 업체인 CloudFlare, Akamai, AWS의 CloudFront, Azuer의 CDN 서비스처럼 여러 방법을 고안해서 동적 콘텐츠 전달 속도를 높이는 곳들도 있다. 동적 콘텐츠를 바이트 단위로 분석해서, 바뀐 부분만 새로 받아오는 방식으로 속도를 높이기도 한다. 데이터를 압축하거나 handshake 등의 과정을 간소화함으로써 성능 향상을 노려볼 수도 있다.
이렇듯 같은 서비스일지라도 컨텐츠의 종류마다 적절한 TTL을 CDN을 통해 지정할 수 있다. 개발자가 이러한 요소들을 다양하게 선택할 수 있게 CDN 업체들이 제공하는 서비스는 다양하다. 웹 사이트의 내용이 전반적으로 바뀌어서 캐시를 싹 날리고 싶을 때에도, CDN 업체가 제공하는 기능들을 통해 명령을 내릴 수 있을 것이다.
CDN을 사용하면 좋은 점
CDN은 웹 사이트의 성능을 높이고 각종 인프라적인 이점을 제공한다. 다음 네 가지 요소들은 CDN의 대표적인 장점들이다.
1. 페이지 로드 시간 단축
앞서 언급했듯이, 세계 각지의 유저들에게 콘텐츠를 서빙하는 시간을 CDN 서버를 통해 크게 감소시킬 수 있다.
2. 대역폭 비용 절감
CDN을 쓰면 원 서버로 요청들이 직접 들어오지 않기 때문에 서버 대역폭 비용이 상당히 절감될 수 있다. 보통 CDN 업체에 나가는 비용보다 대역폭 비용을 절감하는 비용이 크기 때문에 CDN을 사용한다. 캐싱 및 각종 최적화를 통해 오리진 서버가 제공해야 하는 데이터의 양을 줄여, 우리의 호스팅 비용을 절감할 수 있다.
대역폭이란, 주어진 시간 안에 데이터가 얼마나 많이 실려 보낼 수 있는가를 말한다. 네트워크 성능을 따질 때 전송 속도와 대역폭이 얼마나 되는지를 체크하게 된다. 인터넷망을 데이터가 수송되는 도로라고 생각해보면, 전송속도는 이 도로의 제한 속도이며, 대역폭은 도로의 너비다. 도로가 넓어서 차선이 많이 있으면 같은 속도에서도 더 많은 데이터가 전달될 수 있는 것이다.
3. 콘텐츠 가용성 제고
가용성과 안정성도 향상된다. 본 서버가 받는 부담이 줄어들기 때문에 서버 과부하로 인한 오류의 위험성도 확 줄어들기 때문이다. 더 많은 웹 트래픽을 처리하고 서버의 로드를 줄일 수 있으며, 하나 이상의 CDN 엣지에 이상이 생겨도 다른 운영 서버가 해당 서버를 신속히 대처할 수 있기 때문에 안정성이 향상되는 것이다.
4. 보안 강화
CDN은 심지어 보안에도 좋다. 대표적인 사이버 공격인 디도스(DDoS)에 특히 안전하다.
분산 서비스 거부(DDoS) 공격은 대량의 가짜 트래픽을 웹 사이트로 전송하여 애플리케이션이 작동 중지되도록 시도하는 공격이다.
CDN을 쓰면 서버가 여기저기에 분산되기 때문에, 과도한 요청을 보내 서버에 과부하를 주는 디도스 공격이 먹히기 쉽지 않다. 여러 중간 서버 간에 로드를 분산하여, 원 서버에 미치는 영향이 줄어드는 것이다. 좋은 CDN 업체들은 디도스 공격으로부터 서버를 보호하기 위한 다양한 방법을 고안하여 인프라상의 이점을 가져다준다. 정상적인 요청과 공격 요청을 구분해내고, 특정 시점의 요청 수를 제한하기도 하는 등, 이 디도스 공격을 무력화시킬 방안들을 갖추고 있다. 따라서 서버를 호스팅 하는 개발자들은 이러한 인프라적 이점을 가져갈 수 있다.
대표적인 CDN 업체들
내 웹사이트에 CDN을 달고 싶다면, 다음과 같은 대표적인 CDN 업체들을 고려해볼 수 있을 것이다.
Akamai
- 전세계 CDN 업체 점유율 1위다. 미국에서 CDN 초창기부터 기술개발을 이끌었던 회사라고 한다.
Cloudflare CDN
- 역시 고객 수는 많은 편이다. 2021년 기준 전 세계 웹사이트 5개 중 1개가 클라우드플레어를 사용한다고 한다. 서울을 포함한 전 세계 209곳에 데이터 센터가 존재한다.
AWS CloudFront
- AWS에서 제공하는 CDN 서비스. 자사 클라우드와 연계하기 편하다고 하니, AWS를 사용한다면 이걸 써보도록 하자.
Azure CDN
- Microsoft Azure에서 제공하는 CDN 서비스. 마찬가지로 Azure 플랫폼을 사용한다면 CDN 연동에 용이할 것이다.
Reference
'Network' 카테고리의 다른 글
당황스러운 CORS 에러에 대처하기 (0) | 2022.01.22 |
---|