압축된 파일 제공 - Amazon CloudFront

압축된 파일 제공

CloudFront를 사용하여 특정 유형의 객체(파일)를 자동으로 압축하고 뷰어(웹 브라우저 또는 다른 클라이언트)가 지원하는 경우 압축 객체를 제공할 수 있습니다. 뷰어는 Accept-Encoding HTTP 헤더를 사용하여 이러한 압축 객체에 대한 지원을 나타냅니다.

CloudFront는 Gzip 및 Brotli 압축 형식을 사용하여 객체를 압축할 수 있습니다. 최종 사용자가 두 형식을 모두 지원하고 연결된 캐시 서버에 두 형식이 모두 있는 경우 CloudFront는 Brotli를 선호합니다. 캐시 서버에 압축 형식이 하나만 있는 경우 CloudFront는 압축 형식을 반환합니다.

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

참고

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

객체가 압축되면 객체 크기가 더 작아지므로 다운로드 속도가 빨라집니다. 원래 크기의 1/4 이하로 줄어드는 경우도 있습니다. JavaScript 및 CSS 파일의 경우 다운로드 속도가 빨라지면 사용자에게 표시되는 웹 페이지의 렌더링 속도가 빨라집니다. 또한 CloudFront 데이터 전송 비용은 총 데이터 제공량에 따라 달라지므로, 압축된 객체를 제공함으로써 압축되지 않은 객체를 제공할 때에 비해 비용이 단축됩니다.

일부 사용자 지정 오리진도 객체를 압축할 수 있습니다. CloudFront에서 압축하지 않는 객체를 오리진에서 압축할 수 있습니다(CloudFront가 압축하는 파일 형식 참조). 오리진이 CloudFront에 압축된 객체를 반환하는 경우, CloudFront는 Content-Encoding 헤더의 값을 기반으로 객체가 압축되었음을 감지하고 객체를 다시 압축하지 않습니다.

객체를 압축하도록 CloudFront 구성

CloudFront가 객체를 압축하도록 구성하려면 다음의 내용 전체를 수행하여 압축된 객체에 적용하려는 캐시 동작을 업데이트합니다.

  1. 자동으로 객체 압축 설정이 로 설정되어 있는지 확인합니다. (AWS CloudFormation 또는 CloudFront API에서 Compress을(를) true(으)로 설정합니다.)

  2. 캐시 정책을 사용하여 캐싱 설정을 지정하고 GzipBrotli 설정이 모두 활성화되어 있는지 확인합니다. (AWS CloudFormation 또는 CloudFront API에서 EnableAcceptEncodingGzipEnableAcceptEncodingBrotli을(를) true(으)로 설정합니다.)

  3. 캐시 정책의 TTL 값이 0보다 큰 값으로 설정되어 있는지 확인합니다. TTL 값을 0으로 설정하면 압축된 콘텐츠의 캐싱이 비활성화됩니다.

캐시 동작을 업데이트하려면 다음 도구 중 하나를 사용할 수 있습니다.

CloudFront 압축의 작동 원리

