동적 압축은 Cloud CDN에서 제공하는 응답을 자동으로 압축합니다. 네트워크를 통해 전송되는 데이터의 크기는 일반적인 경우 60%~85%까지 감소합니다.
크기를 줄이면 콘텐츠를 다운로드하는 데 걸리는 시간이 줄어듭니다. 스타일시트(CSS), 스크립트(자바스크립트), 동영상 매니페스트(HLS/DASH)와 같은 중요한 애셋의 경우 페이지 로드 및 동영상 시작 시간을 줄일 수 있습니다.
응답 압축의 이점에 대한 자세한 내용은 웹 기초 가이드를 참조하세요.
백엔드 서비스 또는 백엔드 버킷에서 압축을 사용 설정할 수 있습니다.
사용 사례 예시
동적 압축은 Cloud CDN 에지에서 클라이언트로 전송되는 데이터의 크기를 직접 줄입니다. 이 작업은 다음을 직접 수행할 수 있습니다.
- CSS 및 자바스크립트 크기를 줄이면 웹페이지가 더 빠르게 렌더링되고 중요한 웹 성능 측정항목인 콘텐츠가 포함된 첫 페인트가 표시되는 시간이 줄어듭니다.
JSON 페이로드와 같은 REST API 응답을 캐싱할 때 큰 긍정적인 영향을 미칩니다. 이러한 페이로드는 반복되는 키, 공백, 중괄호로 인해 잘 압축됩니다. 5~10초 동안의 공개 API 캐싱은 데이터의 최신 상태를 유지하면서 원본 부하를 줄이는 데 널리 사용됩니다.
캐싱이 없어도 이러한 응답을 압축하면 전송되는 총 바이트를 최대 90%까지 줄일 수 있습니다.
동영상 전송을 위한 재생 시작 시간과 실시간 스트리밍의 조인 지연 시간을 개선합니다. 대규모 실시간 재생목록(매니페스트)에는 HLS 또는 DASH 재생목록 메타데이터는 물론 각 세그먼트의 호스트 + 경로 프리픽스가 포함된 상당한 양의 반복 데이터가 있습니다. 재생목록 로드 또는 재생목록 업데이트가 더 빨리 다운로드될수록 클라이언트가 참조된 동영상 세그먼트 파싱 및 다운로드를 대기하는 시간이 줄어듭니다. HLS 및 DASH 재생목록은 총 크기가 90% 넘게 감소하는 경우가 많습니다.
시작하기 전에
다음 조건을 충족하는지 확인하세요.
- Cloud CDN이 사용 설정된 백엔드가 구성되어 있습니다. Cloud CDN이 구성되어 있지 않으면 설정 가이드 중 하나를 따르세요.
- 백엔드에 제공할 수 있는 압축 콘텐츠가 있습니다(예: 1KiB~10MiB인 웹 애셋 또는 동영상 매니페스트).
- 클라이언트가 범위 요청 또는 강력한 ETag를 사용하여 부분 콘텐츠를 가져오지 않습니다. 이는 동적 압축과 호환되지 않습니다.
- 클라이언트에서
Content-Length
헤더 없이 응답을 처리할 수 있습니다. 예를 들어 Cloud CDN에서 압축하는 캐시 부적중에는Content-Length
헤더가 없습니다. - 백엔드 구성을 변경하는 데 필요한 IAM Compute 부하 분산기 관리자 역할(
roles/compute.loadBalancerAdmin
)이 있습니다.
백엔드 서비스 또는 백엔드 버킷에서 압축 사용 설정
압축을 사용 설정하려면 다음 단계를 수행합니다.
콘솔
새 원본 추가
새 원본을 추가 및 설정하려면 적절한 백엔드 유형에 대한 설정 개요의 안내를 따릅니다. 원본을 만들 때 고급 옵션 섹션을 사용하여 압축 모드 목록에서 자동을 선택해 동적 압축을 구성합니다.
기존 원본 수정
기존 Cloud CDN 원본을 수정하려면 다음 안내를 따르세요.
Google Cloud 콘솔에서 Cloud CDN 원본 페이지로 이동합니다.
수정할 원본 이름을 클릭한 후 수정을 클릭합니다.
원본 기본사항 섹션에서 다음을 클릭합니다.
호스트 및 경로 규칙 섹션에서 다음을 클릭합니다.
캐시 성능 섹션에서 고급 옵션으로 이동합니다.
압축 모드 목록에서 자동을 선택합니다.
변경사항을 적용하려면 완료를 클릭합니다.
gcloud
백엔드 서비스의 경우 --compression-mode
플래그와 함께 gcloud compute backend-services
create
명령어 또는 gcloud compute backend-services
update
명령어를 사용합니다.
백엔드 버킷의 경우 --compression-mode
플래그와 함께 gcloud compute backend-buckets create
명령어 또는 gcloud compute backend-buckets update
명령어를 사용합니다.
새 백엔드 서비스의 경우 create
명령어를 사용합니다.
gcloud compute backend-services create BACKEND_SERVICE_NAME \ --compression-mode=AUTOMATIC
기존 백엔드 서비스의 경우 update
명령어를 사용합니다.
gcloud compute backend-services update BACKEND_SERVICE_NAME \ --compression-mode=AUTOMATIC
새 백엔드 버킷의 경우 create
명령어를 사용합니다.
gcloud compute backend-buckets create BACKEND_BUCKET_NAME --compression-mode=AUTOMATIC
기존 백엔드 버킷의 경우 update
명령어를 사용합니다.
gcloud compute backend-buckets update BACKEND_BUCKET_NAME --compression-mode=AUTOMATIC
compression-mode
는 다음 중 하나일 수 있습니다.
AUTOMATIC
: 클라이언트에서 보낸Accept-Encoding
헤더를 기반으로 최적의 압축을 자동으로 사용합니다. 이렇게 하면 대부분의 경우 Brotli 압축이 선호됩니다.DISABLED
(기본값): 압축을 사용 중지합니다.
API
백엔드 서비스의 경우 backendServices.insert
메서드 또는 backendServices.update
메서드를 사용합니다.
백엔드 버킷의 경우 backendBuckets.insert
메서드 또는 backendBuckets.update
메서드를 사용합니다.
다음 명령어 중 하나를 사용합니다.
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices
PUT https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets
PUT https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/BACKEND_BUCKET
JSON 요청 본문에 다음 스니펫을 추가합니다.
"compressionMode": AUTOMATIC
compression-mode
는 다음 중 하나일 수 있습니다.
AUTOMATIC
(권장): 클라이언트에서 전송한Accept-Encoding
헤더를 기반으로 최적의 압축을 자동으로 사용합니다. 이렇게 하면 대부분의 경우 Brotli 압축이 선호됩니다.DISABLED
(기본값): 압축을 사용 중지합니다.
몇 분 내에 모든 에지 위치에 구성이 적용됩니다. 백엔드에서 제공하는 압축 가능한 콘텐츠는 클라이언트에 전송되기 전에 압축됩니다.
압축 모드
기본 압축 모드는 DISABLED
입니다.
AUTOMATIC
모드를 사용하면 Cloud CDN이 다음을 기반으로 최적의 압축 방법을 선택할 수 있습니다.
- 클라이언트에 허용되는 인코딩
- 응답의 예상 압축률
- Cloud CDN 압축 속도(처리량)
Brotli는 비슷한 압축 해제 성능으로 gzip을 통해 대부분의 콘텐츠 유형에서 다운로드 크기를 추가로 10~20% 줄일 수 있으므로 클라이언트에서의 다운로드 시간 및 압축 해제 속도를 고려할 때 전반적으로 속도가 빨라집니다.
Cloud CDN은 선택한 압축 방법을 응답의 Content-Encoding
헤더에서 gzip
또는 brotli
와 같이 나타냅니다.
Cloud CDN은 클라이언트의 총 다운로드 크기와 CPU 비용의 균형을 맞출 압축 수준을 결정합니다. 압축 수준이 높다고 해서 항상 성능의 이점을 얻을 수 있는 것은 아니며, 특히 성능이 낮은 휴대기기에서는 더 그렇습니다.
Cloud CDN에서 처음 콘텐츠를 압축하면 응답에서 Content-Length
헤더가 삭제됩니다. 이는 전체 응답이 압축될 때까지 전체 콘텐츠 길이를 알 수 없으므로 응답이 가능한 한 빠르게 제공될 수 있도록 하는 데 필요합니다.
응답이 압축되고 캐시되면 Cloud CDN은 이후 응답에 Content-Length
헤더를 포함할 수 있습니다.
(HTTP/1.1 이하의 경우 Cloud CDN은 Content-Length
를 사용하지 않으면 응답에 Transfer-Encoding:
chunked
를 사용합니다.)
응답은 언제 압축되나요?
요청에 gzip 또는 Brotli 알고리즘에 대한 지원을 명시적으로 나열하는 Accept-Encoding
헤더가 있는 경우 압축 가능한 콘텐츠 유형과 일치하는 Content-Type
헤더를 사용한 백엔드(원본)에서 제공되는 압축되지 않은 응답이 gzip 또는 Brotli로 적절하게 압축됩니다. 요청에 Accept-Encoding
헤더가 없거나 Accept-Encoding: *
가 있는 경우 응답은 압축되지 않습니다.
예를 들어 클라이언트 요청의 Accept-Encoding
헤더가 있는 경우 응답은 다음 표의 정보에 따라 압축되거나 압축되지 않습니다.
Accept-Encoding 요청 헤더 | 응답 인코딩 |
---|---|
gzip, compress, br |
Brotli(br) |
deflate |
압축되지 않음 |
deflate, gzip |
gzip |
identity |
압축되지 않음 |
* |
압축되지 않음 |
압축 가능한 콘텐츠 유형
동적 압축은 Content-Type
HTTP 응답 헤더를 기준으로 다음 MIME 유형에 적용됩니다. Content-Type
응답 헤더가 없는 응답은 압축되지 않습니다.
일반적인 콘텐츠 유형과 MIME 유형은 다음과 같습니다.
- HTML 콘텐츠:
text/html
- 스타일시트:
text/css
- 자바스크립트:
application/javascript
- JSON:
application/json
- HLS 재생목록:
application/x-mpegURL
또는application/vnd.apple.mpegURL
- DASH 매니페스트:
application/dash+xml
다음 표에는 MIME 유형이 압축 가능성에 미치는 영향이 요약되어 있습니다.
압축 가능한 MIME 유형 | |
---|---|
일치검색 | application/x-javascript application/x-sdch-dictionary application/javascript application/xml application/csv application/json application/json+protobuf application/signed-exchange application/vnd.apple.mpegurl application/wasm application/x-plist application/x-protobuffer application/x-protobuf application/x-nacl application/x-pnacl font/ttf font/otf font/eot image/svg+xml image/pwg-raster image/x-icon image/vnd.microsoft.icon video/vnd.mpeg.dash.mpd audio/mpegURL application/dash+xml application/vnd.ms-sstr+xml |
패턴 일치 | application/*+json application/*+xml application/*mpegURL text/* |
이미지 및 동영상 형식(예: image/jpeg
, image/png
, video/mpeg4
)은 거의 항상 압축되어 있으므로 Cloud CDN에서 압축하지 않습니다. 이미 압축된 응답을 다시 압축하면 파일 크기가 거의 줄어들지 않으며 클라이언트가 이러한 종류의 응답을 받을 때 예기치 않은 동작이 발생할 수 있습니다.
응답이 압축되지 않은 경우는 언제인가요?
동적 압축은 다음 특성 중 하나 이상을 가진 응답을 압축하지 않습니다.
- 응답에 압축 가능한 콘텐츠 유형과 일치하는
Content-Type
헤더가 없습니다. Content-Length
헤더가 없습니다.Content-Encoding
헤더를 가집니다.1KiB보다 작습니다.
압축 및 압축 해제에 소비된 시간은 종종 이점을 상쇄합니다. 압축할 콘텐츠도 적기 때문에 압축 효율이 떨어져 압축률이 낮을 수 있습니다.
10MiB를 초과합니다.
Cache-Control: no-transform
헤더를 가집니다.Vary: Accept-Encoding
헤더를 가집니다.
범위 요청
Cloud CDN이 응답을 압축하면 Cloud CDN은 Accept-Ranges: none
헤더를 추가하고 기존 Accept-Ranges
헤더를 대체합니다. 이러한 응답의 캐시 적중은 Range
헤더를 무시합니다.
클라이언트가 압축된 또는 압축되지 않은 리소스로부터 바이트 범위를 예상할 수 있는 방법이 없으므로, 이렇게 하면 잘못된 부분 콘텐츠가 클라이언트에 제공되지 않습니다.
ETags
동적 압축이 응답을 압축하면 RFC 7232 섹션 2.3에 따라 강력한 ETag 헤더가 약화됩니다.
예를 들어 ETag: "xyzzy"
는 ETag: W/"xyzzy"
로 바뀝니다.
Vary 헤더
압축 가능성이 있는 응답(요청에 따라 다름)을 제공하는 경우 Cloud CDN에서 응답에 Vary: Accept-Encoding
헤더를 추가합니다.
응답 변경사항 요약
다음 표에는 압축이 발생했을 때 Cloud CDN에서 응답 헤더에 적용하는 변경사항이 요약되어 있습니다.
응답 헤더 | 압축 후 헤더 값 |
---|---|
Content-Encoding | gzip 또는 brotli로 설정합니다. |
ETag | 강력한 항목 태그는 프리픽스 W/로 표시된 약화된 버전으로 대체됩니다. |
Accept-Ranges | none 값으로 설정합니다. |
Content-Length | 완전히 삭제하거나 있는 경우 압축된 본문 콘텐츠의 길이로 설정할 수 있습니다. |
Transfer-Encoding | HTTP/1.1 이하 프로토콜의 경우 Cloud CDN에서 Content-Length를 제거하면 이 헤더를 추가하고 값을 청크로 설정하여 응답 본문을 청크합니다. |
로깅
Cloud CDN 로그는 부하 분산기에서 응답을 압축했는지 여부와 압축 유형을 나타내는 compressionStatus
필드를 jsonPayload
에 포함합니다.
{ insertId: "1c02hw9g3gjay67" jsonPayload: { @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry" statusDetails: "response_sent_by_backend" cacheId: "IAD-862d661f" compressionStatus: "br" } }
결제
Cloud CDN 또는 Cloud Load Balancing에서 응답을 압축하면 관련 아웃바운드 캐시 데이터 전송 또는 아웃바운드 인터넷 데이터 전송이 각각 클라이언트에 전송된 최종 압축 바이트를 기준으로 측정됩니다.
압축 가능한 대량의 응답을 제공하는 경우 월별 아웃바운드 데이터 전송 비용이 줄어들고 최종 사용자의 성능이 향상될 수 있습니다.
측정항목
압축이 사용 설정되면 loadbalancing.googleapis.com
아래의 기존 https/response_bytes_count
측정항목이 압축된 응답 크기를 보고합니다.
총 응답 바이트와 아웃바운드 데이터 전송 처리량이 감소할 것으로 예상됩니다.
HTML, CSS, 자바스크립트, JSON과 같이 압축이 잘 되는 대량의 텍스트 기반 콘텐츠를 제공하는 경우 응답 바이트가 크게 감소할 수 있습니다.
자세한 내용은 Monitoring을 참조하세요.
다음 단계
- 캐시 모드가 콘텐츠를 더 쉽게 캐시하는 방법을 알아보려면 캐시 모드 변경을 참조하세요.
- HTTP(S) 부하 분산 인스턴스와 스토리지 버킷에 Cloud CDN을 사용 설정하려면 설정 개요를 참조하세요.
- 캐시 무효화에 대한 자세한 내용은 캐시 무효화 개요를 참조하세요.
- GFE 접속 지점을 찾으려면 캐시 위치를 참조하세요.