1. 개요
Azure CDN에서 Cache control을 제어하는 방법과 해당 이슈(응답 속도)에 대해서 알아봅니다.
2. 환경
User는 사용자 지정 도메인이 연결되어 있는 Azure CDN을 통해서 글로벌 배포중인 웹 사이트에 접근합니다.
Azure CDN을 통한 글로벌 배포 웹 사이트 중 정적 컨텐츠에 관한 데이터는 Azure Blob에서 가져옵니다.
정적 컨텐츠를 가져오기 위해서 Azure CDN 엔드포인트의 원본을 Azure Blob으로 설정합니다.
결론적으로 User -> Azure CDN -> Azure Blob 순서로 웹 사이트에 정적 컨텐츠를 제공하게 됩니다.
3. 이슈
한줄 요약)
Azure CDN을 통해 정적 컨텐츠를 가져올때, AWS에 비해 Web Serving이 현저하게 느린 이슈가 발생했습니다.
상세 내용)
AWS의 경우 CloudFront 없이 ECS를 통해 Web Serving을 했을때 50 ms 정도의 응답 속도가 반환 되었습니다.
Azure의 경우 Azure CDN을 통해 Web Serving 했을때 200~300 ms 정도의 응답 속도가 반환 되었습니다.
약 4~6배 정도 차이나는 이유를 알아보고 해결할 필요가 있었습니다.

4. 원인 분석 및 해결
원인 분석을 위해서 정적 컨텐츠를 받아올 때 Header 값에 대해서 살펴보았습니다.

1) cache-control max-age=0
현재는 Cache-control이 max-age=0입니다. 이렇게 설정하는 경우, 캐시를 사용하지 않고 원본(blob)에 있는 컨텐츠를 계속 확인하고 최신 버전이 있으면 최신 버전으로 가져오게 됩니다.
최신 버전을 체크하여 가져올 수 있도록 해달라는 요청에 의해서 설정하게 되었습니다.
cache-contorl max-age=0의 설정은 Jenkinsfile을 통해 정적 컨텐츠 배포 전 빌드 진행 시 설정되도록 하였습니다.
이러한 이유로 인해서 캐시 데이터를 사용하지 않아 응답 시간에 영향을 줄 수 있습니다.
2) X-Cache : TCP_MISS
cache-control max-age=0에 의해서 JS 파일은 Azure CDN에 응답은 되었으나, CDN에 해당 파일이 cache 되지 않은 상태이기 때문에 Client 요청 시 CDN이 원본(blob)으로부터 해당 파일을 불러온 후 client로 전달하는 시간이 소요됩니다.
즉, 캐시 데이터를 사용하지 않고 원본 데이터를 불러오면서 AWS보다 응답 속도가 느려진 것으로 파악됩니다.
! 참고
X-Cache는 Azure CDN에서 콘텐츠가 어떤 계층에서 제공되었는지 보여주는 디버깅용 헤더입니다.
해당 헤더는 Microsoft의 Azure CDN에만 적용됩니다.
URL : Microsoft의 Azure CDN에 대한 HTTP 헤더 디버그

디버깅용 응답 헤더를 확인했을때, X-Cache : TCP_MISS로 응답 헤더가 반환되고 있습니다.
해당 응답 헤더가 반환되는 이유는 cache-control max-age=0으로 캐시가 되지 않고 있는 상황이고 그에따라 원본에서 콘텐츠가 제공되고 있음을 뜻합니다.
자, 이제 원인분석을 했으니 해결을 하러 가보시죠!
해결하기 위해서는 X-Cache : TCP_HIP와 같이 CDN에 캐시된 콘텐츠가 Client로 전달 될 수 있게 CDN 혹은 원본 설정이 필요합니다. cache-control max-age=0으로 설정된 경우에서 응답 속도를 개선하기 위해서는 두 가지 방안이 있습니다.
1) Azure CDN 규칙 엔진 설정
Azure CDN의 규칙 엔진을 통해서 별도의 Cache-control 설정이 가능합니다.


캐시 바이패스)
CDN이 콘텐츠를 전혀 캐시하지 않습니다.
원본(Blob)에 설정된 Cache-Control 헤더를 무시합니다. 모든 요청이 원본 서버로 직접 전달됩니다.
사용 예 : 실시간 데이터나 항상 최신 상태를 유지해야하는 콘텐츠
재정의)
원본의 Cache-control 설정을 무시하고 CDN의 설정을 강제 적용합니다.
단, Cache-control:no-cache는 재정의가 불가능합니다.
Microsoft Azure CDN의 경우 200(성공)과 206(부분 콘텐츠) 응답에만 적용 됩니다.
사용 예 : 원본 설정과 관계없이 일관된 캐시 정책을 적용하고 싶을 때 사용
누락된 경우 설정)
원본에 Cache-control 헤더가 있으면 원본 설정을 사용합니다.
만약 원본에 Cache-control 헤더가 없으면 CDN의 설정을 사용하게 됩니다.
가장 유연한 방식으로 원본의 설정을 존중하면서도 기본 값을 제공하게 됩니다.
사용 예 : 일부 파일은 원본의 캐시 설정을 따르고, 나머지는 기본값을 사용하고 싶을 때 사용
2) Blob 파일 Cacche-control 설정
Blob 내 파일의 cache-control 상태는 아래 예시 이미지와 같이 파일 속성에서 확인이 가능합니다.

3) cache-control max-age=0 제거
당연한 말이겠지만, max-age=0을 제거하게 된다면 CDN에서 원본에 대한 캐시를 가져와서 유지하게 되고 캐시 데이터를 사용하여 원본까지 데이터를 가져올 필요가 없게됩니다. 하여, Azure CDN의 응답속도가 개선되게 됩니다.
해결 결과 이미지는 다음과 같습니다.

'Azure' 카테고리의 다른 글
| Azure Kubernetes Service Logging with Log Analytics (0) | 2025.03.25 |
|---|---|
| Exposing AKS Apps Using Front Door And Private Link Service (1) | 2025.03.20 |
| Azure Application Gateway WAF (0) | 2025.02.10 |
| Content-type & Azure CDN 규칙 엔진 (1) | 2025.02.04 |
| Azure Kubernetes Service 가용성 & Taint (0) | 2025.01.31 |