Amazon CloudFront
개발자 안내서 (API 버전 2016-09-29)

요청 헤더에 따라 콘텐츠 캐싱

CloudFront에서 웹 배포를 할 때 CloudFront에서 헤더를 오리진으로 전송할지, 최종 사용자 요청의 헤더 값에 따라 지정된 객체의 개별 버전을 캐싱할지 여부를 선택할 수 있습니다. 이렇게 하면 사용자가 사용하는 디바이스, 최종 사용자의 위치, 최종 사용자가 사용하는 언어 및 다양한 조건에 따라 서로 다른 버전의 콘텐츠를 제공할 수 있습니다. RTMP 배포의 경우 헤더 값에 따라 캐싱하도록 CloudFront를 구성할 수 없습니다.

참고

RTMP 배포의 경우 최종 사용자 요청의 헤더에 따라 콘텐츠를 캐싱하도록 CloudFront를 구성할 수 없습니다.

헤더 및 배포 - 개요

기본적으로 CloudFront에서는 엣지 로케이션의 객체를 캐싱할 때 헤더를 고려하지 않습니다. 오리진에서 두 개의 객체를 반환하고 이들 객체는 요청 헤더의 값에만 차이가 있는 경우, CloudFront에서는 한 가지 버전의 객체만 캐싱합니다.

오리진에 헤더를 전달하도록 CloudFront를 구성할 수 있으며, 이러한 경우 CloudFront에서는 하나 이상의 요청 헤더 값에 따라 여러 버전의 객체를 캐싱합니다. 특정 헤더의 값에 따라 객체를 캐싱하기 위한 CloudFront를 구성하려면, 배포에 대한 캐시 동작 설정을 지정해야 합니다. 자세한 내용은 선택한 요청 헤더 기반의 캐시 단원을 참조하십시오.

예를 들어, logo.jpg에 대한 최종 사용자 요청에 Product 또는 Acme 값을 가진 사용자 지정 Apex 헤더가 포함되어 있다고 가정합니다. Product 헤더 값을 기반으로 객체를 캐싱하도록 CloudFront를 구성하는 경우 CloudFront에서는 logo.jpg에 대한 요청을 오리진으로 전달하고, Product 헤더와 헤더 값을 포함합니다. CloudFront는 Product 헤더의 값이 Acme인 요청과 값이 Apex인 요청에 대해 한번씩 logo.jpg를 캐싱합니다.

다음 중 하나를 수행하도록 웹 배포의 각 캐시 동작을 구성할 수 있습니다.

  • 오리진에 전체 헤더를 전달합니다.

    중요

    전체 헤더를 오리진에 전달하도록 CloudFront를 구성한 경우, CloudFront에서는 이 캐시 동작과 연결된 객체를 캐싱하지 않습니다. 대신 각 요청을 오리진에 보냅니다.

  • 지정한 헤더의 화이트리스트를 전달합니다. CloudFront에서는 모든 지정된 헤더의 값을 기반으로 객체를 캐싱합니다. 또한 CloudFront에서는 기본적으로 전달하는 헤더를 모두 전달하지만 지정한 헤더를 기반으로만 객체를 캐싱합니다.

  • 기본 헤더만 전달합니다. 이 구성의 경우 CloudFront에서는 요청 헤더의 값을 기반으로 객체를 캐싱하지 않습니다.

각 캐시 동작에 대해 화이트리스트로 지정할 수 있는 헤더 수에 대한 현재 제한을 살펴보고 더 높은 값을 요청하려면, 사용자 지정 헤더에 대한 제한(웹 배포만 해당) 단원을 참조하십시오.

CloudFront에서 오리진에 헤더를 전달하도록 CloudFront 콘솔을 사용하여 웹 배포를 업데이트하는 방법에 대한 자세한 내용은 배포 업데이트 단원을 참조하십시오. CloudFront API를 사용한 기존 배포 업데이트에 대한 자세한 내용은 Amazon CloudFront API Reference배포 업데이트 단원을 참조하십시오.

캐싱의 기반이 되는 헤더 선택

