캐시 정책 이해 - Amazon CloudFront

캐시 정책 이해

캐시 정책을 사용하면 캐시 키에 포함된 값(URL 쿼리 문자열, HTTP 헤더 및 쿠키)을 제어하여 캐시 적중률을 향상시킬 수 있습니다. CloudFront 에서는 캐시 정책에 대해 미리 정의된 캐시 정책(관리형 정책이라고 함)을 제공합니다. 이러한 관리형 정책을 사용하거나 필요에 따라 자체 캐시 정책을 만들 수 있습니다. 관리형 정책에 대한 자세한 내용은 관리형 캐시 정책 사용 단원을 참조합니다.

캐시 정책에는 정책 정보, TTL(Time To Live) 설정캐시 키 설정으로 분류되는 다음 설정이 포함되어 있습니다.

정책 정보

이름

캐시 정책을 식별하는 이름입니다. 콘솔에서 이름을 사용하여 캐시 정책을 캐시 동작에 연결합니다.

설명

캐시 정책에 대한 설명입니다. 이는 선택 사항이지만 캐시 정책의 용도를 식별하는 데 도움이 될 수 있습니다.

TTL(Time To Live) 설정

TTL(Time To Live) 설정은 Cache-ControlExpires HTTP 헤더(오리진 응답에 있는 경우)와 함께 작동하여 CloudFront 캐시의 객체가 유효한 상태를 유지하는 기간을 결정합니다.

Minimum TTL

객체가 업데이트되었는지 여부를 확인하기 위해 CloudFront에서 오리진을 검사하기 전에 객체를 CloudFront 캐시에 유지할 최소 시간(초)입니다. 자세한 내용은 콘텐츠가 캐시에 유지되는 기간(만료) 관리 단원을 참조합니다.

Maximum TTL

객체가 업데이트되었는지 여부를 확인하기 위해 CloudFront에서 오리진을 검사하기 전에 객체를 CloudFront 캐시에 유지할 최대 시간(초)입니다. CloudFront는 오리진이 객체와 함께 Cache-Control 또는 Expires 헤더를 전송하는 경우에만 이 설정을 사용합니다. 자세한 내용은 콘텐츠가 캐시에 유지되는 기간(만료) 관리 단원을 참조하십시오.

기본 TTL

객체가 업데이트되었는지 여부를 확인하기 위해 CloudFront에서 오리진을 검사하기 전에 객체를 CloudFront 캐시에 유지할 기본 시간(초)입니다. CloudFront는 오리진이 객체와 함께 Cache-Control 또는 Expires 헤더를 전송하지 않는 경우에만 이 설정의 값을 객체의 TTL로 사용합니다. 자세한 내용은 콘텐츠가 캐시에 유지되는 기간(만료) 관리 단원을 참조합니다.

참고

최소 TTL, 최대 TTL기본 TTL 설정이 모두 0으로 설정된 경우 CloudFront 캐싱이 비활성화됩니다.

캐시 키 설정

캐시 키 설정은 CloudFront에서 캐시 키에 포함하는 최종 사용자 요청의 값을 지정합니다. 이 값에는 URL 쿼리 문자열, HTTP 헤더 및 쿠키가 포함될 수 있습니다. 캐시 키에 포함하는 값은 CloudFront가 오리진으로 보내는 요청(오리진 요청이라고 함)에 자동으로 포함됩니다. 캐시 키에 영향을 주지 않고 오리진 요청을 제어하는 방법에 대한 자세한 내용은 정책을 통한 오리진 요청 제어 단원을 참조합니다.

캐시 키 설정은 다음과 같습니다.

헤더

CloudFront에서 캐시 키 및 오리진 요청에 포함하는 최종 사용자 요청의 HTTP 헤더입니다. 헤더의 경우 다음 설정 중 하나를 선택할 수 있습니다.

  • None(없음) – 최종 사용자 요청의 HTTP 헤더가 캐시 키에 포함되어 있지 않고 오리진 요청에 자동으로 포함되지 않습니다.

  • Include the following headers(다음 헤더 포함) – 캐시 키에 포함되고 오리진 요청에 자동으로 포함되는 뷰어 요청의 HTTP 헤더를 지정합니다.

Include the following headers(다음 헤더 포함) 설정을 사용하는 경우 HTTP 헤더를 해당 값이 아닌 이름으로 지정합니다. 예를 들어 다음 HTTP 헤더를 고려해 보세요.

Accept-Language: en-US,en;q=0.5

