

# 정책으로 캐시 키 제어
<a name="controlling-the-cache-key"></a>

CloudFront **캐시 정책을 사용하여 CloudFront가 CloudFront 엣지 로케이션에 캐싱되는 객체의 **캐시 키에 포함하는 HTTP 헤더, 쿠키 및 쿼리 문자열을 지정할 수 있습니다. 캐시 키는 캐시에 있는 모든 객체의 고유 식별자이며, 뷰어의 HTTP 요청이 **캐시 적중으로 나타나는지 여부를 결정합니다.

캐시 적중은 최종 사용자 요청이 이전 요청과 동일한 캐시 키를 생성하고 해당 캐시 키의 객체가 엣지 로케이션 캐시에 있고 유효할 때 발생합니다. 캐시 적중이 있는 경우, 객체가 CloudFront 엣지 로케이션에서 최종 사용자에게 제공되므로 다음과 같은 이점이 있습니다.
+ 오리진 서버의 부하 감소
+ 최종 사용자에 대한 지연 시간 감소

캐시 키에 더 적은 수의 값을 포함하면 캐시 적중 가능성이 높아집니다. **캐시 적중률이 높아지므로(뷰어 요청 비율이 높을수록 캐시 적중이 발생함) 웹 사이트 또는 애플리케이션에서 더 나은 성능을 얻을 수 있습니다. 자세한 내용은 [캐시 키 이해](understanding-the-cache-key.md) 섹션을 참조하세요.

캐시 키를 제어하려면 CloudFront *캐시 정책*을 사용합니다. CloudFront 배포의 하나 이상의 캐시 동작에 캐시 정책을 연결합니다.

또한 캐시 정책을 사용하여 CloudFront 캐시의 객체에 대한 유지 시간(TTL) 설정을 지정하고 CloudFront에서 압축 객체를 요청하고 캐시하도록 할 수 있습니다.

**참고**  
gRPC 트래픽은 캐시할 수 없으므로 캐시 설정은 gRPC 요청에 영향을 주지 않습니다. 자세한 내용은 [CloudFront 배포에 gRPC 사용](distribution-using-grpc.md) 섹션을 참조하세요.

**Topics**
+ [캐시 정책 이해](cache-key-understand-cache-policy.md)
+ [캐시 정책 생성](cache-key-create-cache-policy.md)
+ [관리형 캐시 정책 사용](using-managed-cache-policies.md)
+ [캐시 키 이해](understanding-the-cache-key.md)

# 캐시 정책 이해
<a name="cache-key-understand-cache-policy"></a>

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

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

## 정책 정보
<a name="cache-key-understand-cache-policy-info"></a>

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

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

## TTL(Time To Live) 설정
<a name="cache-key-understand-cache-policy-ttl"></a>

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

**Minimum TTL**  
객체가 업데이트되었는지 여부를 확인하기 위해 CloudFront에서 오리진을 검사하기 전에 객체를 CloudFront 캐시에 유지할 최소 시간(초)입니다. 자세한 내용은 [콘텐츠가 캐시에 유지되는 기간(만료) 관리](Expiration.md) 섹션을 참조하세요.  
최소 TTL이 0보다 큰 경우 오리진 헤더에 `Cache-Control: no-cache`, `no-store` 또는 `private` 지시문이 있더라도 CloudFront는 적어도 캐시 정책의 최소 TTL에 지정된 기간 동안 콘텐츠를 캐싱합니다.

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

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

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

## 캐시 키 설정
<a name="cache-key-understand-cache-policy-settings"></a>

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