오리진에 전달할 수 있고 CloudFront에서 캐싱의 기반이 되는 헤더는 오리진이 Amazon S3 버킷인지 사용자 지정 오리진인지에 따라 달라집니다.

  • Amazon S3 – 다수의 특정 헤더를 기반으로 객체를 전달하고 캐싱하도록 CloudFront를 구성할 수 있습니다(아래 예외 목록 참조). 하지만 cross-origin 리소스 공유(CORS)를 구현해야 하거나 오리진 방향 이벤트에서 Lambda@Edge를 사용하여 콘텐츠를 개인 설정하고 싶은 경우가 아니라면 Amazon S3 오리진을 통해 헤더를 화이트리스트에 등록하지 않는 것이 좋습니다.

    • CORS를 구성하려면 CloudFront가 CORS에 대해 활성화된 웹 사이트용 콘텐츠를 배포할 수 있도록 헤더를 전달해야 합니다. 자세한 내용은 CORS 설정을 존중하도록 CloudFront 구성 단원을 참조하십시오.

    • Amazon S3 오리진에 전달된 헤더를 사용하여 콘텐츠를 개인 설정하려면 Lambda@Edge 함수를 작성 및 추가하고 이를 오리진 방향 이벤트에서 트리거되는 CloudFront 배포에 연결합니다. 콘텐츠를 개인 설정하기 위해 헤더를 처리하는 방법에 대한 자세한 내용은 국가 또는 디바이스 유형 헤더에 따른 콘텐츠 개인 설정 - 예제 단원을 참조하십시오.

      콘텐츠를 개인 설정하는 데 사용하지 않는 헤더들은 화이트리스트에 등록하지 않는 것이 좋습니다. 왜냐하면 추가 헤더를 전달하면 캐시 적중률이 낮아질 수 있기 때문입니다. 즉, CloudFront는 모든 요청의 비율로서 엣지 캐시에서 제공되는 다수의 요청을 처리할 수 없습니다.

  • 사용자 지정 오리진 – 다음과 같이 요청 헤더 값을 기반으로 캐싱하도록 CloudFront를 구성할 수 있습니다.

    • Connection

    • Cookie – 쿠키를 기반으로 전달 및 캐싱을 수행하려는 경우, 배포에 개별 설정을 사용합니다. 자세한 내용은 쿠키를 기반으로 콘텐츠 캐싱 단원을 참조하십시오.

    • Host (for Amazon S3 origins)

    • Proxy-Authorization

    • TE

    • Upgrade

    DateUser-Agent 헤더의 값에 따라 객체를 캐싱하도록 CloudFront를 구성할 수 있지만, 권장되지는 않습니다. 이러한 헤더는 여러 가지 값을 가질 수 있으며, 헤더의 값에 따른 캐싱으로 인해 CloudFront에서 오리진에 전달되는 요청이 눈에 띄게 증가할 수 있습니다.

HTTP 요청 헤더의 전체 목록과 CloudFront에서 이를 처리하는 방법은 HTTP 요청 헤더 및 CloudFront 동작(사용자 지정 및 S3 오리진) 단원을 참조하십시오.

CORS 설정을 존중하도록 CloudFront 구성

Amazon S3 버킷 또는 사용자 지정 오리진에서 CORS를 활성화한 경우에는 CORS 설정을 준수하도록 전달할 특정 헤더를 선택해야 합니다. 오리진(Amazon S3 또는 사용자 지정)과 OPTIONS 응답의 캐싱 여부에 따라 서로 다른 헤더를 전달해야 합니다.

Amazon S3

  • OPTIONS 응답을 캐싱하고 싶으면 다음을 수행하세요.

    • OPTIONS 응답에 대해 캐싱을 활성화하는 기본 캐시 동작 설정에 대한 옵션을 선택합니다.

    • Origin, Access-Control-Request-HeadersAccess-Control-Request-Method 헤더를 전달하도록 CloudFront를 구성합니다.

  • OPTIONS 응답을 캐싱하고 싶지 않으면 오리진에서 요청된 다른 모든 헤더와 함께 Origin 헤더를 전달하도록 CloudFront를 구성합니다(예: Access-Control-Request-Headers, Access-Control-Request-Method, 또는 기타).

사용자 지정 오리진 – 오리진에서 요구하는 나머지 헤더와 함께 Origin 헤더를 전달합니다.

CloudFront 배포를 위해 캐시 동작에서 헤더를 화이트리스트로 만들어 헤더를 전달하도록 CloudFront를 구성합니다. 헤더 전달 작업에 대한 자세한 내용은 헤더 및 배포 - 개요 단원을 참조하십시오.

CORS 및 Amazon S3에 대한 자세한 내용은 Amazon Simple Storage Service 개발자 가이드Cross-Origin 리소스 공유 활성화 단원을 참조하십시오.

디바이스 유형을 기반으로 캐싱하도록 구성

CloudFront에서 사용자가 콘텐츠를 보기 위해 사용 중인 디바이스에 따라 여러 버전의 객체를 캐싱하려는 경우, 다음과 같이 적용 가능한 헤더를 사용자 지정 오리진에 전달하도록 CloudFront를 구성합니다.

  • CloudFront-Is-Desktop-Viewer

  • CloudFront-Is-Mobile-Viewer

  • CloudFront-Is-SmartTV-Viewer

  • CloudFront-Is-Tablet-Viewer