이 경우 헤더를 Accept-Language: en-US,en;q=0.5로 지정하지 않고 Accept-Language으로 지정합니다. 그러나 CloudFront는 캐시 키 및 오리진 요청에 해당 값을 포함한 전체 헤더를 포함합니다.

CloudFront에서 생성한 특정 헤더를 캐시 키에 포함할 수도 있습니다. 자세한 내용은 CloudFront 요청 헤더 추가 단원을 참조합니다.

쿠키

CloudFront에서 캐시 키 및 오리진 요청에 포함하는 최종 사용자 요청의 쿠키입니다. 쿠키의 경우 다음 설정 중 하나를 선택할 수 있습니다.

  • None(없음) – 최종 사용자 요청의 쿠키가 캐시 키에 포함되어 있지 않고 오리진 요청에 자동으로 포함되지 않습니다.

  • All(모두) – 최종 사용자 요청의 모든 쿠키가 캐시 키에 포함되고 오리진 요청에 자동으로 포함됩니다.

  • Include specified cookies(지정된 쿠키 포함) – 캐시 키에 포함되고 오리진 요청에 자동으로 포함되는 뷰어 사용자 요청의 쿠키를 지정합니다.

  • Include all cookies except(일부 쿠키 제외) – 캐시 키에 포함되지 않고 오리진 요청에 자동으로 포함되지 않는 뷰어 요청의 쿠키를 지정합니다. 지정한 쿠키를 제외한 다른 모든 쿠키는 캐시 키에 포함되고 오리진 요청에 자동으로 포함됩니다.

Include specified cookies(지정된 쿠키 포함) 또는 Include all cookies except(일부 쿠키 제외) 설정을 사용하는 경우 값이 아닌 이름으로 쿠키를 지정합니다. 예를 들어 다음 Cookie 헤더를 고려해 보십시오.

Cookie: session_ID=abcd1234

이 경우 쿠키를 session_ID=abcd1234로 지정하지 않고 session_ID로 지정합니다. 그러나 CloudFront는 캐시 키 및 오리진 요청에 해당 값을 포함한 전체 쿠키를 포함합니다.

쿼리 문자열

CloudFront에서 캐시 키 및 오리진 요청에 포함하는 최종 사용자 요청의 URL 쿼리 문자열입니다. 쿼리 문자열의 경우 다음 설정 중 하나를 선택할 수 있습니다.

  • None(없음) – 최종 사용자 요청의 쿼리 문자열이 캐시 키에 포함되어 있지 않고 오리진 요청에 자동으로 포함되지 않습니다.

  • All(모두) – 최종 사용자 요청의 모든 쿼리 문자열이 캐시 키에 포함되고 오리진 요청에도 자동으로 포함됩니다.

  • Include specified query strings(지정된 쿼리 문자열 포함) – 캐시 키에 포함되고 오리진 요청에 자동으로 포함되는 뷰어 요청의 쿼리 문자열을 지정합니다.

  • Include all query strings except(일부 쿼리 문자열 제외) – 캐시 키에 포함되지 않고 오리진 요청에 자동으로 포함되지 않는 뷰어 요청의 쿼리 문자열을 지정합니다. 지정한 쿼리 문자열을 제외한 다른 모든 쿼리 문자열은 캐시 키에 포함되며 오리진 요청에 자동으로 포함됩니다.

Include specified query strings(지정된 쿼리 문자열 포함) 또는 Include all query strings except(일부 쿼리 문자열 제외) 설정을 사용하는 경우 값이 아닌 이름으로 쿼리 문자열을 지정합니다. 예를 들어 다음 URL 경로를 고려해 보세요.

/content/stories/example-story.html?split-pages=false

이 경우 쿼리 문자열을 split-pages=false가 아닌 split-pages로 지정합니다. 그러나 CloudFront는 캐시 키 및 오리진 요청에 해당 값을 포함한 전체 쿼리 문자열을 포함합니다.

압축 지원

이러한 설정을 사용하면 최종 사용자가 지원할 때 CloudFront에서 Gzip 또는 Brotli 압축 형식으로 압축된 객체를 요청하고 캐시할 수 있습니다. 이 설정을 사용하면 CloudFront 압축이 작동할 수도 있습니다. 최종 사용자는 Accept-Encoding HTTP 헤더를 사용하여 이러한 압축 형식에 대한 지원을 나타냅니다.

참고