캐시 키 설정은 다음과 같습니다.
+ [헤더](#cache-policy-headers)
+ [Cookies](#cache-policy-cookies)
+ [쿼리 문자열](#cache-policy-query-strings)
+ [ 압축 지원](#cache-policy-compressed-objects)

**헤더**  
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 요청 헤더 추가](adding-cloudfront-headers.md) 단원을 참조합니다.

**Cookies**  
CloudFront에서 캐시 키 및 오리진 요청에 포함하는 최종 사용자 요청의 쿠키입니다. 쿠키의 경우 다음 설정 중 하나를 선택할 수 있습니다.  
+ **None(없음)** – 최종 사용자 요청의 쿠키가 캐시 키에 포함되어 있지 *않고* 오리진 요청에 자동으로 포함되지 *않습니다*.
+ **All(모두)** – 최종 사용자 요청의 모든 쿠키가 캐시 키에 포함되고 오리진 요청에 자동으로 포함됩니다.
+ **Include specified cookies(지정된 쿠키 포함)** – 캐시 키에 포함되고 오리진 요청에 자동으로 포함되는 뷰어 사용자 요청의 쿠키를 지정합니다.
+ **Include all cookies except(일부 쿠키 제외)** – 캐시 키에 포함되지 *않고* 오리진 요청에 자동으로 포함되지 *않는* 뷰어 요청의 쿠키를 지정합니다. 지정한 쿠키를 제외한 다른 모든 쿠키는 캐시 키에 포함되고 오리진 요청에 자동으로 포함됩니다.**
**Include specified cookies(지정된 쿠키 포함)** 또는 **Include all cookies except(일부 쿠키 제외)** 설정을 사용하는 경우 값이 아닌 이름으로 쿠키를 지정합니다. 예를 들어 다음 `Cookie` 헤더를 고려해 보세요.  

```
Cookie: session_ID=abcd1234
```
이 경우 쿠키를 `session_ID`로 지정하지 않고 `session_ID=abcd1234`로 지정합니다. 그러나 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`가 아닌 `split-pages=false`로 지정합니다. 그러나 CloudFront는 캐시 키 및 오리진 요청에 해당 값을 포함한 전체 쿼리 문자열을 포함합니다.  
캐시 키 설정의 경우 CloudFront는 헤더, 쿼리 문자열 및 쿠키의 별표 문자(`*`)를 와일드카드가 아닌 리터럴 문자열로 취급합니다.

** 압축 지원**  
이러한 설정을 사용하면 최종 사용자가 지원할 때 CloudFront에서 Gzip 또는 Brotli 압축 형식으로 압축된 객체를 요청하고 캐시할 수 있습니다. 이 설정을 사용하면 [CloudFront 압축](ServingCompressedFiles.md)이 작동할 수도 있습니다. 최종 사용자는 `Accept-Encoding` HTTP 헤더를 사용하여 이러한 압축 형식에 대한 지원을 나타냅니다.  
Chrome 및 Firefox 웹 브라우저는 HTTPS를 사용하여 요청이 전송될 때만 Brotli 압축을 지원합니다. 이러한 브라우저는 HTTP 요청이 있는 Brotli를 지원하지 않습니다.
다음 중 하나에 해당하는 경우 이러한 설정을 활성화합니다.  
+ 오리진에서 최종 사용자가 지원할 때 Gzip 압축 객체를 반환합니다(요청에는 값이 `Accept-Encoding`인 `gzip` HTTP 헤더가 포함되어 있음). 이 경우 **Gzip 활성화** 설정(CloudFront API, AWS SDK AWS CLI 또는 CloudFormation에서 `EnableAcceptEncodingGzip`을 `true`로 설정)을 사용합니다.
+ 오리진에서는 최종 사용자가 지원할 때 Brotli 압축 객체를 반환합니다(요청에는 값이 `Accept-Encoding`인 `br` HTTP 헤더가 포함되어 있음). 이 경우 **Brotli 활성화** 설정(CloudFront API, AWS SDK AWS CLI 또는 CloudFormation에서 `EnableAcceptEncodingBrotli`를 `true`로 설정)을 사용합니다.
+ 이 캐시 정책이 연결된 캐시 동작은 [CloudFront 압축](ServingCompressedFiles.md)을 사용하여 구성됩니다. 이 경우 Gzip이나 Brotli 또는 둘 다에 대해 캐싱을 활성화할 수 있습니다. CloudFront 압축이 활성화된 경우 두 형식 모두에 대해 캐싱을 활성화하면 인터넷으로 내보내는 데이터 송신 비용을 절감할 수 있습니다.
이러한 압축 형식 중 하나 또는 둘 모두에 대해 캐싱을 활성화한 경우 동일한 캐시 동작과 연결된 [오리진 요청 정책](controlling-origin-requests.md)에 `Accept-Encoding` 헤더를 포함하지 마십시오. CloudFront는 이러한 형식 중 하나에 대해 캐싱이 활성화된 경우 항상 오리진 요청에 `Accept-Encoding` 헤더를 포함하므로 이 헤더를 오리진 요청 정책에 포함해도 아무런 효과가 없습니다.
오리진 서버가 Gzip 또는 Brotli 압축 객체를 반환하지 않거나 캐시 동작이 CloudFront 압축으로 구성되지 않은 경우 압축된 객체에 대해 캐싱을 활성화하지 마세요. 이렇게 하면 [캐시 적중률](cache-hit-ratio.md)이 감소할 수 있습니다.  
다음은 이러한 설정이 CloudFront 배포에 미치는 영향을 설명한 것입니다. 다음 시나리오는 모두 최종 사용자 요청에 `Accept-Encoding` 헤더가 포함되어 있다고 가정합니다. 최종 사용자 요청에 `Accept-Encoding` 헤더가 포함되지 않은 경우 CloudFront는 이 헤더를 캐시 키에 포함하지 않고 해당 오리진 요청에 포함하지 않습니다.    
**두 압축 형식에 대해 압축된 객체 캐싱이 활성화된 경우**  
최종 사용자가 Gzip과 Brotli를 모두 지원하는 경우, 즉 최종 사용자 요청의 `gzip` 헤더에 `br` 및 `Accept-Encoding` 값이 모두 있으면 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 헤더와 마찬가지로 오리진 요청 정책에 포함할 수 있습니다.

# 캐시 정책 생성
<a name="cache-key-create-cache-policy"></a>

캐시 정책을 사용하면 캐시 키에 포함된 값(URL 쿼리 문자열, HTTP 헤더 및 쿠키)을 제어하여 캐시 적중률을 향상시킬 수 있습니다. AWS Command Line Interface(AWS CLI) 또는 CloudFront API를 사용하여 CloudFront 콘솔에서 캐시 정책을 생성할 수 있습니다.

캐시 정책을 생성한 후 CloudFront 배포의 하나 이상의 캐시 동작에 연결합니다.

------
#### [ Console ]

**캐시 정책을 생성하는 방법(콘솔)**

1. AWS Management Console에 로그인하고 [https://console.aws.amazon.com/cloudfront/v4/home?#/policies](https://console.aws.amazon.com/cloudfront/v4/home?#/policies)의 CloudFront 콘솔에서 [**정책(Policies)**] 페이지를 엽니다.

1. **Create cache policy(캐시 정책 생성)**를 선택합니다.

1. 이 캐시 정책에 대해 원하는 설정을 선택합니다. 자세한 내용은 [캐시 정책 이해](cache-key-understand-cache-policy.md) 섹션을 참조하세요.

1. 마친 후에는 **Create(생성)**를 선택합니다.

캐시 정책을 생성한 후 캐시 동작에 연결할 수 있습니다.

**캐시 정책을 기존 배포에 연결하는 방법(콘솔)**

1. [https://console.aws.amazon.com/cloudfront/v4/home#/distributions](https://console.aws.amazon.com/cloudfront/v4/home#/distributions)의 CloudFront 콘솔에서 [**Distributions(배포)**] 페이지를 엽니다.

1. 업데이트할 배포를 선택한 다음 **Behaviors(동작)** 탭을 선택합니다.

1. 업데이트할 캐시 동작을 선택한 다음 **Edit(편집)**를 선택합니다.

   또는 새 캐시 동작을 생성하려면 **Create Behavior(동작 생성)**를 선택합니다.

1. **Cache key and origin request(캐시 키 및 오리진 요청)** 섹션에서 **Cache policy and origin request policy(캐시 정책 및 오리진 요청 정책)**가 선택되어 있는지 확인합니다.

1. **Cache Policy(캐시 정책)**의 경우 이 캐시 동작에 연결할 캐시 정책을 선택합니다.

1. 페이지 하단에서 **Save changes(변경 사항 저장)**를 선택합니다.

**캐시 정책을 새 배포에 연결하는 방법(콘솔)**

1. [https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home)에서 CloudFront 콘솔을 엽니다.

1. **배포 생성**을 선택합니다.

1. **Cache key and origin request(캐시 키 및 오리진 요청)** 섹션에서 **Cache policy and origin request policy(캐시 정책 및 오리진 요청 정책)**가 선택되어 있는지 확인합니다.

1. **Cache Policy(캐시 정책)**의 경우 이 배포의 기본 캐시 동작에 연결할 캐시 정책을 선택합니다.

1. 오리진, 기본 캐시 동작 및 기타 배포 설정에 대해 원하는 설정을 선택합니다. 자세한 내용은 [모든 배포 설정 참조](distribution-web-values-specify.md) 섹션을 참조하세요.

1. 완료되면 **Create Distribution(배포 생성)**을 선택합니다.

------
#### [ CLI ]

AWS Command Line Interface(AWS CLI)를 사용하여 캐시 정책을 생성하려면 **aws cloudfront create-cache-policy** 명령을 사용합니다. 각 개별 파라미터를 명령줄 입력으로 지정하는 대신 입력 파일을 사용하여 명령의 입력 파라미터를 제공할 수 있습니다.

**캐시 정책을 생성하는 방법(입력 파일이 있는 CLI)**

1. 다음 명령을 사용하여 `cache-policy.yaml` 명령에 대한 모든 입력 파라미터가 포함된 **create-cache-policy**이라는 파일을 만듭니다.

   ```
   aws cloudfront create-cache-policy --generate-cli-skeleton yaml-input > cache-policy.yaml
   ```

1. 방금 생성한 `cache-policy.yaml`이라는 파일을 엽니다. 파일을 편집하여 원하는 캐시 정책 설정을 지정한 다음 파일을 저장합니다. 파일에서 선택적 필드를 제거할 수 있지만 필수 필드는 제거하지 마세요.

   캐시 정책 설정에 대한 자세한 내용은 [캐시 정책 이해](cache-key-understand-cache-policy.md) 단원을 참조합니다.

1. 다음 명령을 사용하여 `cache-policy.yaml` 파일의 입력 파라미터로 캐시 정책을 만듭니다.

   ```
   aws cloudfront create-cache-policy --cli-input-yaml file://cache-policy.yaml
   ```

   명령의 출력에 있는 `Id` 값을 기록해 둡니다. 캐시 정책 ID인 이 값은 캐시 정책을 CloudFront 배포의 캐시 동작에 연결하는 데 필요합니다.

**캐시 정책을 기존 배포에 연결하는 방법(입력 파일이 있는 CLI)**

1. 다음 명령을 사용하여 업데이트할 CloudFront 배포에 대한 배포 구성을 저장합니다. *distribution\$1ID*를 배포 ID로 바꿉니다.

   ```
   aws cloudfront get-distribution-config --id distribution_ID --output yaml > dist-config.yaml
   ```

1. 방금 생성한 `dist-config.yaml`이라는 파일을 엽니다. 캐시 정책을 사용하도록 업데이트하려는 각 캐시 동작을 다음과 같이 변경하여 파일을 편집합니다.
   + 캐시 동작에서 `CachePolicyId`이라는 필드를 추가합니다. 필드 값에는 정책을 만든 후 기록한 캐시 정책 ID를 사용합니다.
   + 캐시 동작에서 `MinTTL`, `MaxTTL`, `DefaultTTL` 및 `ForwardedValues` 필드를 제거합니다. 이러한 설정은 캐시 정책에 지정되므로 이러한 필드와 캐시 정책을 동일한 캐시 동작에 포함할 수 없습니다.
   + `ETag` 필드의 이름을 `IfMatch`로 바꾸지만 필드 값은 변경하지 마세요.

   완료되면 파일을 저장합니다.

1. 캐시 정책을 사용하도록 배포를 업데이트하려면 다음 명령을 사용합니다. *distribution\$1ID*를 배포 ID로 바꿉니다.

   ```
   aws cloudfront update-distribution --id distribution_ID --cli-input-yaml file://dist-config.yaml
   ```

**캐시 정책을 새 배포에 연결하는 방법(입력 파일이 있는 CLI)**

1. 다음 명령을 사용하여 `distribution.yaml` 명령에 대한 모든 입력 파라미터가 포함된 **create-distribution**이라는 파일을 만듭니다.

   ```
   aws cloudfront create-distribution --generate-cli-skeleton yaml-input > distribution.yaml
   ```

1. 방금 생성한 `distribution.yaml`이라는 파일을 엽니다. 기본 캐시 동작의 `CachePolicyId` 필드에 정책을 생성한 후 기록한 캐시 정책 ID를 입력합니다. 파일을 계속 편집하여 원하는 배포 설정을 지정한 다음 완료되면 파일을 저장합니다.

   배포 설정에 대한 자세한 내용은 [모든 배포 설정 참조](distribution-web-values-specify.md) 단원을 참조하세요.

1. 다음 명령을 사용하여 `distribution.yaml` 파일의 입력 파라미터로 배포를 만듭니다.

   ```
   aws cloudfront create-distribution --cli-input-yaml file://distribution.yaml
   ```

------
#### [ API ]

CloudFront API를 사용하여 캐시 정책을 생성하려면 [CreateCachePolicy](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateCachePolicy.html)를 사용합니다. 이 API 호출에서 지정하는 필드에 대한 자세한 내용은 AWS SDK 또는 기타 API 클라이언트에 대한 [캐시 정책 이해](cache-key-understand-cache-policy.md) 및 API 참조 설명서를 참조하세요.

캐시 정책을 생성한 후 다음 API 호출 중 하나를 사용하여 캐시 동작에 연결할 수 있습니다.
+ 기존 배포의 캐시 동작에 연결하려면 [UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html)을 사용합니다.
+ 새 배포의 캐시 동작에 연결하려면 [CreateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateDistribution.html)을 사용합니다.

이 두 API 호출에 대해 캐시 동작 내의 `CachePolicyId` 필드에 캐시 정책의 ID를 제공합니다. 이러한 API 호출에서 지정하는 다른 필드에 대한 자세한 내용은 [모든 배포 설정 참조](distribution-web-values-specify.md)와 AWS SDK 또는 기타 API 클라이언트에 대한 API 참조 설명서를 참조하세요.

------

# 관리형 캐시 정책 사용
<a name="using-managed-cache-policies"></a>

CloudFront 에서는 배포의 캐시 동작에 연결할 수 있는 일련의 관리형 캐시 정책을 제공합니다. 관리형 캐시 정책을 사용하면 자체 캐시 정책을 작성하거나 유지 관리할 필요가 없습니다. 관리형 정책은 특정 사용 사례에 최적화된 설정을 사용합니다.

관리형 캐시 정책을 사용하려면 배포의 캐시 동작에 이 정책을 연결합니다. 이 프로세스는 캐시 정책을 생성할 때와 동일하지만 새 캐시 정책을 생성하는 대신 관리형 캐시 정책 중 하나를 연결하기만 하면 됩니다. 이름(콘솔 사용) 또는 ID(AWS CLI 또는 SDK 사용)로 정책을 연결합니다. 이름과 ID는 다음 섹션에 나열되어 있습니다.

자세한 내용은 [캐시 정책 생성](cache-key-create-cache-policy.md) 섹션을 참조하세요.

다음 항목에서는 사용할 수 있는 관리형 캐시 정책에 대해 설명합니다.

**Topics**
+ [Amplify](#managed-cache-policy-amplify)
+ [CachingDisabled](#managed-cache-policy-caching-disabled)
+ [CachingOptimized](#managed-cache-caching-optimized)
+ [CachingOptimizedForUncompressedObjects](#managed-cache-caching-optimized-uncompressed)
+ [Elemental-MediaPackage](#managed-cache-policy-mediapackage)
+ [UseOriginCacheControlHeaders](#managed-cache-policy-origin-cache-headers)
+ [UseOriginCacheControlHeaders-QueryStrings](#managed-cache-policy-origin-cache-headers-query-strings)

## Amplify
<a name="managed-cache-policy-amplify"></a>

[CloudFront 콘솔에서 이 정책 보기](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/2e54312d-136d-493c-8eb9-b001f22f67d2)

이 정책은 [AWS Amplify](https://aws.amazon.com/amplify/) 웹 앱인 오리진과 함께 사용하도록 설계되었습니다.

CloudFormation, AWS CLI 또는 CloudFront API를 사용할 때 이 정책의 ID는 다음과 같습니다.

`2e54312d-136d-493c-8eb9-b001f22f67d2`

이 정책에는 다음 설정이 포함되어 있습니다.
+ **최소 TTL:** 2초
+ **최대 TTL:** 600초(10분)
+ **기본 TTL:** 2초
+ **캐시 키에 포함된 헤더:**
  + `Authorization`
  + `CloudFront-Viewer-Country`
  + `Host`

  압축된 객체 캐시 설정이 활성화되어 있기 때문에 정규화된 `Accept-Encoding` 헤더도 포함됩니다. 자세한 내용은 [압축 지원](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)을 참조하세요.
+ **캐시 키에 포함된 쿠키:** 모든 쿠키가 포함됩니다.
+ **캐시 키에 포함된 쿼리 문자열:** 모든 쿼리 문자열이 포함됩니다.
+ **압축된 객체 캐시 설정:** 활성화됨. 자세한 내용은 [압축 지원](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)을 참조하세요.

**주의**  
이 정책의 최소 TTL이 0보다 크므로 오리진 헤더에 `Cache-Control: no-cache`, `no-store` 또는 `private` 지시문이 있더라도 CloudFront는 적어도 캐시 정책의 최소 TTL에 지정된 기간 동안 콘텐츠를 캐싱합니다.

### AWS Amplify Hosting 캐시 정책
<a name="additional-amplify-policies"></a>

Amplify는 다음과 같은 관리형 캐시 정책을 사용하여 고객 애플리케이션의 기본 캐시 구성을 최적화합니다.
+ [Amplify-Default](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/4d1d2f1d-3a71-49ad-9e08-7ea5d843a556)
+ [Amplify-DefaultNoCookies](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/a6bad946-36c3-4c33-aa98-362c74a7fb13)
+ [Amplify-ImageOptimization](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/1c6db51a-a33f-469a-8245-dae26771f530)
+ [Amplify-StaticContent](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/7e5fad67-ee98-4ad0-b05a-394999eefc1a)

**참고**  
이러한 정책은 Amplify에서만 사용됩니다. 이러한 정책을 배포에 사용하지 않는 것이 좋습니다.

Amplify 호스팅 애플리케이션의 캐시 구성 관리에 대한 자세한 내용은 **Amplify Hosting 사용 설명서의 [Managing cache configuration](https://docs.aws.amazon.com/amplify/latest/userguide/caching.html)을 참조하세요.

## CachingDisabled
<a name="managed-cache-policy-caching-disabled"></a>

[CloudFront 콘솔에서 이 정책 보기](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/4135ea2d-6df8-44a3-9df3-4b5a84be39ad)

이 정책은 캐싱을 비활성화합니다. 이 정책은 동적 콘텐츠 및 캐시할 수 없는 요청에 유용합니다.

CloudFormation, AWS CLI 또는 CloudFront API를 사용할 때 이 정책의 ID는 다음과 같습니다.

`4135ea2d-6df8-44a3-9df3-4b5a84be39ad`

이 정책에는 다음 설정이 포함되어 있습니다.
+ **최소 TTL:** 0초
+ **최대 TTL:** 0초
+ **기본 TTL:** 0초
+ **캐시 키에 포함된 헤더:** 없음
+ **캐시 키에 포함된 쿠키:** 없음
+ **캐시 키에 포함된 쿼리 문자열:** 없음
+ **압축된 객체 캐시 설정:** 사용 안 함

## CachingOptimized
<a name="managed-cache-caching-optimized"></a>

[CloudFront 콘솔에서 이 정책 보기](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/658327ea-f89d-4fab-a63d-7e88639e58f6)

이 정책은 CloudFront가 캐시 키에 포함된 값을 최소화하여 캐시 효율성을 최적화하도록 설계되었습니다. CloudFront는 캐시 키에 쿼리 문자열이나 쿠키를 포함하지 않으며 정규화된 `Accept-Encoding` 헤더만 포함합니다. 이렇게 하면 오리진에서 객체를 반환하거나 [CloudFront 엣지 압축](ServingCompressedFiles.md)이 활성화된 경우 CloudFront에서 Gzip 및 Brotli 압축 형식의 객체를 별도로 캐시할 수 있습니다.

CloudFormation, AWS CLI 또는 CloudFront API를 사용할 때 이 정책의 ID는 다음과 같습니다.

`658327ea-f89d-4fab-a63d-7e88639e58f6`

이 정책에는 다음 설정이 포함되어 있습니다.
+ **최소 TTL:** 1초.
+ **최대 TTL:** 31,536,000초(365일).
+ **기본 TTL:** 86,400초(24시간).
+ **캐시 키에 포함된 헤더:** 명시적으로 포함되지 않습니다. 압축된 객체 캐시 설정이 활성화되어 있기 때문에 정규화된 `Accept-Encoding` 헤더가 포함됩니다. 자세한 내용은 [압축 지원](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)을 참조하세요.
+ **캐시 키에 포함된 쿠키:** 없음.
+ **캐시 키에 포함된 쿼리 문자열:** 없음.
+ **압축된 객체 캐시 설정:** 활성화됨. 자세한 내용은 [압축 지원](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)을 참조하세요.

**주의**  
이 정책의 최소 TTL이 0보다 크므로 오리진 헤더에 `Cache-Control: no-cache`, `no-store` 또는 `private` 지시문이 있더라도 CloudFront는 적어도 캐시 정책의 최소 TTL에 지정된 기간 동안 콘텐츠를 캐싱합니다.

## CachingOptimizedForUncompressedObjects
<a name="managed-cache-caching-optimized-uncompressed"></a>

[CloudFront 콘솔에서 이 정책 보기](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/b2884449-e4de-46a7-ac36-70bc7f1ddd6d)

이 정책은 캐시 키에 포함된 값을 최소화하여 캐시 효율성을 최적화하도록 설계되었습니다. 쿼리 문자열, 헤더 또는 쿠키가 포함되지 않습니다. 이 정책은 이전 정책과 동일하지만 압축된 객체 캐시 설정을 비활성화합니다.

CloudFormation, AWS CLI 또는 CloudFront API를 사용할 때 이 정책의 ID는 다음과 같습니다.

`b2884449-e4de-46a7-ac36-70bc7f1ddd6d`

이 정책에는 다음 설정이 포함되어 있습니다.
+ **최소 TTL:** 1초.
+ **최대 TTL:** 31,536,000초(365일).
+ **기본 TTL:** 86,400초(24시간).
+ **캐시 키에 포함된 헤더:** 없음
+ **캐시 키에 포함된 쿠키:** 없음
+ **캐시 키에 포함된 쿼리 문자열:** 없음
+ **압축된 객체 캐시 설정:** 사용 안 함

**주의**  
이 정책의 최소 TTL이 0보다 크므로 오리진 헤더에 `Cache-Control: no-cache`, `no-store` 또는 `private` 지시문이 있더라도 CloudFront는 적어도 캐시 정책의 최소 TTL에 지정된 기간 동안 콘텐츠를 캐싱합니다.

## Elemental-MediaPackage
<a name="managed-cache-policy-mediapackage"></a>

[CloudFront 콘솔에서 이 정책 보기](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/08627262-05a9-4f76-9ded-b50ca2e3a84f)

이 정책은 AWS Elemental MediaPackage 엔드포인트인 오리진과 함께 사용하도록 설계되었습니다.

CloudFormation, AWS CLI 또는 CloudFront API를 사용할 때 이 정책의 ID는 다음과 같습니다.

`08627262-05a9-4f76-9ded-b50ca2e3a84f`

이 정책에는 다음 설정이 포함되어 있습니다.
+ **최소 TTL:** 0초
+ **최대 TTL:** 31,536,000초(365일).
+ **기본 TTL:** 86,400초(24시간).
+ **캐시 키에 포함된 헤더:**
  + `Origin`

  압축된 객체 캐시 설정이 Gzip에 대해 활성화되어 있기 때문에 정규화된 `Accept-Encoding` 헤더도 포함됩니다. 자세한 내용은 [압축 지원](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)을 참조하세요.
+ **캐시 키에 포함된 쿠키:** 없음
+ **캐시 키에 포함된 쿼리 문자열:**
  + `aws.manifestfilter`
  + `start`
  + `end`
  + `m`
+ **압축된 객체 캐시 설정:** Gzip에 대해 활성화되었습니다. 자세한 내용은 [압축 지원](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)을 참조하세요.

## UseOriginCacheControlHeaders
<a name="managed-cache-policy-origin-cache-headers"></a>

[CloudFront 콘솔에서 이 정책 보기](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/83da9c7e-98b4-4e11-a168-04f0df8e2c65)

이 정책은 `Cache-Control` HTTP 응답 헤더를 반환하고 쿼리 문자열에 있는 값에 따라 다른 콘텐츠를 제공하지 않는 오리진에 사용하도록 설계되었습니다. 오리진이 이 쿼리 문자열에 있는 값을 기반으로 하여 다른 콘텐츠를 제공하는 경우 [UseOriginCacheControlHeaders-QueryStrings](#managed-cache-policy-origin-cache-headers-query-strings)를 사용합니다.

CloudFormation, AWS CLI 또는 CloudFront API를 사용할 때 이 정책의 ID는 다음과 같습니다.

`83da9c7e-98b4-4e11-a168-04f0df8e2c65`

이 정책에는 다음 설정이 포함되어 있습니다.
+ **최소 TTL:** 0초
+ **최대 TTL:** 31,536,000초(365일).
+ **기본 TTL:** 0초
+ **캐시 키에 포함된 헤더:**
  + `Host`
  + `Origin`
  + `X-HTTP-Method-Override`
  + `X-HTTP-Method`
  + `X-Method-Override`

  압축된 객체 캐시 설정이 활성화되어 있기 때문에 정규화된 `Accept-Encoding` 헤더도 포함됩니다. 자세한 내용은 [압축 지원](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)을 참조하세요.
+ **캐시 키에 포함된 쿠키:** 모든 쿠키가 포함됩니다.
+ **캐시 키에 포함된 쿼리 문자열:** 없음.
+ **압축된 객체 캐시 설정:** 활성화됨. 자세한 내용은 [압축 지원](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)을 참조하세요.

## UseOriginCacheControlHeaders-QueryStrings
<a name="managed-cache-policy-origin-cache-headers-query-strings"></a>

[CloudFront 콘솔에서 이 정책 보기](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/4cc15a8a-d715-48a4-82b8-cc0b614638fe)

이 정책은 `Cache-Control` HTTP 응답 헤더를 반환하고 쿼리 문자열에 있는 값에 따라 다른 콘텐츠를 제공하는 오리진에 사용하도록 설계되었습니다. 오리진이 이 쿼리 문자열에 있는 값을 기반으로 하여 다른 콘텐츠를 제공하지 는 경우 [UseOriginCacheControlHeaders](#managed-cache-policy-origin-cache-headers)를 사용합니다.

CloudFormation, AWS CLI 또는 CloudFront API를 사용할 때 이 정책의 ID는 다음과 같습니다.

`4cc15a8a-d715-48a4-82b8-cc0b614638fe`

이 정책에는 다음 설정이 포함되어 있습니다.
+ **최소 TTL:** 0초
+ **최대 TTL:** 31,536,000초(365일).
+ **기본 TTL:** 0초
+ **캐시 키에 포함된 헤더:**
  + `Host`
  + `Origin`
  + `X-HTTP-Method-Override`
  + `X-HTTP-Method`
  + `X-Method-Override`

  압축된 객체 캐시 설정이 활성화되어 있기 때문에 정규화된 `Accept-Encoding` 헤더도 포함됩니다. 자세한 내용은 [압축 지원](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)을 참조하세요.
+ **캐시 키에 포함된 쿠키:** 모든 쿠키가 포함됩니다.
+ **캐시 키에 포함된 쿼리 문자열:** 모든 쿼리 문자열이 포함됩니다.
+ **압축된 객체 캐시 설정:** 활성화됨. 자세한 내용은 [압축 지원](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)을 참조하세요.

# 캐시 키 이해
<a name="understanding-the-cache-key"></a>

*캐시 키*는 CloudFront 엣지 로케이션에 대한 최종 사용자 요청으로 *캐시 적중*이 발생하는지 여부를 확인합니다. 캐시 키는 캐시에 있는 객체의 고유 식별자입니다. 각 캐시 객체에는 고유한 캐시 키가 있습니다.

캐시 적중은 최종 사용자 요청이 이전 요청과 동일한 캐시 키를 생성하고 해당 캐시 키의 객체가 엣지 로케이션 캐시에 있고 유효할 때 발생합니다. 캐시 적중이 있는 경우, 요청된 객체가 CloudFront 엣지 로케이션에서 최종 사용자에게 제공되므로 다음과 같은 이점이 있습니다.
+ 오리진 서버의 부하 감소
+ 최종 사용자에 대한 지연 시간 감소

*캐시 적중률*이 높으면(최종 사용자 요청 비율이 높을수록 캐시 적중이 발생함) 웹 사이트 또는 애플리케이션 성능이 향상될 수 있습니다. 캐시 적중률을 향상시키는 한 가지 방법은 캐시 키에 필요한 최소 값만 포함시키는 것입니다. 자세한 내용은 다음 단원을 참조하세요.

[캐시 정책](controlling-the-cache-key.md)을 사용하여 캐시 키의 값(URL 쿼리 문자열, HTTP 헤더 및 쿠키)을 수정할 수 있습니다. (뷰어 요청에서 [Lambda@Edgefunction](lambda-at-the-edge.md) 또는 [CloudFront Functions](cloudfront-functions.md)을 사용하여 캐시 키를 수정할 수도 있습니다.) 캐시 키를 수정하기 전에 애플리케이션의 설계 방식과 최종 사용자 요청의 특성에 따라 다양한 응답을 제공할 수 있는 시기 및 방법을 이해하는 것이 중요합니다. 최종 사용자 요청 값으로 오리진에서 반환하는 응답을 확인하는 경우 해당 값을 캐시 키에 포함해야 합니다. 그러나 오리진이 반환하는 응답에 영향을 미치지 않는 값을 캐시 키에 포함하면 중복 객체를 캐시하게 될 수 있습니다.

## 기본 캐시 키
<a name="cache-key-default"></a>

기본적으로 CloudFront 배포의 캐시 키에는 다음 정보가 포함됩니다.
+ CloudFront 배포의 도메인 이름(예: d111111abcdef8.cloudfront.net)
+ 요청된 객체의 URL 경로(예: `/content/stories/example-story.html`)

**참고**  
`OPTIONS` 메서드는 `OPTIONS` 요청에 대한 캐시 키에 포함됩니다. 이는 `OPTIONS` 요청에 대한 응답이 `GET` 및 `HEAD` 요청에 대한 응답과 별도로 캐시됨을 의미합니다.

최종 사용자 요청의 다른 값은 기본적으로 캐시 키에 포함되지 않습니다. 웹 브라우저의 다음 HTTP 요청을 검토합니다.

```
            GET /content/stories/example-story.html?ref=0123abc&split-pages=false HTTP/1.1
            Host: d111111abcdef8.cloudfront.net
            User-Agent: Mozilla/5.0 Gecko/20100101 Firefox/68.0
            Accept: text/html,*/*
            Accept-Language: en-US,en
            Cookie: session_id=01234abcd
            Referer: https://news.example.com/
```

CloudFront 엣지 로케이션에 이 최종 사용자 요청이 수신되면 CloudFront는 캐시 키를 사용하여 캐시 적중 여부를 확인합니다. 기본적으로 요청의 다음 구성 요소만 캐시 키 `/content/stories/example-story.html` 및 `d111111abcdef8.cloudfront.net`에 포함됩니다. 요청된 객체가 캐시에 없으면(캐시 누락) CloudFront는 오리진에 요청을 보내 객체를 가져옵니다. 객체를 가져온 후 CloudFront는 최종 사용자에게 반환하고 엣지 로케이션의 캐시에 저장합니다.

CloudFront가 캐시 키에 의해 확인된 동일한 객체에 대한 다른 요청을 수신하면 CloudFront는 오리진에 요청을 보내지 않고 캐싱된 객체를 최종 사용자에게 즉시 제공합니다. 예를 들어, 이전 요청 이후에 들어오는 다음 HTTP 요청을 검토합니다.

```
            GET /content/stories/example-story.html?ref=xyz987&split-pages=true HTTP/1.1
            Host: d111111abcdef8.cloudfront.net
            User-Agent: Mozilla/5.0 AppleWebKit/537.36 Chrome/83.0.4103.116
            Accept: text/html,*/*
            Accept-Language: en-US,en
            Cookie: session_id=wxyz9876
            Referer: https://rss.news.example.net/
```

이 요청은 이전 요청과 동일한 객체에 대한 요청이지만 이전 요청과는 다릅니다. URL 쿼리 문자열, `User-Agent` 및 `Referer` 헤더 및 `session_id` 쿠키가 다릅니다. 그러나 기본적으로 이러한 값은 캐시 키의 일부가 아니므로 이 두 번째 요청으로 인해 캐시 적중이 발생합니다.

## 캐시 키 사용자 지정
<a name="cache-key-custom"></a>

경우에 따라 캐시 적중이 줄어들더라도 캐시 키에 더 많은 정보를 포함하고 싶을 수도 있습니다. [캐시 정책](controlling-the-cache-key.md)을 사용하여 캐시 키에 포함할 항목을 지정합니다.

예를 들어 오리진 서버에서 최종 사용자 요청의 `Accept-Language` HTTP 헤더를 사용하여 최종 사용자 언어에 따라 다른 콘텐츠를 반환하는 경우 이 헤더를 캐시 키에 포함할 수 있습니다. 이렇게 하면 CloudFront에서는 이 헤더를 사용하여 캐시 적중을 확인하고 *오리진 요청*(캐시 누락이 있을 때 CloudFront가 오리진으로 보내는 요청)에 헤더를 포함합니다.

캐시 키에 추가 값을 포함하면 최종 사용자 요청에서 발생할 수 있는 변형 때문에 CloudFront에서 중복 객체를 캐시할 수 있습니다. 예를 들어 최종 사용자는 `Accept-Language` 헤더에 대해 다음 값 중 하나를 보낼 수 있습니다.
+ `en-US,en`
+ `en,en-US`
+ `en-US, en`
+ `en-US`

이 모든 다양한 값은 최종 사용자 언어가 영어라는 것을 나타내지만 변형으로 인해 CloudFront에서 동일한 객체를 여러 번 캐시할 수 있습니다. 이렇게 하면 캐시 적중을 줄이고 오리진 요청 수를 늘릴 수 있습니다. 캐시 키에 `Accept-Language` 헤더를 포함하지 않고 다른 언어로 된 콘텐츠에 서로 다른 URL을 사용하도록 웹 사이트 또는 애플리케이션을 구성하여 이러한 중복을 피할 수 있습니다(예: `/en-US/content/stories/example-story.html`).

캐시 키에 포함하려는 특정 값의 경우, 최종 사용자 요청에 나타날 수 있는 해당 값의 변형 수를 이해하는지 확인해야 합니다. 캐시 키에 특정 요청 값을 포함하는 것은 큰 의미가 없습니다. 예를 들어 `User-Agent` 헤더에는 수천 개의 고유한 변형이 있을 수 있으므로 일반적으로 캐시 키에 포함하기에는 적합하지 않습니다. 사용자별 또는 세션별 값이 있으며 수천(또는 수백만) 개의 요청에 걸쳐 고유한 쿠키도 캐시 키에 포함하기에는 적합하지 않습니다. 캐시 키에 이러한 값을 포함하면 고유한 각 변형으로 인해 캐시에 객체의 다른 복사본이 생성됩니다. 이 객체 복사본이 고유하지 않거나 객체 수가 너무 많아서 객체마다 캐시 적중 횟수가 적으면 다른 방법을 고려해 보는 것이 좋습니다. 변수가 많은 값을 캐시 키에서 제외하거나 객체를 캐시에 사용할 수 없도록 표시할 수 있습니다.

캐시 키를 사용자 지정할 때는 주의하세요. 경우에 따라 중복 객체를 캐시하고 캐시 적중률을 낮추며 오리진 요청 횟수를 늘리는 등의 의도하지 않은 결과가 발생할 수 있습니다. 오리진 웹 사이트 또는 애플리케이션에서 분석, 원격 측정 또는 기타 용도에 대한 최종 사용자 요청의 특정 값을 수신해야 하지만 이 값이 오리진에서 반환하는 객체를 변경하지 않는 경우, [오리진 요청 정책](controlling-origin-requests.md)을 사용하여 이 값을 오리진 요청에 포함하지만 캐시 키에는 포함하지 *않습니다*.