CloudFront가 객체를 압축하도록 구성한다면(이전 단원 참조) 작동 방식은 다음과 같습니다.

  1. 뷰어가 객체를 요청하는 경우 뷰어는 요청에 Accept-Encoding HTTP 헤더를 포함하며 헤더 값에는 gzip, br 또는 둘 다 포함됩니다. 이는 뷰어가 압축된 객체를 지원함을 의미합니다. 뷰어가 Gzip과 Brotli 둘 모두 지원하는 경우, CloudFront는 Brotli를 사용합니다.

    참고

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

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

  3. 압축된 객체가 이미 캐시에 있는 경우, CloudFront는 뷰어에 객체를 전송하고 나머지 단계를 건너뜁니다.

    압축된 객체가 캐시에 없는 경우 CloudFront가 요청을 오리진에 전달합니다.

    참고

    캐시에 이미 압축되지 않은 객체 사본이 있는 경우 CloudFront는 요청을 오리진에 전달하지 않고 뷰어에게 전송할 수 있습니다. 예를 들어 CloudFront가 이전에 압축을 건너뛴 경우 이 문제가 발생할 수 있습니다. 이 경우 CloudFront는 압축되지 않은 객체를 캐싱하고 객체가 만료, 제거 또는 무효화될 때까지 계속 처리합니다.

  4. 원본에서 압축된 객체를 반환하는 경우(HTTP 응답에 있는 Content-Encoding 헤더를 통해 알 수 있음), CloudFront는 압축된 객체를 뷰어에 전송하고 캐시에 추가한 다음 나머지 단계를 건너뜁니다. CloudFront는 객체를 다시 압축하지 않습니다.

    오리진이 압축되지 않은 객체를 CloudFront에 반환하는 경우(HTTP 응답의 헤더에 Content-Encoding이 없는 경우) CloudFront가 객체의 압축 가능 여부를 결정합니다. CloudFront에서 객체의 압축 가능 여부를 결정하는 방법에 대한 자세한 내용은 다음 단원을 참조하세요.

  5. 객체를 압축할 수 있는 경우, CloudFront는 압축하고 뷰어에 압축된 객체를 전송한 다음 캐시에 추가합니다. (드물지만 CloudFront는 압축을 건너뛰고 압축되지 않은 객체를 뷰어에 보낼 수 있습니다.)

CloudFront가 객체를 압축하는 경우

다음 목록은 CloudFront가 객체를 압축하는 경우에 대한 자세한 정보를 제공합니다.

요청에는 HTTP 1.0을 사용합니다

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

Accept-Encoding 요청 헤더

만약 뷰어 요청에 Accept-Encoding 헤더가 누락되었거나 gzip 또는br를 값으로 포함하지 않은 경우 CloudFront는 응답에서 객체를 압축하지 않습니다. Accept-Encoding 헤더에 deflate와 같은 추가 값이 포함된 경우, CloudFront에서는 오리진 서버에 요청을 전달하기 전에 이를 제거합니다.

CloudFront가 객체를 압축하도록 구성된 경우, 자동으로 캐시 키와 오리진 요청에 Accept-Encoding 헤더를 추가합니다.

동적 콘텐츠

CloudFront가 동적 콘텐츠를 항상 압축하는 것은 아닙니다. 동적 콘텐츠에 대한 응답이 압축되는 경우도 있고 그렇지 않은 경우도 있습니다.

CloudFront가 객체를 압축하도록 구성한 경우 콘텐츠는 이미 캐싱됩니다.

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

오리진이 이미 객체를 압축하도록 구성된 경우

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

CloudFront가 압축하는 파일 형식

CloudFront에서 압축하는 파일 형식의 전체 목록은 CloudFront가 압축하는 파일 형식 단원을 참조하세요.

CloudFront가 압축하는 객체 크기

CloudFront는 1,000바이트~10,000,000바이트 크기의 객체를 압축합니다.

Content-Length 헤더

오리진에는 응답의 Content-Length 헤더를 포함하 여 객체의 크기가 CloudFront가 압축하는 범위에 있는지 CloudFront에서 확인할 수 있도록 해야 합니다. 만약 Content-Length 헤더가 누락되거나, 잘못된 값을 포함하거나, CloudFront Front가 압축하는 크기 범위를 벗어나는 값을 포함하는 경우 CloudFront는 객체를 압축하지 않습니다.

응답의 HTTP 상태 코드

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

응답에 본문 없음

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

ETag 헤더

CloudFront는 때때로 객체를 압축 할 때 HTTP 응답에 ETag 헤더를 수정합니다. 자세한 내용은 ETag 헤더 변환 단원을 참조하십시오.

CloudFront의 압축 건너뛰기

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

CloudFront가 압축하는 파일 형식

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 헤더 변환

오리진의 압축되지 않은 객체에 유효하고 강력한 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 웹 문서의 다음 페이지를 참조하세요.