Chrome 및 Firefox 웹 브라우저는 HTTPS를 사용하여 요청이 전송될 때만 Brotli 압축을 지원합니다. 이러한 브라우저는 HTTP 요청이 있는 Brotli를 지원하지 않습니다.

다음 중 하나에 해당하는 경우 이러한 설정을 활성화합니다.

  • 오리진에서 최종 사용자가 지원할 때 Gzip 압축 객체를 반환합니다(요청에는 값이 gzipAccept-Encoding HTTP 헤더가 포함되어 있음). 이 경우 Gzip 활성화 설정(CloudFront API, AWS SDK AWS CLI 또는 AWS CloudFormation에서 EnableAcceptEncodingGziptrue로 설정)을 사용합니다.

  • 오리진에서는 최종 사용자가 지원할 때 Brotli 압축 객체를 반환합니다(요청에는 값이 brAccept-Encoding HTTP 헤더가 포함되어 있음). 이 경우 Brotli 활성화 설정(CloudFront API, AWS SDK AWS CLI 또는 AWS CloudFormation에서 EnableAcceptEncodingBrotlitrue로 설정)을 사용합니다.

  • 이 캐시 정책이 연결된 캐시 동작은 CloudFront 압축을 사용하여 구성됩니다. 이 경우 Gzip이나 Brotli 또는 둘 다에 대해 캐싱을 활성화할 수 있습니다. CloudFront 압축이 활성화된 경우 두 형식 모두에 대해 캐싱을 활성화하면 인터넷으로 내보내는 데이터 송신 비용을 절감할 수 있습니다.

참고

이러한 압축 형식 중 하나 또는 둘 모두에 대해 캐싱을 활성화한 경우 동일한 캐시 동작과 연결된 오리진 요청 정책Accept-Encoding 헤더를 포함하지 마십시오. CloudFront는 이러한 형식 중 하나에 대해 캐싱이 활성화된 경우 항상 오리진 요청에 Accept-Encoding 헤더를 포함하므로 이 헤더를 오리진 요청 정책에 포함해도 아무런 효과가 없습니다.

오리진 서버가 Gzip 또는 Brotli 압축 객체를 반환하지 않거나 캐시 동작이 CloudFront 압축으로 구성되지 않은 경우 압축된 객체에 대해 캐싱을 활성화하지 마세요. 이렇게 하면 캐시 적중률이 감소할 수 있습니다.

다음은 이러한 설정이 CloudFront 배포에 미치는 영향을 설명한 것입니다. 다음 시나리오는 모두 최종 사용자 요청에 Accept-Encoding 헤더가 포함되어 있다고 가정합니다. 최종 사용자 요청에 Accept-Encoding 헤더가 포함되지 않은 경우 CloudFront는 이 헤더를 캐시 키에 포함하지 않고 해당 오리진 요청에 포함하지 않습니다.

두 압축 형식에 대해 압축된 객체 캐싱이 활성화된 경우

최종 사용자가 Gzip과 Brotli를 모두 지원하는 경우, 즉 최종 사용자 요청의 Accept-Encoding 헤더에 gzipbr 값이 모두 있으면 CloudFront에서는 다음을 수행합니다.

  • 헤더를 Accept-Encoding: br,gzip으로 정규화하고 캐시 키에 정규화된 헤더를 포함합니다. 캐시 키는 최종 사용자가 보낸 Accept-Encoding 헤더에 있던 다른 값을 포함하지 않습니다.

  • 엣지 로케이션에 요청과 일치하고 만료되지 않은 Brotli 또는 Gzip 압축 객체가 있는 경우 엣지 로케이션에서 최종 사용자에게 객체를 반환합니다.

  • 엣지 로케이션의 캐시에 요청과 일치하고 만료되지 않은 Brotli 또는 Gzip 압축 객체가 없는 경우 CloudFront는 정규화된 헤더(Accept-Encoding: br,gzip)를 해당 오리진 요청에 포함합니다. 오리진 요청에는 최종 사용자가 보낸 Accept-Encoding 헤더에 있던 다른 값이 포함되지 않습니다.

