

# CloudFront가 배포하는 콘텐츠 추가, 제거 또는 교체
<a name="AddRemoveReplaceObjects"></a>

이 단원에서는 최종 사용자에게 제공하려는 콘텐츠를 CloudFront가 액세스할 수 있게 하는 방법, 웹 사이트 또는 애플리케이션에서 객체를 지정하는 방법, 콘텐츠를 제거하거나 바꾸는 방법을 대해 설명합니다.

**Topics**
+ [CloudFront가 배포하는 콘텐츠 추가 및 액세스](#AddingObjects)
+ [파일 버전 관리를 사용하여 CloudFront 배포에서 콘텐츠 업데이트 또는 제거](UpdatingExistingObjects.md)
+ [CloudFront에서 파일에 대한 URL 형식 사용자 지정](LinkFormat.md)
+ [기본 루트 객체 지정](DefaultRootObject.md)
+ [파일을 무효화하여 콘텐츠 제거](Invalidation.md)
+ [압축된 파일 제공](ServingCompressedFiles.md)

## CloudFront가 배포하는 콘텐츠 추가 및 액세스
<a name="AddingObjects"></a>

CloudFront가 콘텐츠(객체)를 배포하게 하려면, 배포를 위해 지정한 오리진 중 하나에 파일을 추가하고 파일에 대한 CloudFront 링크를 공개합니다. CloudFront 엣지 로케이션은 파일에 대한 최종 사용자 요청을 받기 전까지는 오리진으로부터 새 파일을 가져오지 않습니다. 자세한 내용은 [CloudFront에서 콘텐츠를 제공하는 방법](HowCloudFrontWorks.md) 단원을 참조하세요.

CloudFront에서 배포하려는 파일을 추가하는 경우, 배포에 지정된 Amazon S3 버킷 중 하나에 이를 추가해야 하고 사용자 오리진의 경우 지정된 도메인의 디렉터리에 이를 추가해야 합니다. 또한 해당 캐시 동작의 경로 패턴에서 정확한 오리진에 요청을 전송하는지 확인합니다.

예를 들어, 캐시 동작의 경로 패턴이 `*.html`이라고 가정합니다. 이 오리진으로 요청을 전송하도록 구성된 다른 캐시 동작이 없는 경우 CloudFront는 `*.html` 파일만 전송합니다. 예를 들어, 이 시나리오에서 CloudFront는 오리진에 업로드한 .jpg 파일을 배포하지 않습니다. .jpg 파일을 포함하는 캐시 동작을 생성하지 않았기 때문입니다.

CloudFront 서버는 제공하는 객체의 MIME 형식을 확인하지 않습니다. 오리진에 파일을 업로드할 경우 이 파일에 대한 `Content-Type` 헤더 필드를 설정하는 것이 좋습니다.

# 파일 버전 관리를 사용하여 CloudFront 배포에서 콘텐츠 업데이트 또는 제거
<a name="UpdatingExistingObjects"></a>

CloudFront에서 배포하도록 설정된 기존 콘텐츠를 업데이트하려면 파일 이름 또는 폴더 이름에 버전 식별자를 사용하는 것이 좋습니다. 이를 통해 CloudFront에서 제공하는 콘텐츠 관리에 대한 제어를 강화할 수 있습니다.

## 버전이 지정된 파일 이름을 사용하여 기존 파일 업데이트
<a name="ReplacingObjects"></a>

CloudFront 배포의 기존 파일을 업데이트할 경우, 콘텐츠를 보다 잘 제어할 수 있도록 파일 이름 또는 디렉터리 이름에 일종의 버전 식별자를 포함하는 것이 좋습니다. 이 식별자는 날짜-타임스탬프, 일련 번호 또는 동일 객체의 두 버전을 식별하는 기타 방법이 될 수 있습니다.

예를 들어, 그래픽 파일의 이름을 image.jpg라고 지정하는 대신 image\$11.jpg라고 할 수 있습니다. 이 파일의 새 버전 제공을 시작하려는 경우, 새 파일의 이름을 image\$12.jpg라고 지정하고 image\$12.jpg 파일을 가리키도록 웹 애플리케이션 또는 웹 사이트의 링크를 업데이트할 수 있습니다. 또는, images\$1v1 디렉터리에 모든 그래픽 파일을 넣을 수 있으며 그래픽 파일 하나 이상의 새 버전 제공을 시작하려는 경우 새 images\$1v2 디렉터리를 만들고 이 디렉터리를 가리키도록 링크를 업데이트할 수 있습니다. 버전 관리를 사용하면 CloudFront에서 새 버전의 객체 제공을 시작하기 전에 객체가 만료될 때까지 기다릴 필요가 없으며, 객체 무효화에 비용을 지불할 필요도 없습니다.

파일의 버전을 관리하는 경우라도 만료 날짜는 설정하는 것이 좋습니다. 자세한 내용은 [콘텐츠가 캐시에 유지되는 기간(만료) 관리](Expiration.md) 단원을 참조하세요.

**참고**  
버전이 지정된 파일 이름 또는 디렉터리 이름을 지정하는 것은 Amazon S3 객체 버전 관리와는 관련이 없습니다.

## CloudFront가 콘텐츠를 배포하지 않도록 콘텐츠 제거
<a name="RemovingObjects"></a>

CloudFront 배포에 더 이상 포함시키지 않으려는 오리진에서 파일을 제거할 수 있습니다. 하지만 CloudFront는 파일이 만료될 때까지 엣지 캐시의 콘텐츠를 최종 사용자에게 계속 표시합니다.

파일을 즉시 제거하려면 다음 방법 중 하나를 사용해야 합니다.
+ **파일 버전 관리를 사용합니다.** 버전 관리를 사용하는 경우 한 파일의 여러 버전은 서로 다른 이름을 사용합니다. CloudFront 배포에 이 이름을 사용하여 최종 사용자에게 반환되는 파일을 변경할 수 있습니다. 자세한 내용은 [버전이 지정된 파일 이름을 사용하여 기존 파일 업데이트](#ReplacingObjects) 섹션을 참조하세요.
+ **파일을 무효화합니다.** 자세한 내용은 [파일을 무효화하여 콘텐츠 제거](Invalidation.md) 섹션을 참조하세요.

# CloudFront에서 파일에 대한 URL 형식 사용자 지정
<a name="LinkFormat"></a>

CloudFront가 최종 사용자에게 제공하게 하려는 객체(콘텐츠)와 함께 오리진을 설정한 후, 올바른 URL을 사용하여 웹 사이트 또는 애플리케이션 코드에 해당 객체를 참조해야 CloudFront가 객체를 제공할 수 있습니다.

웹 페이지 또는 웹 애플리케이션에서 객체의 URL에 사용하는 도메인 이름은 다음 중 하나일 수 있습니다.
+ 배포를 생성할 때 CloudFront에서 자동으로 할당하는 도메인 이름(예: `d111111abcdef8.cloudfront.net`)
+ 고유의 도메인 이름(예: `example.com`)

예를 들어, 다음 URL 중 하나를 사용하여 `image.jpg` 파일을 반환할 수 있습니다.

`https://d111111abcdef8.cloudfront.net/images/image.jpg`

`https://example.com/images/image.jpg`

콘텐츠를 Amazon S3 버킷에 저장하든 사용자 지정 오리진(예: 자체 웹 서버 중 하나)에 저장하든 상관없이 동일한 URL 형식을 사용합니다.

**참고**  
URL 형식은 배포에서 **Origin Path**(오리진 경로)에 지정하는 값에 따라 부분적으로 달라집니다. 이 값은 CloudFront에 객체의 최상위 디렉터리 경로를 제공합니다. 배포를 생성할 때 오리진 경로를 설정하는 방법에 대한 자세한 내용은 [오리진 경로](DownloadDistValuesOrigin.md#DownloadDistValuesOriginPath) 섹션을 참조하세요.

URL 형식에 대한 자세한 내용은 다음 단원을 참조하십시오.

## 고유의 도메인 이름 사용(example.com)
<a name="LinkFormat_OwnDomain"></a>

배포를 생성할 때 CloudFront에서 할당하는 기본 도메인 이름을 사용하는 대신, `example.com`과 같은 [대체 도메인 이름을 추가](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html#DownloadDistValuesCNAME)할 수 있습니다. CloudFront를 사용하여 고유의 도메인 이름을 설정하면 배포에서 객체에 이와 같은 URL을 사용할 수 있습니다.

`https://example.com/images/image.jpg`

최종 사용자와 CloudFront 간에 HTTPS를 사용하려는 경우 [대체 도메인 이름과 HTTPS 사용](using-https-alternate-domain-names.md) 단원을 참조하세요.

## URL에서 후행 슬래시(/) 사용
<a name="LinkFormat_TrailingSlash"></a>

CloudFront 배포에서 디렉터리에 대한 URL을 지정할 때 후행 슬래시를 항상 사용하거나 후행 슬래시를 사용하지 않도록 선택합니다. 예를 들어, 모든 URL에 대해 다음 형식 중 하나만 선택합니다.

`https://d111111abcdef8.cloudfront.net/images/`

`https://d111111abcdef8.cloudfront.net/images`

**이 선택이 중요한 이유**

두 형식 모두 CloudFront 객체에 연결할 수 있지만, 형식을 일치시키면 나중에 디렉터리를 무효화하려는 경우 문제를 방지할 수 있습니다. CloudFront는 후행 슬래시를 포함하여 지정된 그대로 URL을 저장합니다. 따라서 형식이 일치하지 않는 경우 CloudFront에서 디렉터리가 확실히 제거되도록 슬래시가 있는 디렉터리 URL과 슬래시가 없는 디렉터리 URL을 모두 무효화해야 합니다.

두 URL 형식을 모두 무효화하는 작업은 불편하며 추가 비용이 발생할 수 있습니다. 두 가지 유형의 URL을 모두 처리하기 위해 무효화를 중복해서 수행해야 하는 경우 해당 월에 허용되는 무료 무효화의 최대 수를 초과할 수 있기 때문입니다. 그리고 이러한 경우 CloudFront에 각 디렉터리 URL의 형식이 하나만 있더라도 모든 무효화 요금을 지불해야 합니다.

## 제한된 콘텐츠에 대한 서명된 URL 생성
<a name="LinkFormat_SignedURLs"></a>

액세스를 제한하려는 콘텐츠가 있는 경우 서명된 URL을 생성할 수 있습니다. 예를 들어, 인증한 사용자에게만 콘텐츠를 배포하려는 경우 지정된 기간 동안에만 유효하거나 지정된 IP 주소에서만 사용할 수 있는 URL을 생성할 수 있습니다. 자세한 내용은 [서명된 URL과 서명된 쿠키를 사용하여 프라이빗 콘텐츠 제공](PrivateContent.md) 섹션을 참조하세요.

# 기본 루트 객체 지정
<a name="DefaultRootObject"></a>

사용자(뷰어)가 배포의 객체가 아닌 배포의 루트 URL을 요청할 경우, 특정 객체(기본 루트 객체)를 반환하도록 CloudFront를 구성할 수 있습니다. 기본 루트 객체를 사용하면 배포 콘텐츠가 노출되지 않게 할 수 있습니다.

**Contents**
+ [기본 루트 객체를 지정하는 방법](#DefaultRootObjectHowToDefine)
+ [기본 루트 객체 작동 방식](#DefaultRootObjectHow)
+ [루트 객체를 정의하지 않을 경우 CloudFront의 작동 방식](#DefaultRootObjectNotSet)

## 기본 루트 객체를 지정하는 방법
<a name="DefaultRootObjectHowToDefine"></a>

배포의 콘텐츠가 노출되거나 오류가 반환되는 것을 방지하려면 배포에 대한 기본 루트 객체를 지정합니다. 정확한 파일 이름 또는 파일의 경로를 지정할 수 있습니다. 예를 들어 루트 객체가 `index.html` 파일인 경우 해당 파일 이름을 지정할 수 있습니다. `index.html` 파일이 다른 폴더에 있는 경우 대신 경로를 지정합니다(예: `exampleFolderName/index.html`). 경로를 기본 루트 객체로 설정하면 배포의 루트 URL에 대한 뷰어 요청은 해당 경로에서 지정된 파일을 반환합니다. 기본 루트 객체가 루트 수준 대신 폴더에 있을 수 있으므로 파일 경로를 사용하여 오리진에서 콘텐츠를 보다 유연하게 구성할 수 있습니다.<a name="DefaultRootObjectProcedure"></a>

**배포에 대한 기본 루트 객체를 지정하려면**

1. 배포에서 가리키는 오리진에 기본 루트 객체를 업로드합니다.

   파일은 CloudFront에서 지원하는 모든 유형이 가능합니다. 파일 이름에 대한 제한 사항 목록을 보려면 *Amazon CloudFront API 참조*에 나와 있는 [DistributionConfig](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_DistributionConfig.html) 섹션에서 `DefaultRootObject` 요소를 참조하시기 바랍니다.
**참고**  
기본 루트 객체의 파일 이름이 너무 길거나 유효하지 않은 문자가 포함된 경우, CloudFront에서는 `HTTP 400 Bad Request - InvalidDefaultRootObject` 오류를 반환합니다. 또한 CloudFront에서는 10초(기본값) 동안 코드를 캐싱하고 결과를 액세스 로그에 작성합니다.

1. 객체에 대한 권한이 CloudFront에 최소 읽기 액세스 권한을 부여하는지 확인합니다.

   Amazon S3 권한에 대한 자세한 내용은 *Amazon Simple Storage Service 사용 설명서*의 [Amazon S3의 Identity and Access Management](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html)를 참조하세요.

1. CloudFront 콘솔 또는 CloudFront API를 사용하여 기본 루트 객체를 참조하는 배포를 업데이트합니다.

   CloudFront 콘솔을 사용하여 기본 루트 객체를 지정하려면 다음과 같이 합니다.

   1. AWS Management Console에 로그인한 다음 [https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home)에서 CloudFront 콘솔을 엽니다.

   1. 상단 창의 배포 목록에서 업데이트하려는 배포를 선택합니다.

   1. **설정** 창의 **일반** 탭에서 **편집**을 선택하세요.

   1. **설정 편집** 대화 상자의 **기본 루트 객체** 필드에 기본 루트 객체의 파일 이름을 입력합니다.
**작은 정보**  
문자열은 슬래시(`/`)로 시작할 수 없습니다. 객체 이름 또는 객체의 경로만 지정합니다. 예는 `index.html` 또는 `exampleFolderName/index.html` 섹션을 참조하세요. `/exampleFolderName/index.html` 또는 `/index.html`을 지정하면 [403 액세스 거부됨 오류](http-403-permission-denied.md)가 발생할 수 있습니다.

   1. **변경 사항 저장**을 선택합니다.

   CloudFront API를 사용하여 구성을 업데이트하려면 배포에서 `DefaultRootObject` 요소의 값을 지정합니다. CloudFront API를 사용한 기본 루트 객체 지정에 대한 자세한 내용은 *Amazon CloudFront API 참조*의 [DistributionConfig](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html)를 참조하세요.

1. 루트 URL을 요청하여 기본 루트 객체를 활성화했는지 확인합니다. 브라우저에 기본 루트 객체가 표시되지 않는 경우 다음 단계를 수행합니다.

   1. CloudFront 콘솔에서 배포의 상태를 확인하여 배포가 모두 완료되었는지 확인합니다.

   1. 2단계와 3단계를 반복하여 올바른 권한을 부여하고 기본 루트 객체를 지정하는 배포 구성을 올바르게 업데이트했는지 확인합니다.

## 기본 루트 객체 작동 방식
<a name="DefaultRootObjectHow"></a>

예를 들어 다음 요청은 `image.jpg` 객체를 가리킵니다.

`https://d111111abcdef8.cloudfront.net/image.jpg`

반면에, 다음 요청은 특정 객체 대신에 앞 예제와 동일한 배포의 루트 URL을 가리킵니다.

`https://d111111abcdef8.cloudfront.net/`

기본 루트 객체를 정의한 경우 배포의 루트를 호출하는 최종 사용자 요청은 기본 루트 객체를 반환합니다. 예를 들어, `index.html` 파일을 기본 루트 객체로 지정하는 경우, 그에 대한 요청은 다음과 같습니다.

`https://d111111abcdef8.cloudfront.net/`

반환 형식:

`https://d111111abcdef8.cloudfront.net/index.html`

**참고**  
CloudFront는 여러 개의 후행 슬래시가 있는 URL(`https://d111111abcdef8.cloudfront.net///`)이 `https://d111111abcdef8.cloudfront.net/`와 동일한지 여부를 확인하지 않습니다. 오리진 서버가 이러한 비교를 수행합니다.

기본 루트 객체를 정의한 경우 배포의 하위 디렉터리에 대한 최종 사용자 요청은 기본 루트 객체를 반환하지 않습니다. 예를 들어, `index.html`이 기본 루트 객체이고 CloudFront에서 CloudFront 배포 아래의 `install` 디렉터리에 대한 최종 사용자 요청을 받았다고 가정합니다.

`https://d111111abcdef8.cloudfront.net/install/`

`index.html`의 사본이 `install` 디렉터리에 나타나더라도 CloudFront에서는 기본 루트 객체를 반환하지 않습니다. 하지만 기본 루트 객체에 대한 *경로*를 지정한 경우 (`install/index.html`)CloudFront는 `install` 디렉터리의 최종 사용자 요청에 대해 기본 루트 객체를 반환합니다.

CloudFront에서 지원되는 모든 HTTP 메서드를 허용하도록 배포를 구성한 경우, 기본 루트 객체는 모든 메서드에 적용됩니다. 예를 들어 기본 루트 객체가 index.php이고 `POST` 요청을 도메인(https://example.com)의 루트에 제출하도록 애플리케이션을 작성한 경우, CloudFront에서는 요청을 https://example.com/index.php로 보냅니다.

CloudFront 기본 루트 객체의 동작은 Amazon S3 인덱스 문서의 동작과는 다릅니다. Amazon S3 버킷을 웹 사이트로 구성하고 인덱스 문서를 지정한 경우, 사용자가 버킷의 하위 디렉터리를 요청하더라도 Amazon S3에서는 인덱스 문서를 반환합니다. (인덱스 문서의 사본은 모든 하위 디렉터리에 나타나야 합니다.) Amazon S3 버킷을 웹 사이트로 구성하는 방법과 인덱스 문서에 대한 자세한 내용은 *Amazon Simple Storage Service 사용 설명서*의 [Amazon S3에서 웹 사이트 호스팅](https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteHosting.html) 단원을 참조하세요.

**중요**  
기본 루트 객체는 CloudFront 배포에만 적용된다는 점에 유의하세요. 이 경우에도 오리진의 보안은 관리해야 합니다. 예를 들어, Amazon S3 오리진을 사용하는 경우, Amazon S3 버킷 ACL을 적절히 설정하여 버킷에 대해 원하는 액세스 수준을 보장해야 합니다.

## 루트 객체를 정의하지 않을 경우 CloudFront의 작동 방식
<a name="DefaultRootObjectNotSet"></a>

기본 루트 객체를 정의하지 않은 경우, 배포의 루트에 대한 요청은 오리진 서버로 전달됩니다. Amazon S3 오리진을 사용하는 경우 다음 중 하나가 반환될 수 있습니다.
+ **Amazon S3 버킷의 콘텐츠 목록** - 다음 조건 중 하나에 해당하는 경우 오리진의 콘텐츠가 CloudFront를 사용하여 배포에 액세스하는 사람에게 표시됩니다.
  + 버킷이 적절하게 구성되지 않았습니다.
  + 배포에 연결된 버킷과 이 버킷에 있는 객체에 대한 Amazon S3 권한은 *모두*에 대한 액세스 권한을 부여합니다.
  + 최종 사용자가 오리진 루트 URL을 사용하여 오리진에 액세스합니다.
+ **오리진의 비공개 콘텐츠 목록** - 비공개 배포(사용자 및 CloudFront에만 액세스 권한이 있음)로 오리진을 구성하는 경우, 배포에 연결된 Amazon S3 버킷의 콘텐츠는 CloudFront를 통해 배포에 액세스하는 자격 증명을 가진 모두에게 표시됩니다. 이러한 경우 사용자는 오리진 루트 URL을 통해 콘텐츠에 액세스할 수 없습니다. 비공개 콘텐츠를 배포하는 방법에 대한 자세한 내용은 [서명된 URL과 서명된 쿠키를 사용하여 프라이빗 콘텐츠 제공](PrivateContent.md)를 참조하십시오.
+ `Error 403 Forbidden` - 배포에 연결된 Amazon S3 버킷에 대한 권한이나 이 버킷에 있는 객체에 대한 권한이 CloudFront 및 모두에 대한 액세스를 거부하는 경우, CloudFront에서는 이 오류를 반환합니다.

# 파일을 무효화하여 콘텐츠 제거
<a name="Invalidation"></a>

CloudFront 엣지 캐시에서 파일이 만료되기 전에 파일을 제거해야 할 경우, 다음 방법 중 하나를 사용하면 됩니다.
+ 엣지 캐시에서 파일을 무효화합니다. 다음에 최종 사용자가 파일을 요청하면 CloudFront는 최신 버전의 파일을 가져오도록 오리진에 반환합니다.
+ 파일 버전 관리를 사용하여 서로 다른 이름을 가진 여러 버전의 파일을 제공합니다. 자세한 내용은 [버전이 지정된 파일 이름을 사용하여 기존 파일 업데이트](UpdatingExistingObjects.md#ReplacingObjects) 섹션을 참조하세요.

**Topics**
+ [파일을 무효화하는 방법과 버전이 지정된 파일 이름을 사용하는 방법 중에 선택](#Invalidation_Expiration)
+ [무효화할 파일 결정](invalidation-access-logs.md)
+ [파일 무효화 시 알아야 할 사항](invalidation-specifying-objects.md)
+ [파일 무효화](Invalidation_Requests.md)
+ [동시 무효화 요청 최대값](InvalidationLimits.md)
+ [파일 무효화에 대한 요금 결제](PayingForInvalidation.md)

## 파일을 무효화하는 방법과 버전이 지정된 파일 이름을 사용하는 방법 중에 선택
<a name="Invalidation_Expiration"></a>

배포가 제공하는 파일의 버전을 제어하는 방법에는 파일을 무효화하는 방법과, 버전 지정된 파일 이름을 제공하는 방법이 있습니다. 파일을 자주 업데이트하려는 경우, 기본적으로 파일 버전 관리를 사용하는 것이 좋습니다. 그 이유는 다음과 같습니다.
+ 버전 관리를 사용하면 사용자가 로컬에 또는 회사 캐싱 프록시 뒤에 캐싱된 버전을 가지고 있더라도 요청이 반환하는 파일을 제어할 수 있습니다. 파일을 무효화하면 파일이 해당 캐시에서 만료될 때까지는 사용자에게 이전 버전이 계속 표시될 수 있습니다.
+ 버전 관리를 통해 파일 변경의 결과를 더 쉽게 분석할 수 있도록 CloudFront 액세스 로그에는 파일의 이름이 포함됩니다.
+ 버전 관리를 사용하면 서로 다른 사용자에게 여러 버전의 파일을 제공할 수 있습니다.
+ 버전 관리를 통해 파일 개정 버전을 손쉽게 앞 버전이나 뒤 버전으로 이동할 수 있습니다.
+ 버전 관리는 비용이 저렴합니다. CloudFront가 새 버전의 파일을 엣지 로케이션에 전송하게 하려면 요금이 발생하지만, 파일 무효화에 대해서는 요금을 지불할 필요가 없습니다.

파일 버전 관리에 대한 자세한 내용은 [버전이 지정된 파일 이름을 사용하여 기존 파일 업데이트](UpdatingExistingObjects.md#ReplacingObjects) 단원을 참조하십시오.

# 무효화할 파일 결정
<a name="invalidation-access-logs"></a>

특정 디렉터리에 있는 모든 파일이나 같은 문자로 시작하는 이름을 가진 모든 파일 등 여러 파일을 무효화하려는 경우, 무효화 경로의 끝에 `*` 와일드카드를 포함시키면 됩니다. `*` 와일드카드 사용에 대한 자세한 내용은 [Invalidation paths](invalidation-specifying-objects.md#invalidation-specifying-objects-paths) 단원을 참조하십시오.

파일을 무효화하려면 개별 파일에 대한 경로나 `*` 와일드카드로 끝나는 경로 중에 지정할 수 있습니다. 이는 다음 예에 나와 있듯 각각 하나의 파일 또는 여러 파일에 적용됩니다.
+ `/images/image1.jpg`
+ `/images/image*`
+ `/images/*`

선택한 파일을 무효화하려 하지만 사용자가 오리진의 모든 파일에 반드시 액세스할 필요가 없는 경우, CloudFront에서 최종 사용자가 요청한 파일을 확인하여 그러한 파일만 무효화할 수 있습니다. 최종 사용자가 요청한 파일을 확인하려면 CloudFront 액세스 로깅을 활성화합니다. 액세스 로그에 대한 자세한 내용은 [액세스 로그(표준 로그)](AccessLogs.md) 단원을 참조하십시오.

# 파일 무효화 시 알아야 할 사항
<a name="invalidation-specifying-objects"></a>

무효화할 파일을 지정할 때 다음 정보를 참조합니다.

**대소문자 구분**  
무효화 경로는 대/소문자를 구분합니다. 예를 들어 `/images/image.jpg` 및 `/images/Image.jpg`는 서로 다른 두 파일을 지정합니다.

**Lambda 함수를 사용하여 URI 변경**  
CloudFront 배포가 최종 사용자 요청 이벤트에서 Lambda 함수를 트리거하고 해당 함수가 요청된 파일의 URI를 변경하는 경우 CloudFront 엣지 캐시에서 파일을 제거하려면 두 URI를 모두 무효화하는 것이 좋습니다.  
+ 최종 사용자 요청의 URI
+ 함수가 변경한 후의 URI

**Example 예제**  
예를 들어 Lambda 함수가 파일의 URI를 다음에서  
`https://d111111abcdef8.cloudfront.net/index.html`  
언어 디렉터리가 포함된 다음 URI로 변경한다고 가정합니다.  
`https://d111111abcdef8.cloudfront.net/en/index.html`  
파일을 무효화하려면 다음 경로를 지정해야 합니다.  
+ `/index.html`
+ `/en/index.html`
자세한 내용은 [Invalidation paths](#invalidation-specifying-objects-paths) 단원을 참조하세요.

 **기본 루트 객체**  
기본 루트 객체(파일)를 무효화하려면 다른 파일에 대한 경로를 지정할 때와 같은 방법으로 경로를 지정합니다. 자세한 내용은 [기본 루트 객체 작동 방식](DefaultRootObject.md#DefaultRootObjectHow) 섹션을 참조하세요.

 **쿠키 전달**  
오리진에 쿠키를 전달하도록 CloudFront를 구성하는 경우, CloudFront 엣지 캐시에는 여러 버전의 파일이 포함되어 있을 수 있습니다. 파일을 무효화할 경우 CloudFront에서는 연결된 쿠키와 상관없이 각 캐싱된 버전의 파일을 무효화합니다. 연결된 쿠키에 따라 일부 버전만 선택적으로 무효화하고 나머지는 무효화하지 않을 수는 없습니다. 자세한 내용은 [쿠키 기반의 콘텐츠 캐싱](Cookies.md) 단원을 참조하세요.

 **헤더 전달**  
오리진에 헤더 목록을 전달하고 헤더 값에 따라 캐싱하도록 CloudFront를 구성한 경우, CloudFront 엣지 캐시에는 여러 버전의 파일이 포함되어 있을 수 있습니다. 파일을 무효화할 경우 CloudFront에서는 헤더 값과 상관없이 각 캐싱된 버전의 파일을 무효화합니다. 헤더 값에 따라 일부 버전만 선택적으로 무효화하고 나머지는 무효화하지 않을 수는 없습니다. 모든 헤더를 오리진에 전달하도록 CloudFront를 구성한 경우 CloudFront는 파일을 캐싱하지 않습니다. 자세한 내용은 [요청 헤더 기반의 콘텐츠 캐싱](header-caching.md) 단원을 참조하세요.

 **쿼리 문자열 전달**  
CloudFront에서 쿼리 문자열을 오리진에 전달하도록 구성한 경우, 다음 예제에서와 같이 파일 무효화 시에는 쿼리 문자열을 포함해야 합니다.  
+ `/images/image.jpg?parameter1=a`
+ `/images/image.jpg?parameter1=b`
클라이언트 요청에 동일 파일에 대한 5가지 쿼리 문자열을 포함하는 경우, 파일을 5번 무효화하거나 각 쿼리 문자열에 대해 한 번만 무효화할 수 있습니다. 또는 다음 예제에서와 같이 \$1 와일드카드를 무효화 경로에 사용할 수 있습니다.  
`/images/image.jpg*`  
무효화 경로에 와일드카드를 사용하는 방법에 대한 자세한 내용은 [Invalidation paths](#invalidation-specifying-objects-paths) 단원을 참조하십시오.  
쿼리 문자열에 대한 자세한 내용은 [쿼리 문자열 파라미터 기반의 콘텐츠 캐싱](QueryStringParameters.md) 단원을 참조하십시오.  
사용 중인 쿼리 문자열을 확인하기 위해서는 CloudFront 로깅을 활성화하면 됩니다. 자세한 내용은 [액세스 로그(표준 로그)](AccessLogs.md) 단원을 참조하세요.

**최대 허용**  
허용되는 최대 무효화 수에 대한 자세한 내용은 [동시 무효화 요청 최대값](InvalidationLimits.md) 섹션을 참조하세요.

**Microsoft Smooth Streaming 파일**  
해당 캐시 동작에 대해 Smooth Streaming을 활성화한 경우 Microsoft Smooth Streaming 형식의 미디어 파일을 무효화할 수 없습니다.

 **ASCII가 아니거나 경로에서 안전하지 않은 문자**  
경로에 비 ASCII 문자나 [RFC 1738](https://tools.ietf.org/html/rfc1738)에 정의된 안전하지 않은 문자가 포함된 경우, 그러한 문자를 URL로 인코딩합니다. 경로에 있는 그 밖의 다른 문자는 URL로 인코딩하지 마세요. 이렇게 하면 CloudFront에서 기존 버전의 업데이트된 파일을 무효화하지 않습니다.  
경로에 `~` 문자를 사용하면 안 됩니다. CloudFront는 URL 인코딩 여부에 관계없이 무효화에 대해 이 문자를 지원하지 않습니다.

 **무효화 경로**  
이 경로는 배포에 상대적입니다. 예를 들어, `https://d111111abcdef8.cloudfront.net/images/image2.jpg`의 파일을 무효화하려면 `/images/image2.jpg`를 지정할 수 있습니다.  
[CloudFront 콘솔](https://console.aws.amazon.com/cloudfront/v4/home)에서 `images/image2.jpg`와 같이 경로의 선행 슬래시를 생략할 수 있습니다. CloudFront API를 직접 사용하는 경우 무효화 경로는 선행 슬래시로 시작해야 합니다.
또한 `*` 와일드카드를 사용하여 여러 파일을 동시에 무효화할 수도 있습니다. `*`는 0개 이상의 문자로 대체되며 무효화 경로의 마지막 문자여야 합니다.  
무효화에 와일드카드(\$1)를 사용하려면 경로 끝에 와일드카드를 입력해야 합니다. 다른 곳에 별표(\$1)를 삽입하면 와일드카드 무효화 대신 문자 그대로 일치하는 것을 찾도록 처리됩니다.
AWS Command Line Interface(AWS CLI)를 사용하여 파일을 무효화하고 `*` 와일드카드를 포함하는 경로를 지정하는 경우에는 경로를 따옴표(`"`)로 묶어야 합니다(예: `"/*"`).  
경로의 최대 길이는 4,000자입니다.  

**Example 예: 무효화 경로**  
+ 특정 디렉터리의 모든 파일을 무효화하려면:

  `/`*directory-path*`/*`
+ 특정 디렉터리와 그 하위 디렉터리 전체, 디렉터리와 하위 디렉터리에 들어 있는 모든 파일을 무효화하려면:

  `/`*directory-path*`*`
+ logo.jpg, logo.png, log.gif와 같이 같은 이름에 다른 파일 이름 확장명을 지닌 모든 파일을 무효화하려면

  `/`*directory-path*`/`*file-name*`.*`
+ 특정 디렉터리의 전체 파일 중 파일 이름이 같은 문자로 시작하는 파일(예: HLS 포맷 비디오용 파일 전체)을 무효화하려면

  `/`*directory-path*`/`*initial-characters-in-file-name*`*`
+ 쿼리 문자열 파라미터에 따라 캐싱하도록 CloudFront를 구성할 때 각 버전의 파일을 무효화하려는 경우

  `/`*directory-path*`/`*file-name*`.`*file-name-extension*`*`
+ 특정 배포의 모든 파일을 무효화하려면:

  `/*`
Lambda 함수를 사용하여 URI를 변경하는 경우 파일을 무효화하는 방법에 대한 자세한 내용은 [Changing the URI Using a Lambda Function](#invalidation-lambda-at-edge) 단원을 참조하세요.  
무효화 경로가 디렉터리이고 후행 슬래시(/) 포함 여부 등 디렉터리를 지정하는 방식을 표준화하지 않은 경우, 후행 슬래시(/)를 포함한 디렉터리와 포함하지 않은 디렉터리 모두를 무효화하는 것이 좋습니다(예: `/images` 및 `/images/`).

**서명된 URL**  
서명된 URL을 사용하는 경우 물음표(?) 앞의 URL 부분만 포함하여 파일을 무효화합니다.

# 파일 무효화
<a name="Invalidation_Requests"></a>

CloudFront 콘솔을 사용하여 무효화를 생성 및 실행하고 이전에 제출한 무효화의 목록과 개별 무효화에 관한 세부 정보를 표시할 수 있습니다. 또한 기존 무효화를 복사하고 파일 경로의 목록을 편집하며 편집된 무효화를 실행할 수 있습니다. 목록에서 무효화를 제거할 수 없습니다.

**Contents**
+ [파일 무효화](#invalidating-objects-console)
+ [기존 무효화를 복사, 편집, 재실행](#invalidating-objects-copy-console)
+ [무효화 취소](#canceling-invalidations)
+ [무효화 목록 작성](#listing-invalidations-console)
+ [무효화에 대한 정보를 표시하려면](#invalidation-details-console)

## 파일 무효화
<a name="invalidating-objects-console"></a>

CloudFront 콘솔을 사용하여 파일을 무효화하려면 다음과 같이 합니다.

------
#### [ Console ]<a name="invalidating-objects-console-procedure"></a>

**파일을 무효화하려면(콘솔)**

1. AWS Management Console에 로그인한 다음 [https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home)에서 CloudFront 콘솔을 엽니다.

1. 파일을 무효화하려는 배포를 선택합니다.

1. **Invalidations**(무효화) 탭을 선택합니다.

1. **무효화 생성**을 선택합니다.

1. 무효화하려는 파일에 대해 한 줄에 하나의 무효화 경로를 입력합니다. 무효화 경로 지정에 대한 자세한 내용은 [파일 무효화 시 알아야 할 사항](invalidation-specifying-objects.md) 단원을 참조하십시오.
**중요**  
파일 경로를 신중하게 지정합니다. 무효화 요청을 시작한 후에는 취소할 수 없습니다.

1. **무효화 생성**을 선택합니다.

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

객체를 무효화하고 무효화 관련 정보를 표시하는 방법을 알아보려면 Amazon CloudFront API 참조**에서 다음 주제를 참조하세요.
+ [CreateInvalidation](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateInvalidation.html) 
+ [ListInvalidations](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_ListInvalidations.html)
+ [GetInvalidation](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_GetInvalidation.html)

**참고**  
AWS Command Line Interface(AWS CLI)를 사용하여 파일을 무효화하고 `*` 와일드카드를 포함하는 경로를 지정하는 경우에는 다음 예시와 같이 경로를 따옴표(`"`)로 묶어야 합니다.  

```
aws cloudfront create-invalidation --distribution-id distribution_ID --paths "/*"
```

------

## 기존 무효화를 복사, 편집, 재실행
<a name="invalidating-objects-copy-console"></a>

이전에 생성한 무효화를 복사하고 무효화 경로의 목록을 업데이트하여 업데이트된 무효화를 실행할 수 있습니다. 기존 무효화를 복사하고 무효화 경로를 업데이트하여 업데이트된 무효화를 실행하지 않고 저장할 수는 없습니다.

**중요**  
아직 진행 중인 무효화를 복사하고 무효화 경로의 목록을 업데이트하여 업데이트된 무효화를 실행하는 경우, CloudFront에서는 복사한 무효화를 중단하거나 삭제하지 않습니다. 무효화 경로가 원본 및 복사본에 표시되는 경우 CloudFront에서는 파일에 대해 두 번 무효화를 시도하며, 두 무효화 모두 월별 무료 무효화 최대 횟수로 산정됩니다. 이미 무료 무효화 최대 횟수에 도달한 경우 각 파일의 무효화 두 건에 대해 요금이 청구됩니다. 자세한 내용은 [동시 무효화 요청 최대값](InvalidationLimits.md) 섹션을 참조하세요.<a name="invalidating-objects-copy-console-procedure"></a>

**기존 무효화를 복사, 편집, 재실행하려면**

1. AWS Management Console에 로그인한 다음 [https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home)에서 CloudFront 콘솔을 엽니다.

1. 복사하려는 무효화가 포함된 배포를 선택합니다.

1. **Invalidations**(무효화) 탭을 선택합니다.

1. 복사하려는 무효화를 선택합니다.

   복사하려는 무효화가 확실치 않은 경우, 무효화를 하나 선택하고 **세부 정보 보기**를 선택하여 해당 무효화에 대한 세부 정보를 표시할 수 있습니다.

1. **신규로 복사**를 선택합니다.

1. 해당되는 경우 무효화 경로의 목록을 업데이트합니다.

1. **무효화 생성**을 선택합니다.

## 무효화 취소
<a name="canceling-invalidations"></a>

CloudFront에 무효화 요청을 제출하면 CloudFront는 몇 초 이내에 모든 엣지 로케이션으로 요청을 전달하며, 각 엣지 로케이션은 즉시 무효화를 처리하기 시작합니다. 따라서 무효화를 제출한 후에는 취소할 수 없습니다.

## 무효화 목록 작성
<a name="listing-invalidations-console"></a>

CloudFront 콘솔을 사용하여 배포에 대해 생성하고 실행한 최근 100건의 무효화 목록을 표시할 수 있습니다. 100건이 넘는 무효화 목록을 가져오려는 경우 `ListInvalidations` API 작업을 사용합니다. 자세한 내용은 *Amazon CloudFront API 참조*의 [ListInvalidations](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_ListInvalidations.html)를 참조하세요.<a name="listing-invalidations-console-procedure"></a>

**무효화 목록을 작성하려면**

1. AWS Management Console에 로그인한 다음 [https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home)에서 CloudFront 콘솔을 엽니다.

1. 무효화 목록을 표시하려는 배포를 선택합니다.

1. **Invalidations**(무효화) 탭을 선택합니다.

**참고**  
목록에서 무효화를 제거할 수 없습니다.

## 무효화에 대한 정보를 표시하려면
<a name="invalidation-details-console"></a>

배포 ID, 무효화 ID, 무효화의 상태, 무효화가 생성된 날짜 및 시간, 무효화 경로의 전체 목록을 포함한 무효화에 관한 세부 정보를 표시할 수 있습니다.<a name="invalidation-details-console-procedure"></a>

**무효화에 대한 정보를 표시하려면**

1. AWS Management Console에 로그인한 다음 [https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home)에서 CloudFront 콘솔을 엽니다.

1. 세부 정보를 표시하려는 무효화가 포함된 배포를 선택합니다.

1. **Invalidations**(무효화) 탭을 선택합니다.

1. 해당하는 무효화 ID를 선택하거나 무효화 ID를 선택한 다음 **세부 정보 보기**를 선택합니다.

# 동시 무효화 요청 최대값
<a name="InvalidationLimits"></a>

파일을 개별적으로 무효화하는 경우, 배포당 한 번에 최대 3,000개의 파일에 대해 진행 중인 무효화 요청을 보유할 수 있습니다. 이것은 최대 3,000개의 파일에 대해 한 번의 무효화 요청을 하거나, 각 파일에 대해 최대 3,000건의 요청을 하거나, 3,000개의 파일을 초과하지 않는 기타 모든 조합이 가능함을 의미합니다. 예를 들어, 각각 100개의 파일을 무효화하는 30건의 무효화 요청을 제출할 수 있습니다. 30건의 무효화 요청 모두가 아직 진행 중인 경우 더 이상의 무효화 요청은 제출할 수 없습니다. 이 최대값을 초과하면 CloudFront에서 오류 메시지를 반환합니다.

\$1 와일드카드를 사용하는 경우 한 번에 최대 15개의 무효화 경로에 대해 진행 중인 요청을 보유할 수 있습니다. 또한 배포당 최대 3,000개의 개별 파일에 대해 진행 중인 무효화 요청을 동시에 보유할 수 있습니다. 허용되는 와일드카드 무효화 요청에 대한 최대값은 개별적으로 파일을 무효화하는 데 적용되는 최대값과는 독립적입니다.

# 파일 무효화에 대한 요금 결제
<a name="PayingForInvalidation"></a>

월별로 제출한 최초 1,000개의 무효화 경로에 대해서는 무료입니다. 월별로 1,000개를 초과하는 각 무효화 경로에 대해서 요금을 지불합니다. 무효화 경로는 단일 파일(예:`/images/logo.jpg`) 또는 여러 파일(예: `/images/*`)에 적용될 수 있습니다. CloudFront가 수천 개의 파일을 무효화하더라도 `*` 와일드카드 수가 하나의 경로로 포함되는 경로입니다.

월별 1,000개의 무료 무효화 경로 최대값은 하나의 AWS 계정으로 생성한 전체 배포에서 무효화 경로의 총 수에 적용됩니다. 예를 들어, AWS 계정 `john@example.com`을 사용하여 세 개의 배포를 만든 경우 지정된 월에 *배포별*로 600개의 무효화 경로를 제출했다면(총 1,800개의 무효화 경로에 해당), AWS에서는 총 무효화 경로와 1,000개의 무료 한도 간의 차이에 대해 요금을 부과합니다. 이 예시에서 AWS는 해당 월에 800개의 무효화 경로에 대해 요금을 부과합니다.

무효화 경로를 제출하는 데 부과되는 요금은 무효화하는 파일 수와 관계없이 단일 객체(`/images/logo.jpg`) 또는 배포와 연결된 모든 파일(`/*`)에 대해 동일합니다. 무효화 요청에서는 경로별로 요금이 부과되므로 여러 경로를 단일 요청으로 묶더라도 각 경로는 여전히 청구 시 개별적으로 계산됩니다.

무효화 요금에 대한 자세한 내용은 [Amazon CloudFront 요금](https://aws.amazon.com/cloudfront/pricing/)을 참조하세요. 무효화 경로에 대한 자세한 내용은 [Invalidation paths](invalidation-specifying-objects.md#invalidation-specifying-objects-paths) 단원을 참조합니다.

# 압축된 파일 제공
<a name="ServingCompressedFiles"></a>

객체가 압축되면 객체 크기가 더 작아지므로 다운로드 속도가 빨라집니다. 원래 크기의 1/4 이하로 줄어드는 경우도 있습니다. 특히 JavaScript 및 CSS 파일의 경우 다운로드 속도가 빨라지면 뷰어에게 표시되는 웹 페이지의 렌더링 속도가 빨라집니다. 또한 CloudFront 데이터 전송 비용은 제공된 총 데이터 양을 기준으로 합니다. 압축된 객체를 제공하면 압축되지 않은 객체를 제공하는 것보다 비용이 저렴할 수 있습니다.

**Topics**
+ [객체를 압축하도록 CloudFront 구성](#compressed-content-cloudfront-configuring)
+ [CloudFront 압축의 작동 원리](#compressed-content-cloudfront-how-it-works)
+ [압축 조건](#compressed-content-cloudfront-notes)
+ [CloudFront가 압축하는 파일 형식](#compressed-content-cloudfront-file-types)
+ [`ETag` 헤더 변환](#compressed-content-cloudfront-etag-header)

## 객체를 압축하도록 CloudFront 구성
<a name="compressed-content-cloudfront-configuring"></a>

CloudFront가 객체를 압축하도록 구성하려면 압축된 객체를 제공하려는 캐시 동작을 업데이트합니다.

**콘솔에서 객체를 압축하도록 CloudFront를 구성하려면 다음과 같이 합니다.**

1. [CloudFront 콘솔](https://console.aws.amazon.com/cloudfront/v4/home)에 로그인합니다.

1. 배포를 선택한 다음 편집할 **동작**을 선택합니다.

1. **자동으로 객체 압축** 설정에서 **예**를 선택합니다.

1. [캐시 정책](controlling-the-cache-key.md)을 사용하여 캐싱 설정을 지정하고 **Gzip**과 **Brotli** 압축 형식 모두 사용 설정합니다.

**참고**  
Brotli 압축을 사용하려면 [캐시 정책](controlling-the-cache-key.md)을 사용해야 합니다. Brotli는 레거시 캐시 설정을 지원하지 않습니다.
[CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cachebehavior.html) 또는 [CloudFront](https://docs.aws.amazon.com/cloudfront/latest/APIReference/Welcome.html) API를 사용하여 압축을 사용 설정하려면 `Compress`, `EnableAcceptEncodingGzip`, `EnableAcceptEncodingBrotli` 파라미터를 `true`로 설정합니다.

CloudFront가 객체를 압축하는 방법을 이해하려면 다음 섹션을 참조하시기 바랍니다.

## CloudFront 압축의 작동 원리
<a name="compressed-content-cloudfront-how-it-works"></a>

1. 뷰어가 객체를 요청하는 경우 뷰어는 요청에 `Accept-Encoding` HTTP 헤더를 포함하며 헤더 값에는 `gzip`, `br` 또는 둘 다 포함됩니다. 이는 뷰어가 압축된 객체를 지원함을 의미합니다. 뷰어가 Gzip과 Brotli 모두 지원하는 경우 CloudFront는 Brotli를 사용합니다.
**참고**  
Chrome 및 Firefox 웹 브라우저는 HTTPS를 사용하여 요청이 전송될 경우에만 Brotli 압축을 지원합니다. HTTP 요청에서는 Brotli를 지원하지 않습니다.

1. 엣지 로케이션에서 CloudFront는 요청 객체의 압축된 사본 캐시를 확인합니다.

1. 압축된 객체가 캐시에 있는지 여부에 따라 CloudFront는 다음 중 하나를 수행합니다.
   + 압축된 객체가 이미 캐시에 있으면 CloudFront는 뷰어에게 객체를 전송하고 나머지 단계를 건너뜁니다.
   + 압축된 객체가 캐시에 없으면 CloudFront는 요청을 오리진에 전달합니다.
**참고**  
캐시에 이미 압축되지 않은 객체 사본이 있는 경우 CloudFront는 요청을 오리진에 전달하지 않고 뷰어에게 전송할 수 있습니다. 예를 들어 CloudFront가 [이전에 압축을 건너뛴](#compression-skipped) 경우 이 문제가 발생할 수 있습니다. 이 경우 CloudFront는 압축되지 않은 객체를 캐싱하고 객체가 만료, 제거 또는 무효화될 때까지 계속 처리합니다.

1. HTTP 응답의 `Content-Encoding` 헤더에 표시되는 것처럼 오리진에서 압축 객체를 반환하는 경우, CloudFront는 압축된 객체를 뷰어에게 전송하고 캐시에 추가한 다음, 나머지 단계는 건너뜁니다. CloudFront는 객체를 다시 압축하지 않습니다.

1. 오리진이 압축되지 않은 객체를 CloudFront에 반환하는 경우(HTTP 응답의 `Content-Encoding` 헤더에 없는 경우) CloudFront는 객체의 압축 가능 여부를 결정합니다. 자세한 내용은 [압축 조건](#compressed-content-cloudfront-notes) 섹션을 참조하세요.

1. 객체를 압축할 수 있으면 CloudFront는 객체를 압축하고 뷰어에게 압축된 객체를 전송한 다음, 이를 캐시에 추가합니다.

1. 동일한 객체에 대한 뷰어 요청이 잇따르는 경우 CloudFront는 첫 번째 캐싱된 버전을 반환합니다. 예를 들어 뷰어가 Gzip 압축을 사용하는 특정 캐시 객체를 요청하고 뷰어가 Gzip 형식을 *수락*하면 뷰어가 Brotli와 Gzip 모두를 수락하더라도 동일한 객체에 대한 후속 요청은 항상 Gzip 버전을 반환합니다.

일부 사용자 지정 오리진도 객체를 압축할 수 있습니다. CloudFront에서 압축하지 않는 객체를 오리진에서 압축할 수 있습니다. 자세한 내용은 [CloudFront가 압축하는 파일 형식](#compressed-content-cloudfront-file-types) 섹션을 참조하세요.

## 압축 조건
<a name="compressed-content-cloudfront-notes"></a>

다음 목록은 CloudFront가 객체를 압축하지 않는 시나리오에 대한 자세한 정보를 제공합니다.

**요청에는 HTTP 1.0을 사용합니다**  
CloudFront에 대한 요청이 HTTP 1.0을 사용하는 경우 CloudFront는 `Accept-Encoding` 헤더를 제거하고 응답에서 객체를 압축하지 않습니다.

**`Accept-Encoding` 요청 헤더**  
뷰어 요청에서 `Accept-Encoding` 헤더가 누락되었거나 `gzip` 또는 `br`을 값으로 포함하지 않은 경우 CloudFront는 응답에서 객체를 압축하지 않습니다. `Accept-Encoding` 헤더에 `deflate`와 같은 추가 값이 포함된 경우, CloudFront에서는 오리진 서버에 요청을 전달하기 전에 이를 제거합니다.  
CloudFront가 [객체를 압축하도록 구성된](#compressed-content-cloudfront-configuring) 경우, 자동으로 캐시 키와 오리진 요청에 `Accept-Encoding` 헤더를 추가합니다.

**CloudFront가 객체를 압축하도록 구성한 경우 콘텐츠는 이미 캐싱됩니다.**  
CloudFront는 오리진에서 객체를 가져올 때 객체를 압축합니다. CloudFront가 객체를 압축하도록 구성한 경우 CloudFront는 이미 엣지 로케이션에 캐싱된 객체는 압축하지 않습니다. 또한 엣지 로케이션에서 캐시 객체가 만료되고 CloudFront가 오리진에 객체에 대한 다른 요청을 전달하면 CloudFront는 오리진이 HTTP 상태 코드 304를 반환하는 경우 객체를 압축하지 않습니다. 즉, 엣지 로케이션에 이미 최신 버전의 객체가 있습니다. CloudFront로 이미 엣지 로케이션에 캐싱된 객체를 압축하려는 경우 해당 객체를 무효화해야 합니다. 자세한 내용은 [파일을 무효화하여 콘텐츠 제거](Invalidation.md) 섹션을 참조하세요.

**오리진이 이미 객체를 압축하도록 구성된 경우**  
CloudFront에서 객체를 압축하도록 구성하고 또한 오리진에서 객체를 압축한 경우 오리진에는 `Content-Encoding` 헤더가 포함되어야 합니다. 이 헤더는 CloudFront에 객체가 이미 압축되었음을 나타냅니다. 오리진에서의 응답에 `Content-Encoding` 헤더가 포함되어 있는 경우, CloudFront는 헤더 값과 관계없이 객체를 압축하지 않습니다. CloudFront가 뷰어로 응답을 보내고 엣지 로케이션에서 객체를 캐싱합니다.

**CloudFront가 압축하는 파일 형식**  
전체 목록은 [CloudFront가 압축하는 파일 형식](#compressed-content-cloudfront-file-types) 단원을 참조하세요.

**CloudFront가 압축하는 객체 크기**  
CloudFront는 1,000바이트\$110,000,000바이트 크기의 객체를 압축합니다.

**`Content-Length` 헤더**  
오리진에는 응답의 `Content-Length` 헤더를 포함하 여 객체의 크기가 CloudFront가 압축하는 범위에 있는지 CloudFront에서 확인할 수 있도록 해야 합니다. 만약 `Content-Length` 헤더가 누락되거나, 잘못된 값을 포함하거나, CloudFront Front가 압축하는 크기 범위를 벗어나는 값을 포함하는 경우 CloudFront는 객체를 압축하지 않습니다. CloudFront가 크기 범위를 초과할 수 있는 대형 객체를 처리하는 방법에 대한 자세한 내용은 [CloudFront에서 객체에 대한 부분적인 요청을 처리하는 방법(범위 GET)](RangeGETs.md) 섹션을 참조하시기 바랍니다.

**응답의 HTTP 상태 코드**  
CloudFront는 응답의 HTTP 상태 코드가 `200`, `403` 또는`404`인 경우에만 객체를 압축합니다.

**응답에 본문 없음**  
오리진의 HTTP 응답에 본문이 없으면 CloudFront가 압축할 수 있는 것은 없습니다.

**`ETag` 헤더**  
CloudFront는 때때로 객체를 압축 할 때 HTTP 응답에 `ETag` 헤더를 수정합니다. 자세한 내용은 [`ETag` 헤더 변환](#compressed-content-cloudfront-etag-header) 섹션을 참조하세요.

**CloudFront의 압축 건너뛰기**  
CloudFront는 가능한 한 객체를 압축합니다. 드문 경우지만 CloudFront에서 트래픽 부하가 높으면 CloudFront는 객체 압축을 건너뜁니다. CloudFront는 호스트 용량을 비롯한 다양한 요인을 기반으로 이러한 결정을 내립니다. CloudFront는 객체에 대한 압축을 건너뛴 경우, 압축되지 않은 객체를 캐시하고 객체가 만료되거나 제거되거나 무효화될 때까지 뷰어에 계속 제공합니다.

## CloudFront가 압축하는 파일 형식
<a name="compressed-content-cloudfront-file-types"></a>

CloudFront가 콘텐츠를 압축하도록 구성하는 경우, CloudFront는 `Content-Type` 응답 헤더에 다음 값이 포함된 객체를 압축합니다.
+ `application/dash+xml`
+ `application/eot`
+ `application/font`
+ `application/font-sfnt`
+ `application/javascript`
+ `application/json`
+ `application/opentype`
+ `application/otf`
+ `application/pdf`
+ `application/pkcs7-mime`
+ `application/protobuf`
+ `application/rss+xml`
+ `application/truetype`
+ `application/ttf`
+ `application/vnd.apple.mpegurl`
+ `application/vnd.mapbox-vector-tile`
+ `application/vnd.ms-fontobject`
+ `application/wasm`
+ `application/xhtml+xml`
+ `application/xml`
+ `application/x-font-opentype`
+ `application/x-font-truetype`
+ `application/x-font-ttf`
+ `application/x-httpd-cgi`
+ `application/x-javascript`
+ `application/x-mpegurl`
+ `application/x-opentype`
+ `application/x-otf`
+ `application/x-perl`
+ `application/x-ttf`
+ `font/eot`
+ `font/opentype`
+ `font/otf`
+ `font/ttf`
+ `image/svg+xml`
+ `text/css`
+ `text/csv`
+ `text/html`
+ `text/javascript`
+ `text/js`
+ `text/plain`
+ `text/richtext`
+ `text/tab-separated-values`
+ `text/xml`
+ `text/x-component`
+ `text/x-java-source`
+ `text/x-script`
+ `vnd.apple.mpegurl`

## `ETag` 헤더 변환
<a name="compressed-content-cloudfront-etag-header"></a>

오리진의 압축되지 않은 객체에 유효하고 강력한 `ETag` HTTP 헤더가 포함되어 있고 CloudFront가 객체를 압축한 경우, CloudFront는 강력한 `ETag` 헤더 값을 취약한 `ETag`로 변환하고, 취약한 `ETag` 값을 뷰어에게 반환합니다. 최종 사용자는 취약한 `ETag` 값을 저장하고 이를 사용하여 `If-None-Match` HTTP 헤더가 있는 조건부 요청을 보낼 수 있습니다. 이를 통해 최종 사용자, CloudFront 및 오리진은 객체의 압축 버전과 압축되지 않은 버전을 의미상 동일하게 취급할 수 있으므로 불필요한 데이터 전송이 줄어듭니다.

유효하고 강력한 `ETag` 헤더 값은 큰따옴표(`"`)로 시작하고 끝납니다. 강력한 `ETag` 값을 취약한 값으로 변환하려면 CloudFront는 강력한 `W/` 값의 시작 부분에 `ETag` 문자를 추가합니다.

오리진 객체에 취약한 `ETag` 헤더 값(`W/` 문자로 시작하는 값)이 포함된 경우, CloudFront에서는 이 값을 수정하지 않고 오리진에서 받은 최종 사용자에게 반환합니다.

오리진 객체에 잘못된 `ETag` 헤더 값(값이 `"` 또는 `W/`로 시작하지 않음)이 포함된 경우, CloudFront에서는 `ETag` 헤더를 제거하고 `ETag` 응답 헤더 없이 최종 사용자에게 객체를 반환합니다.

자세한 내용은 MDN 웹 문서의 다음 페이지를 참조하세요.
+ [지시문](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag#Directives)(`ETag` HTTP 헤더)
+ [취약한 검증](https://developer.mozilla.org/en-US/docs/Web/HTTP/Conditional_requests#Weak_validation)(HTTP 조건부 요청)
+ [If-None-Match HTTP 헤더](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-None-Match)