압축된 파일 제공
객체가 압축되면 객체 크기가 더 작아지므로 다운로드 속도가 빨라집니다. 원래 크기의 1/4 이하로 줄어드는 경우도 있습니다. 특히 JavaScript 및 CSS 파일의 경우 다운로드 속도가 빨라지면 뷰어에게 표시되는 웹 페이지의 렌더링 속도가 빨라집니다. 또한 CloudFront 데이터 전송 비용은 제공된 총 데이터 양을 기준으로 합니다. 압축된 객체를 제공하면 압축되지 않은 객체를 제공하는 것보다 비용이 저렴할 수 있습니다.
주제
객체를 압축하도록 CloudFront 구성
CloudFront가 객체를 압축하도록 구성하려면 압축된 객체를 제공하려는 캐시 동작을 업데이트합니다.
콘솔에서 객체를 압축하도록 CloudFront를 구성하려면 다음과 같이 합니다.
-
CloudFront 콘솔
에 로그인합니다. -
배포를 선택한 다음 편집할 동작을 선택합니다.
-
자동으로 객체 압축 설정에서 예를 선택합니다.
-
캐시 정책을 사용하여 캐싱 설정을 지정하고 Gzip과 Brotli 압축 형식 모두 사용 설정합니다.
-
캐시 정책의 TTL 설정에서 0보다 큰 값으로 값을 설정합니다. Minimum TTL 값을 0으로 설정하면 CloudFront는 압축 콘텐츠를 캐싱하지 않습니다.
Notes
-
Brotli 압축을 사용하려면 캐시 정책을 사용해야 합니다. Brotli는 레거시 캐시 설정을 지원하지 않습니다.
-
AWS CloudFormation 또는 CloudFront API를 사용하여 압축을 사용 설정하려면
Compress
,EnableAcceptEncodingGzip
,EnableAcceptEncodingBrotli
파라미터를true
로 설정합니다.
CloudFront가 객체를 압축하는 방법을 이해하려면 다음 섹션을 참조하시기 바랍니다.
CloudFront 압축의 작동 원리
-
뷰어가 객체를 요청하는 경우 뷰어는 요청에
Accept-Encoding
HTTP 헤더를 포함하며 헤더 값에는gzip
,br
또는 둘 다 포함됩니다. 이는 뷰어가 압축된 객체를 지원함을 의미합니다. 뷰어가 Gzip과 Brotli 모두 지원하는 경우 CloudFront는 Brotli를 사용합니다.참고
Chrome 및 Firefox 웹 브라우저는 HTTPS를 사용하여 요청이 전송될 경우에만 Brotli 압축을 지원합니다. HTTP 요청에서는 Brotli를 지원하지 않습니다.
-
엣지 로케이션에서 CloudFront는 요청 객체의 압축된 사본 캐시를 확인합니다.
-
압축된 객체가 캐시에 있는지 여부에 따라 CloudFront는 다음 중 하나를 수행합니다.
-
압축된 객체가 이미 캐시에 있으면 CloudFront는 뷰어에게 객체를 전송하고 나머지 단계를 건너뜁니다.
-
압축된 객체가 캐시에 없으면 CloudFront는 요청을 오리진에 전달합니다.
참고
캐시에 이미 압축되지 않은 객체 사본이 있는 경우 CloudFront는 요청을 오리진에 전달하지 않고 뷰어에게 전송할 수 있습니다. 예를 들어 CloudFront가 이전에 압축을 건너뛴 경우 이 문제가 발생할 수 있습니다. 이 경우 CloudFront는 압축되지 않은 객체를 캐싱하고 객체가 만료, 제거 또는 무효화될 때까지 계속 처리합니다.
-
-
HTTP 응답의
Content-Encoding
헤더에 표시되는 것처럼 오리진에서 압축 객체를 반환하는 경우, CloudFront는 압축된 객체를 뷰어에게 전송하고 캐시에 추가한 다음, 나머지 단계는 건너뜁니다. CloudFront는 객체를 다시 압축하지 않습니다. -
오리진이 압축되지 않은 객체를 CloudFront에 반환하는 경우(HTTP 응답의
Content-Encoding
헤더에 없는 경우) CloudFront는 객체의 압축 가능 여부를 결정합니다. 자세한 내용은 CloudFront가 객체를 압축하는 경우 섹션을 참조하세요. -
객체를 압축할 수 있으면 CloudFront는 객체를 압축하고 뷰어에게 압축된 객체를 전송한 다음, 이를 캐시에 추가합니다.
-
동일한 객체에 대한 뷰어 요청이 잇따르는 경우 CloudFront는 첫 번째 캐싱된 버전을 반환합니다. 예를 들어 뷰어가 Gzip 압축을 사용하는 특정 캐시 객체를 요청하고 뷰어가 Gzip 형식을 수락하면 뷰어가 Brotli와 Gzip 모두를 수락하더라도 동일한 객체에 대한 후속 요청은 항상 Gzip 버전을 반환합니다.
일부 사용자 지정 오리진도 객체를 압축할 수 있습니다. 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는 오리진이 HTTP 상태 코드 304를 반환하는 경우 객체를 압축하지 않습니다. 즉, 엣지 로케이션에 이미 최신 버전의 객체가 있습니다. CloudFront로 이미 엣지 로케이션에 캐싱된 객체를 압축하려는 경우 해당 객체를 무효화해야 합니다. 자세한 내용은 파일을 무효화하여 콘텐츠 제거 섹션을 참조하세요.
- 오리진이 이미 객체를 압축하도록 구성된 경우
-
CloudFront에서 객체를 압축하도록 구성하고 또한 오리진에서 객체를 압축한 경우 오리진에는
Content-Encoding
헤더가 포함되어야 합니다. 이 헤더는 CloudFront에 객체가 이미 압축되었음을 나타냅니다. 오리진에서의 응답에Content-Encoding
헤더가 포함되어 있는 경우, CloudFront는 헤더 값과 관계없이 객체를 압축하지 않습니다. CloudFront가 뷰어로 응답을 보내고 엣지 로케이션에서 객체를 캐싱합니다. - CloudFront가 압축하는 파일 형식
-
전체 목록은 CloudFront가 압축하는 파일 형식 섹션을 참조하세요.
- CloudFront가 압축하는 객체 크기
-
CloudFront는 1,000바이트~10,000,000바이트 크기의 객체를 압축합니다.
Content-Length
헤더-
오리진에는 응답의
Content-Length
헤더를 포함하 여 객체의 크기가 CloudFront가 압축하는 범위에 있는지 CloudFront에서 확인할 수 있도록 해야 합니다. 만약Content-Length
헤더가 누락되거나, 잘못된 값을 포함하거나, CloudFront Front가 압축하는 크기 범위를 벗어나는 값을 포함하는 경우 CloudFront는 객체를 압축하지 않습니다. CloudFront가 크기 범위를 초과할 수 있는 대형 객체를 처리하는 방법에 대한 자세한 내용은 CloudFront에서 객체에 대한 부분적인 요청을 처리하는 방법(범위 GET) 섹션을 참조하시기 바랍니다. - 응답의 HTTP 상태 코드
-
CloudFront는 응답의 HTTP 상태 코드가
200
,403
또는404
인 경우에만 객체를 압축합니다. - 응답에 본문 없음
-
오리진의 HTTP 응답에 본문이 없으면 CloudFront가 압축할 수 있는 것은 없습니다.
ETag
헤더-
CloudFront는 때때로 객체를 압축 할 때 HTTP 응답에
ETag
헤더를 수정합니다. 자세한 내용은 ETag 헤더 변환 섹션을 참조하세요. - CloudFront의 압축 건너뛰기
-
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 웹 문서의 다음 페이지를 참조하세요.