최종 사용자가 하나의 압축 형식을 지원하지만 다른 압축 형식은 지원하지 않는 경우(예: gzip이 최종 사용자 요청의 Accept-Encoding 헤더에 있는 값이지만 br은 아닌 경우) CloudFront에서는 다음을 수행합니다.

  • 헤더를 Accept-Encoding: gzip으로 정규화하고 캐시 키에 정규화된 헤더를 포함합니다. 캐시 키는 최종 사용자가 보낸 Accept-Encoding 헤더에 있던 다른 값을 포함하지 않습니다.

  • 엣지 로케이션의 캐시에 요청과 일치하고 만료되지 않은 Gzip 압축 객체가 있는 경우 엣지 로케이션에서 최종 사용자에게 객체를 반환합니다.

  • 엣지 로케이션의 캐시에 요청과 일치하고 만료되지 않은 Gzip 압축 객체가 없는 경우 CloudFront는 해당 오리진 요청에 정규화된 헤더(Accept-Encoding: gzip)를 포함합니다. 오리진 요청에는 최종 사용자가 보낸 Accept-Encoding 헤더에 있던 다른 값이 포함되지 않습니다.

최종 사용자가 Brotli를 지원하지만 Gzip은 지원하지 않는 경우 CloudFront에서 수행할 작업을 이해하려면 앞의 예제에서 두 압축 형식을 서로 바꿉니다.

최종 사용자가 Brotli 또는 Gzip을 지원하지 않는 경우, 즉 최종 사용자 요청의 Accept-Encoding 헤더에 br 또는 gzip 값이 포함되지 않으면 CloudFront에서는 다음을 수행합니다.

  • 캐시 키에 Accept-Encoding 헤더를 포함하지 않습니다.

  • 해당 오리진 요청에 Accept-Encoding: identity를 포함합니다. 오리진 요청에는 최종 사용자가 보낸 Accept-Encoding 헤더에 있던 다른 값이 포함되지 않습니다.

하나의 압축 형식에 대해 압축된 객체 캐싱이 활성화되지만 다른 압축 형식에 대해서는 활성화되지 않는 경우

최종 사용자가 캐싱이 활성화된 형식을 지원하는 경우(예: Gzip에 대해 압축된 객체 캐싱이 활성화되어 있고 최종 사용자가 Gzip을 지원하는 경우 (gzip이 최종 사용자 요청의 Accept-Encoding 헤더에 있는 값 중 하나)) CloudFront에서는 다음을 수행합니다.

  • 헤더를 Accept-Encoding: gzip으로 정규화하고 캐시 키에 정규화된 헤더를 포함합니다.

  • 엣지 로케이션의 캐시에 요청과 일치하고 만료되지 않은 Gzip 압축 객체가 있는 경우 엣지 로케이션에서 최종 사용자에게 객체를 반환합니다.

  • 엣지 로케이션의 캐시에 요청과 일치하고 만료되지 않은 Gzip 압축 객체가 없는 경우 CloudFront는 해당 오리진 요청에 정규화된 헤더(Accept-Encoding: gzip)를 포함합니다. 오리진 요청에는 최종 사용자가 보낸 Accept-Encoding 헤더에 있던 다른 값이 포함되지 않습니다.

이 시나리오에서는 Brotli에 대한 압축 객체 캐싱이 활성화되지 않기 때문에 최종 사용자가 Gzip과 Brotli(최종 사용자 요청의 Accept-Encoding 헤더에는 gzip br 값이 모두 포함됨)를 모두 지원하는 경우와 동일합니다.

압축된 객체 캐싱이 Gzip이 아닌 Brotli에 대해 활성화되어 있는 경우 CloudFront에서 수행할 작업을 이해하려면 앞의 예제에서 두 압축 형식을 서로 바꿉니다.

최종 사용자가 캐싱이 활성화된 압축 형식을 지원하지 않는 경우(최종 사용자 요청의 Accept-Encoding 헤더에 해당 형식에 대한 값이 포함되지 않음) CloudFront에서는 다음을 수행합니다.

  • 캐시 키에 Accept-Encoding 헤더를 포함하지 않습니다.

  • 해당 오리진 요청에 Accept-Encoding: identity를 포함합니다. 오리진 요청에는 최종 사용자가 보낸 Accept-Encoding 헤더에 있던 다른 값이 포함되지 않습니다.

압축 객체 캐싱이 두 압축 형식 모두에 대해 비활성화된 경우

압축 객체 캐싱이 두 압축 형식 모두에 대해 비활성화된 경우 Accept-Encoding 헤더는 CloudFront에서 최종 사용자 요청에 있는 다른 HTTP 헤더와 동일하게 처리됩니다. 기본적으로 캐시 키에 포함되지 않으며 오리진 요청에 포함되지 않습니다. 캐시 정책의 헤더 목록 또는 다른 HTTP 헤더와 마찬가지로 오리진 요청 정책에 포함할 수 있습니다.