User-Agent 헤더의 값에 따라 CloudFront에서는 요청을 오리진에 전달하기 전에 이러한 헤더의 값을 true 또는 false로 설정합니다. 디바이스가 둘 이상의 범주에 해당하는 경우 둘 이상의 값이 true일 수 있습니다. 예를 들어, 일부 태블릿 디바이스의 경우 CloudFront에서는 CloudFront-Is-Mobile-ViewerCloudFront-Is-Tablet-Viewer를 모두 true로 설정할 수 있습니다.

최종 사용자 언어를 기반으로 캐싱하도록 구성

CloudFront에서 요청에 지정된 언어에 따라 여러 버전의 객체를 캐싱하려는 경우, Accept-Language 헤더의 언어를 포함하도록 애플리케이션을 프로그래밍하고 Accept-Language 헤더를 오리진에 전달하도록 CloudFront를 구성합니다.

최종 사용자 위치를 기반으로 캐싱하도록 구성

CloudFront에서 요청이 시작된 국가에 따라 여러 버전의 객체를 캐싱하려는 경우, CloudFront-Viewer-Country 헤더를 오리진에 전달하도록CloudFront를 구성합니다. CloudFront에서는 자동으로 요청이 시작된 IP 주소를 두 글자의 국가 코드로 변환합니다. 코드와 국가 이름으로 정렬이 가능하고 사용이 간편한 국가 코드 목록에 대해서는 Wikipedia 항목 ISO 3166-1 alpha-2를 참조하십시오.

요청의 프로토콜을 기반으로 캐싱하도록 구성

CloudFront에서 HTTP 또는 HTTPS 중 요청의 프로토콜에 따라 여러 버전의 객체를 캐싱하려는 경우, CloudFront-Forwarded-Proto 헤더를 오리진에 전달하도록 CloudFront를 구성합니다.

압축 파일에 대한 캐싱 구성

오리진이 Brotli 압축을 지원할 경우, Accept-Encoding 헤더를 화이트리스트로 지정하여 이 헤더를 기반으로 캐시할 수 있습니다. 오리진이 이 헤더를 기반으로 하여 다른 콘텐츠를 제공하는 경우에만 Accept-Encoding을 기반으로 캐싱하도록 구성해야 합니다.

헤더를 기반으로 한 캐싱이 성능에 미치는 영향

하나 이상의 헤더를 기반으로 캐싱하도록 CloudFront를 구성하고 그러한 헤더가 둘 이상의 값을 가질 수 있는 경우, CloudFront에서는 동일한 객체에 대해 더 많은 요청을 오리진 서버에 전달합니다. 이는 성능을 저하시키고 오리진 서버에 걸리는 부하를 가중시킵니다. 오리진 서버에서 지정된 헤더의 값에 상관없이 동일한 객체를 반환하는 경우, 해당 헤더를 기반으로 캐싱하도록 CloudFront를 구성하지 않는 것이 좋습니다.

둘 이상의 헤더를 전달하도록 CloudFront를 구성하는 경우, 최종 사용자 요청의 헤더 순서는 헤더의 값이 동일하다면 캐싱에 영향을 주지 않습니다. 예를 들어 하나의 요청에 A:1,B:2 헤더가 포함되어 있고 다른 요청에는 B:2,A:1이 포함되어 있는 경우, CloudFront에서는 하나의 객체 사본만 캐싱합니다.

헤더 및 헤더 값의 대소문자가 캐싱이 미치는 영향

CloudFront에서 헤더 값에 따라 캐싱을 수행할 경우 헤더 이름의 대소문자는 구별하지 않지만 헤더 값의 대소문자는 구별합니다.

  • 최종 사용자 요청에 Product:Acmeproduct:Acme가 모두 포함된 경우, CloudFront에서는 객체를 한 번만 캐싱합니다. 이들은 헤더 이름의 대소문자만 다른 경우로, 캐싱에는 영향을 미치지 않습니다.

  • 최종 사용자 요청에 Product:AcmeProduct:acme가 모두 포함된 경우 CloudFront에서는 객체를 두 번 캐싱합니다. 이는 일부 요청에서는 값이 Acme이고 다른 요청에서는 acme이기 때문입니다.

CloudFront에서 최종 사용자에게 반환하는 헤더

특정 헤더를 전달하고 캐싱하도록 CloudFront를 구성하더라도 CloudFront에서 최종 사용자에게 반환하는 헤더의 종류에 영향을 미치지 않습니다. CloudFront에서는 오리진에서 가져온 헤더를 모두 반환하며, 여기에는 몇 가지 예외 사항이 적용됩니다. 자세한 내용은 관련 주제를 참조하십시오.