Amazon CloudFront
개발자 안내서 (API 버전 2016-09-29)

사용자 지정 오리진에 대한 요청 및 응답 동작

CloudFront에서 요청을 처리하고 사용자 지정 오리진 서버에 요청을 전달하는 방법

이 주제에는 CloudFront에서 최종 사용자 요청을 처리하고 이 요청을 사용자 지정 오리진에 전달하는 방법에 대한 자세한 내용이 포함되어 있습니다.

인증

DELETE, GET, HEAD, PATCH, POST, PUT 요청에 대해 Authorization 헤더를 오리진에 전달하도록 CloudFront를 구성하는 경우, 클라이언트 인증을 요청하도록 오리진 서버를 구성할 수 있습니다.

OPTIONS 요청에 대해서는 다음 CloudFront 설정을 사용하는 경우에만 클라이언트 인증을 요청하도록 오리진 서버를 구성할 수 있습니다.

  • Authorization 헤더를 오리진에 전달하도록 CloudFront를 구성합니다.

  • OPTIONS 요청에 대한 응답을 캐싱하지 않도록 CloudFront를 구성합니다.

HTTP 또는 HTTPS를 사용하여 오리진에 요청을 전달하도록 CloudFront를 구성할 수 있습니다. 자세한 내용은 CloudFront에서 HTTPS 사용 단원을 참조하십시오.

캐싱 시간 및 최소 TTL

웹 배포의 경우 CloudFront에서 다른 요청을 오리진에 전달하기 전에 객체를 CloudFront 캐시에 보관하는 시간을 제어하려면

  • Cache-Control 또는 Expires 헤더 파일을 각 객체에 추가하도록 오리진을 구성합니다.

  • CloudFront 캐시 동작에 최소 TTL 값을 지정합니다.

  • 기본값인 24시간을 사용합니다.

자세한 내용은 콘텐츠가 엣지 캐시에 유지되는 기간 관리(만료) 단원을 참조하십시오.

클라이언트 IP 주소

최종 사용자가 CloudFront에 요청을 보내고 X-Forwarded-For 요청 헤더를 포함하지 않는 경우, CloudFront는 TCP 연결에서 최종 사용자의 IP 주소를 가져오고 IP 주소를 포함하는 X-Forwarded-For 헤더를 추가하고 오리진에 요청을 전달합니다. 예를 들어 CloudFront가 IP TCP 연결에서 주소 192.0.2.2를 가져오면 오리진에 다음 헤더를 전달합니다.

X-Forwarded-For: 192.0.2.2

최종 사용자가 CloudFront에 요청을 보내고 X-Forwarded-For 요청 헤더를 포함하는 경우, CloudFront는 TCP 연결에서 최종 사용자의 IP 주소를 가져와 X-Forwarded-For 헤더의 끝에 첨부하고 오리진에 요청을 전달합니다. 예를 들어 최종 사용자 요청에 X-Forwarded-For: 192.0.2.4,192.0.2.3가 포함되고 CloudFront가 TCP 연결에서 IP 주소 192.0.2.2를 가져오면 오리진에 다음 헤더를 전달합니다.

X-Forwarded-For: 192.0.2.4,192.0.2.3,192.0.2.2

로드 밸런서(Elastic Load Balancing 포함), 웹 애플리케이션 방화벽, 역방향 프록시, 침입 방지 시스템 및 API 게이트웨이와 같은 일부 애플리케이션들은 해당 요청을 전달한 CloudFront 엣지 서버의 IP 주소를 X-Forwarded-For 헤더의 끝에 추가합니다. 예를 들어 CloudFront가 ELB에 전달하는 요청에 X-Forwarded-For: 192.0.2.2를 포함시키고 CloudFront 엣지 서버의 IP 주소가 192.0.2.199인 경우, EC2 인스턴스가 수신하는 요청에는 다음과 같은 헤더가 들어 있습니다.

X-Forwarded-For: 192.0.2.2,192.0.2.199

참고

X-Forwarded-For 헤더에는 IPv4 주소(예: 192.0.2.44)와 IPv6 주소(예: 2001:0db8:85a3:0000:0000:8a2e:0370:7334)가 포함됩니다.

클라이언트측 SSL 인증

CloudFront는 클라이언트측 SSL 인증서와 클라이언트 인증을 지원하지 않습니다. 오리진이 클라이언트측 인증서를 요청하는 경우 CloudFront에서는 이 요청을 삭제합니다.

압축

CloudFront에서는 Accept-Encoding 필드 값이 "identity""gzip"인 요청을 전달합니다. 자세한 내용은 압축된 파일 제공 단원을 참조하십시오.

조건부 요청

CloudFront는 엣지 캐시에서 만료된 객체에 대한 요청을 받으면 이 요청을 오리진으로 전달하여 최신 버전의 객체를 가져오거나 CloudFront 엣지 캐시에 이미 최신 버전이 있는지 오리진의 확인을 받습니다. 대개 오리진에서 마지막에 CloudFront에 객체를 보낼 때는 ETag 값, LastModified 값 또는 두 값 모두를 응답에 포함하여 보냅니다. CloudFront에서 오리진에 전달하는 새 요청에서 CloudFront는 다음 중 하나 또는 둘 모두를 추가합니다.

  • 만료된 버전의 객체에 대한 If-Match 값을 포함하는 If-None-Match 또는 ETag 헤더

  • 만료된 버전의 객체에 대한 If-Modified-Since 값을 포함하는 LastModified 헤더

오리진에서는 이 정보를 사용하여 객체가 업데이트되는지 여부와, 그에 따라 전체 객체를 CloudFront에 반환할지 아니면 HTTP 304 상태 코드(수정되지 않음)만 반환할지 여부를 결정합니다.

쿠키

쿠키를 오리진에 전달하도록 CloudFront를 구성할 수 있습니다. 자세한 내용은 쿠키를 기반으로 콘텐츠 캐싱 단원을 참조하십시오.

CORS(Cross-Origin Resource Sharing)

CloudFront에서 cross-origin 리소스 공유 설정을 지키도록 하려는 경우, Origin 헤더를 오리진에 전달하도록 CloudFront를 구성합니다. 자세한 내용은 요청 헤더에 따라 콘텐츠 캐싱 단원을 참조하십시오.

암호화

최종 사용자는 HTTPS를 사용하여 CloudFront에 요청을 전송하도록 하고 CloudFront에는 최종 사용자에 의해 사용된 프로토콜을 사용하여 사용자 지정 오리진에 요청을 전달하도록 할 수 있습니다. 자세한 내용은 다음 배포 설정을 참조하십시오.

CloudFront에서는 SSLv3, TLSv1.0, TLSv1.1 및 TLSv1.2 프로토콜을 사용하여 HTTPS 요청을 오리진 서버에 전달합니다. 사용자 지정 오리진의 경우, 오리진과 통신할 때 CloudFront에서 사용하려는 SSL 프로토콜을 선택할 수 있습니다.

  • CloudFront 콘솔을 사용하는 경우, 오리진 SSL 프로토콜 확인란을 사용하여 프로토콜을 선택합니다. 자세한 내용은 배포 만들기 단원을 참조하십시오.

  • CloudFront API를 사용하는 경우, OriginSslProtocols 요소를 사용하여 프로토콜을 지정하십시오. 자세한 내용은 Amazon CloudFront API ReferenceOriginSslProtocolsDistributionConfig 단원을 참조하십시오.

오리진이 Amazon S3 버킷인 경우, CloudFront는 항상 TLSv1.2를 사용합니다.

중요

다른 버전의 SSL 및 TLS는 지원되지 않습니다.

CloudFront에서 HTTPS를 사용하는 방법은 CloudFront에서 HTTPS 사용 단원을 참조하십시오. 최종 사용자와 CloudFront 간의 HTTPS 통신 및 CloudFront와 오리진 간의 HTTPS 통신에 대해 CloudFront가 지원하는 암호 목록은 최종 사용자와 CloudFront 간 통신에 지원되는 SSL/TLS 프로토콜 및 암호 단원을 참조하십시오.

본문이 포함되는 GET 요청

최종 사용자 GET 요청에 본문이 포함되는 경우, CloudFront에서는 HTTP 상태 코드 403(금지됨)을 최종 사용자에게 반환합니다.

HTTP 메소드

지원되는 모든 HTTP 메서드를 처리하도록 CloudFront를 구성하는 경우, CloudFront에서는 최종 사용자의 다음 요청을 수락하고 이를 사용자 지정 오리진에 전달합니다.

  • DELETE

  • GET

  • HEAD

  • OPTIONS

  • PATCH

  • POST

  • PUT

CloudFront에서는 GETHEAD 요청에 대한 응답을 항상 캐싱합니다. 또한 OPTIONS 요청에 대한 응답을 캐싱하도록 CloudFront를 구성할 수도 있습니다. CloudFront에서는 다른 메서드를 사용하는 요청에 대한 응답을 캐싱하지 않습니다.

사용자 지정 오리진에서 이러한 메소드를 처리할지 여부를 구성하는 방법에 대한 자세한 내용은 오리진에 대한 설명서를 참조하십시오.

중요

CloudFront에서 지원되는 모든 HTTP 메서드를 허용하고 오리진에 전달하도록 CloudFront를 구성한 경우, 모든 메서드를 처리하도록 오리진 서버를 구성합니다. 예를 들어, POST를 사용할 의도로 이러한 메서드를 허용 및 전달하도록 CloudFront를 구성한 경우, 최종 사용자에 의해 삭제되는 것을 원치 않는 리소스를 이들이 삭제할 수 없도록 DELETE 요청을 적절히 처리하여 오리진 서버를 구성해야 합니다. 자세한 내용은 HTTP 서버에 대한 설명서를 참조하십시오.

HTTP 요청 헤더 및 CloudFront 동작(사용자 지정 및 S3 오리진)

다음 테이블에는 사용자 지정 오리진과 Amazon S3 오리진 모두에 전달할 수 있는 HTTP 요청 헤더가 나열되어 있습니다(예외 참조). 각 헤더의 테이블에는 다음에 대한 정보가 포함되어 있습니다.

  • 헤더를 오리진에 전달하도록 CloudFront를 구성하지 않은 경우의 CloudFront 동작으로, CloudFront에서 헤더 값에 따라 객체를 캐싱하는 원인이 됩니다.

  • 해당 헤더에 대해 헤더 값에 따라 객체를 캐싱하도록 CloudFront를 구성할 수 있는지 여부.

    DateUser-Agent 헤더의 값에 따라 객체를 캐싱하도록 CloudFront를 구성할 수 있지만, 권장되지는 않습니다. 이러한 헤더는 여러 가지 값을 가질 수 있으며, 헤더의 값에 따른 캐싱으로 인해 CloudFront에서 오리진에 전달되는 요청이 눈에 띄게 증가할 수 있습니다.

헤더 값에 따른 캐싱에 대한 자세한 내용은 요청 헤더에 따라 콘텐츠 캐싱 단원을 참조하십시오.

헤더 헤더 값에 따라 캐싱하도록 CloudFront를 구성하지 않은 경우의 동작 헤더 값에 따른 캐싱이 지원되는지 여부

기타 정의 헤더

CloudFront에서 오리진에 헤더를 전달합니다.

Accept

CloudFront에서 헤더를 제거합니다.

Accept-Charset

CloudFront에서 헤더를 제거합니다.

Accept-Encoding

값에 gzip이 포함되어 있는 경우, CloudFront에서 Accept-Encoding: gzip을 오리진에 전달합니다.

이 값에 gzip이 포함되어 있지 않은 경우, CloudFront에서는 오리진으로 요청을 전달하기 전에 Accept-Encoding 헤더 필드를 제거합니다.

Accept-Language

CloudFront에서 헤더를 제거합니다.

Authorization

  • GETHEAD 요청 – CloudFront에서는 요청을 오리진에 전달하기 전에 Authorization 헤더 필드를 제거합니다.

  • OPTIONS 요청 – OPTIONS 요청에 대한 응답을 캐싱하도록 CloudFront를 구성한 경우, CloudFront에서는 요청을 오리진에 전달하기 전에 Authorization 헤더 필드를 제거합니다.

    OPTIONS 요청에 대한 응답을 캐싱하도록 CloudFront를 구성하지 않은 경우, CloudFront에서는 Authorization 헤더 필드를 오리진에 전달합니다.

  • DELETE, PATCH, POST, PUT 요청 – CloudFront에서는 요청을 오리진에 전달하기 전에 헤더 필드를 제거하지 않습니다.

Cache-Control

CloudFront에서 오리진에 헤더를 전달합니다.

아니요

CloudFront-Forwarded-Proto

요청을 오리진에 전달하기 전에는 CloudFront에서 헤더를 추가하지 않습니다.

자세한 내용은 요청의 프로토콜을 기반으로 캐싱하도록 구성 단원을 참조하십시오.

CloudFront-Is-Desktop-Viewer

요청을 오리진에 전달하기 전에는 CloudFront에서 헤더를 추가하지 않습니다.

자세한 내용은 디바이스 유형을 기반으로 캐싱하도록 구성 단원을 참조하십시오.

CloudFront-Is-Mobile-Viewer

요청을 오리진에 전달하기 전에는 CloudFront에서 헤더를 추가하지 않습니다.

자세한 내용은 디바이스 유형을 기반으로 캐싱하도록 구성 단원을 참조하십시오.

CloudFront-Is-Tablet-Viewer

요청을 오리진에 전달하기 전에는 CloudFront에서 헤더를 추가하지 않습니다.

자세한 내용은 디바이스 유형을 기반으로 캐싱하도록 구성 단원을 참조하십시오.

CloudFront-Viewer-Country

요청을 오리진에 전달하기 전에는 CloudFront에서 헤더를 추가하지 않습니다.

Connection

CloudFront에서는 요청을 오리진에 전달하기 전에 Connection: Keep-Alive로 이 헤더를 대체합니다.

아니요

Content-Length

CloudFront에서 오리진에 헤더를 전달합니다.

아니요

Content-MD5

CloudFront에서 오리진에 헤더를 전달합니다.

Content-Type

CloudFront에서 오리진에 헤더를 전달합니다.

Cookie

쿠키를 전달하도록 CloudFront를 구성한 경우, Cookie 헤더 필드가 오리진에 전달됩니다. 그렇지 않은 경우 CloudFront에서는 Cookie 헤더 필드를 제거합니다. 자세한 내용은 쿠키를 기반으로 콘텐츠 캐싱 단원을 참조하십시오.

아니요

Date

CloudFront에서 오리진에 헤더를 전달합니다.

지원되나 권장되지 않음

Expect

CloudFront에서 헤더를 제거합니다.

From

CloudFront에서 오리진에 헤더를 전달합니다.

Host

CloudFront에서 값을 요청된 객체와 연결된 오리진의 도메인 이름에 설정합니다.

Amazon S3 또는 MediaStore 오리진에 대한 호스트 헤더를 기반으로 캐시할 수 없습니다.

예(사용자 지정)

아니요(S3 및 MediaStore)

If-Match

CloudFront에서 오리진에 헤더를 전달합니다.

If-Modified-Since

CloudFront에서 오리진에 헤더를 전달합니다.

If-None-Match

CloudFront에서 오리진에 헤더를 전달합니다.

If-Range

CloudFront에서 오리진에 헤더를 전달합니다.

If-Unmodified-Since

CloudFront에서 오리진에 헤더를 전달합니다.

Max-Forwards

CloudFront에서 오리진에 헤더를 전달합니다.

아니요

Origin

CloudFront에서 오리진에 헤더를 전달합니다.

Pragma

CloudFront에서 오리진에 헤더를 전달합니다.

아니요

Proxy-Authenticate

CloudFront에서 헤더를 제거합니다.

아니요

Proxy-Authorization

CloudFront에서 헤더를 제거합니다.

아니요

Proxy-Connection

CloudFront에서 헤더를 제거합니다.

아니요

Range

CloudFront에서 오리진에 헤더를 전달합니다. 자세한 내용은 CloudFront에서 객체에 대한 부분적인 요청을 처리하는 방법(Range GET) 단원을 참조하십시오.

기본적으로 지원됨

Referer

CloudFront에서 헤더를 제거합니다.

Request-Range

CloudFront에서 오리진에 헤더를 전달합니다.

아니요

TE

CloudFront에서 헤더를 제거합니다.

아니요

Trailer

CloudFront에서 헤더를 제거합니다.

아니요

Transfer-Encoding

CloudFront에서 오리진에 헤더를 전달합니다.

아니요

Upgrade

CloudFront에서는 WebSocket 연결이 설정되지 않았을 경우 헤더를 제거합니다.

아니요(WebSocket 연결 제외)

User-Agent

CloudFront에서 이 헤더의 값을 Amazon CloudFront로 대체합니다. CloudFront에서 사용자가 이용 중인 디바이스에 따라 콘텐츠를 캐싱하도록 하려는 경우, 디바이스 유형을 기반으로 캐싱하도록 구성 단원을 참조하십시오.

지원되나 권장되지 않음

Via

CloudFront에서 오리진에 헤더를 전달합니다.

Warning

CloudFront에서 오리진에 헤더를 전달합니다.

X-Amz-Cf-Id

CloudFront에서는 요청을 오리진에 전달하기 전에 최종 사용자 요청에 헤더를 추가합니다. 헤더 값에는 요청을 고유하게 식별하는 암호화된 문자열이 포함됩니다.

아니요

X-Edge-*

CloudFront는 모든 X-Edge-* 헤더를 삭제합니다.

아니요

X-Forwarded-For

CloudFront에서 오리진에 헤더를 전달합니다. 자세한 내용은 클라이언트 IP 주소 단원을 참조하십시오.

X-Forwarded-Proto

CloudFront에서 헤더를 제거합니다.

아니요

X-Real-IP

CloudFront에서 헤더를 제거합니다.

아니요

HTTP 버전

CloudFront에서는 HTTP/1.1을 사용하여 사용자 지정 오리진에 요청을 전달합니다.

요청의 최대 길이 및 최대 URL 길이

경로, 쿼리 문자열(있는 경우), 헤더를 모두 포함한 요청의 최대 길이는 20,480바이트입니다.

CloudFront에서는 이 요청으로부터 URL을 구성합니다. 이 URL의 최대 길이는 8,192바이트입니다.

요청 또는 URL이 이 제한을 초과할 경우 CloudFront에서는 HTTP 요청 코드 413(요청 개체가 너무 큼)을 반환한 후 최종 사용자와의TCP 연결을 종료합니다.

OCSP 스테이플링

최종 사용자가 객체에 대한 HTTPS 요청을 제출할 때 CloudFront 또는 최종 사용자는 CA(인증 기관)을 통해 도메인의 SSL 인증서가 해지되지 않았는지 확인해야 합니다. OCSP 스테이플링은 CloudFront에서 인증서의 유효성을 검사하고 CA로부터 응답을 캐싱할 수 있도록 함으로써 클라이언트가 CA를 통해 직접 인증서의 유효성을 검사하지 않아도 되므로 인증서 유효성 검사 속도가 향상됩니다.

OSCP 스테이플링의 성능 개선은 CloudFront에서 같은 도메인 내의 객체에 대해 많은 HTTPS 요청을 받은 경우 더욱 확연히 드러납니다. CloudFront 엣지 로케이션의 각 서버는 개별적인 유효성 검사 요청을 제출해야 합니다. CloudFront에서 같은 도메인에 대해 다수의 HTTPS 요청을 받은 경우, 엣지 로케이션의 각 서버에서는 곧 CA로부터 SSL 핸드셰이크의 패킷에 "스테이플"할 수 있다는 응답을 받습니다. 최종 사용자가 인증서가 유효하다는 조건을 충족하면 CloudFront에서는 요청된 객체를 제공할 수 있습니다. 배포가 CloudFront 엣지 로케이션에서 많은 양의 트래픽을 받지 않는 경우, 새로운 요청은 아직 CA를 통해 인증서의 유효성을 검사하지 않은 서버로 리디렉션될 가능성이 높습니다. 그러한 경우, 최종 사용자는 유효성 검사 단계를 개별적으로 수행하고 CloudFront 서버에서는 객체를 제공합니다. 해당 CloudFront 서버에서는 또한 유효성 검사 요청을 CA에 제출하고, 다음에 동일한 도메인 이름을 포함한 요청을 수신하면 CA로부터 유효성 검사 응답을 받습니다.

지속적인 연결

CloudFront가 오리진으로부터 응답을 받는 경우, 그 시간 동안 다른 요청이 도착하면 몇 초 정도 연결을 유지하려고 합니다. 지속적인 연결을 유지하면 TCP 연결 재설정 및 이후 요청에 대한 별도의 TLS 핸드쉐이크 수행에 필요한 시간이 절약됩니다.

지속적 연결의 지속 시간을 구성하는 방법 등 자세한 내용은 오리진 연결 유지 제한 시간 단원의 배포를 만들거나 업데이트할 때 지정하는 값을 참조하십시오.

프로토콜

CloudFront에서는 다음 사항을 바탕으로 HTTP 또는 HTTPS 요청을 오리진 서버에 전달합니다.

  • 최종 사용자가 CloudFront에 보낸 요청의 프로토콜(HTTP 또는 HTTPS)

  • CloudFront 콘솔에서 오리진 프로토콜 정책 필드의 값, 또는 CloudFront API를 사용 중인 경우 DistributionConfig 복합 형식의 OriginProtocolPolicy, 요소. CloudFront 콘솔에는 HTTP Only(HTTP만 해당), HTTPS Only(HTTPS만 해당) 및 Match Viewer 옵션이 있습니다.

HTTP Only(HTTP만 해당) 또는 HTTPS Only(HTTPS만 해당)를 지정하는 경우, 최종 사용자 요청의 프로토콜과 관계없이 CloudFront에서는 지정된 프로토콜을 사용하여 오리진 서버로 요청을 전달합니다.

Match Viewer를 지정하는 경우, CloudFront에서는 최종 사용자 요청의 프로토콜을 사용하여 오리진 서버에 요청을 전달합니다. 최종 사용자가 HTTP 및 HTTPS 프로토콜 모두를 사용하여 요청하더라도 CloudFront에서는 한 번만 객체를 캐싱합니다.

중요

CloudFront가 HTTPS 프로토콜을 사용하여 원본으로 요청을 전달하고 오리진 서버가 잘못된 인증서 또는 자체 서명한 인증서를 반환하는 경우, CloudFront에서는 TCP 연결을 끊습니다.

CloudFront 콘솔을 사용하여 배포를 업데이트하는 방법에 대한 자세한 내용은 배포 업데이트 단원을 참조하십시오. CloudFront API를 사용한 배포 업데이트 방법에 대한 자세한 내용은 Amazon CloudFront API ReferenceUpdateDistribution 단원을 참조하십시오.

쿼리 문자열

CloudFront에서 쿼리 문자열 파라미터를 오리진에 전달할지 여부를 구성할 수 있습니다. 자세한 내용은 쿼리 문자열 파라미터 기반의 콘텐츠 캐싱 단원을 참조하십시오.

오리진 응답 제한 시간

오리진 응답 제한 시간(오리진 요청 제한 시간 또는 오리진 읽기 제한 시간이라고도 함)은 다음 두 값에 모두 적용됩니다.

  • CloudFront가 사용자 지정 오리진에 요청을 전달한 후 응답을 기다리는 시간(초)

  • CloudFront가 오리진으로부터 응답 패킷을 수신한 후 다음 패킷을 수신할 때까지 대기하는 시간(초)

오리진 응답 제한 시간을 구성하는 방법 등 자세한 내용은 오리진 응답 제한 시간 단원의 배포를 만들거나 업데이트할 때 지정하는 값을 참조하십시오.

동일 객체에 대한 동시 요청(트래픽 스파이크)

CloudFront 엣지 로케이션에서 객체에 대한 요청을 받을 때 객체가 현재 캐시에 있지 않거나 객체가 만료된 경우, CloudFront에서는 즉시 요청을 오리진으로 보냅니다. 트래픽 스파이크가 있는 경우(오리진에서 첫 번째 요청에 응답하기 전에 동일 객체에 대한 추가 요청이 엣지 로케이션에 도착하는 경우) CloudFront에서는 객체에 대한 추가 요청을 오리진에 전달하기 전에 작업을 일시 중단합니다. 일반적으로는 후속 요청에 응답하기 전에 첫 번째 요청에 대한 응답이 CloudFront 엣지 로케이션에 도착하게 됩니다. 이러한 일시 중단은 오리진 서버에 불필요하게 로드가 걸리는 것을 줄여 줍니다. 요청 헤더나 쿠키에 따라 캐싱하도록 CloudFront를 구성하는 등의 이유로 추가 요청이 동일하지 않은 경우, CloudFront에서는 모든 고유한 요청을 오리진에 전달합니다.

User-Agent 헤더

CloudFront에서 사용자가 콘텐츠를 보기 위해 사용 중인 디바이스에 따라 여러 버전의 객체를 캐싱하도록 하려는 경우, 다음과 같이 하나 이상의 헤더를 사용자 지정 오리진에 전달하도록 CloudFront를 구성하는 것이 좋습니다.

  • CloudFront-Is-Desktop-Viewer

  • CloudFront-Is-Mobile-Viewer

  • CloudFront-Is-SmartTV-Viewer

  • CloudFront-Is-Tablet-Viewer

User-Agent 헤더의 값에 따라 CloudFront에서는 요청을 오리진에 전달하기 전에 이러한 헤더의 값을 true 또는 false로 설정합니다. 디바이스가 둘 이상의 범주에 해당하는 경우 둘 이상의 값이 true일 수 있습니다. 예를 들어, 일부 태블릿 디바이스의 경우 CloudFront에서는 CloudFront-Is-Mobile-ViewerCloudFront-Is-Tablet-Viewer를 모두 true로 설정할 수 있습니다. 요청 헤더에 따라 캐싱하도록 CloudFront를 구성하는 방법에 대한 자세한 내용은 요청 헤더에 따라 콘텐츠 캐싱 단원을 참조하십시오.

User-Agent 헤더의 값에 따라 객체를 캐싱하도록 CloudFront를 구성할 수 있지만, 권장되지는 않습니다. User-Agent 헤더는 여러 가지 값을 가질 수 있으며, 그러한 값에 따른 캐싱으로 인해 CloudFront에서 오리진에 전달되는 요청이 눈에 띄게 증가할 수 있습니다.

User-Agent 헤더의 값에 따라 객체를 캐싱하도록 CloudFront를 구성하지 않는 경우, CloudFront에서는 오리진에 요청을 전달하기 전에 다음 값으로 User-Agent 헤더를 추가합니다.

User-Agent = Amazon CloudFront

CloudFront에서는 최종 사용자의 요청에 User-Agent 헤더가 포함되어 있는지 여부와 관계없이 이 헤더를 추가합니다. 최종 사용자의 요청에 User-Agent 헤더가 포함되어 있는 경우, CloudFront에서는 이를 제거합니다.

CloudFront에서 사용자 지정 오리진 서버의 요청을 처리하는 방법

이 주제에는 CloudFront가 사용자 지정 오리진에서 요청을 처리하는 방법에 대한 자세한 내용이 포함되어 있습니다.

100-계속 응답

오리진은 CloudFront에 하나 이상의 100-계속 응답을 전송할 수 없습니다. 첫 번째 100-계속 응답 후에 CloudFront는 HTTP 200 OK 응답을 예상합니다. 오리진이 첫 번째 응답 후 또 다른 100-계속 응답을 전송하면 CloudFront는 오류를 반환합니다.

캐싱

  • 오리진 서버에서 DateLast-Modified 헤더 필드에 유효하고 정확한 값을 설정했는지 확인합니다.

  • 최종 사용자의 요청에 If-Match 또는 If-None-Match 요청 헤더 필드가 포함된 경우, ETag 응답 헤더 필드를 설정합니다. ETag 값을 지정하지 않은 경우, CloudFront에서는 후속 If-Match 또는 If-None-Match 헤더를 무시합니다.

  • CloudFront에서는 오리진의 응답으로 보통 Cache-Control: no-cache 헤더를 신뢰합니다. 예외 사항은 동일 객체에 대한 동시 요청(트래픽 스파이크) 단원을 참조하십시오.

취소된 요청

객체가 엣지 캐시에 있지 않은 경우 최종 사용자가 CloudFront가 오리진에서 객체를 가져온 뒤 요청된 객체를 제공하기 전에 브라우저 닫기 등으로 세션을 종료하면, CloudFront에서는 엣지 로케이션의 객체를 캐싱하지 않습니다.

콘텐츠 협상

오리진이 응답에서 Vary:*를 반환하는 경우와 해당 캐시 동작의 최소 TTL 값이 0인 경우, CloudFront에서는 객체를 캐싱하지만 오리진에 객체의 모든 후속 요청을 전송하여 캐시에 객체의 최신 버전이 포함되어 있음을 확인합니다. CloudFront에는 If-None-Match 또는 If-Modified-Since와 같은 조건부 헤더가 포함되지 않습니다. 결과적으로 오리진은 모든 요청에 응답하여 객체를 CloudFront에 반환합니다.

오리진이 응답에서 Vary:*를 반환하는 경우와 해당 캐시 동작의 Minimum TTL 값이 다른 값인 경우, CloudFront에서는 CloudFront에서 제거하거나 대체하는 HTTP 응답 헤더에 설명된 Vary 헤더를 처리합니다.

쿠키

캐시 동작에 대한 쿠키를 활성화한 경우 오리진에서 객체를 통해 쿠키를 반환하면 CloudFront에서는 객체와 쿠키를 모두 캐싱합니다. 이를 통해 객체에 대한 캐싱 가능성이 줄어듭니다. 자세한 내용은 쿠키를 기반으로 콘텐츠 캐싱 단원을 참조하십시오.

TCP 연결 끊김

오리진이 객체를 CloudFront에 반환하는 동안 CloudFront와 오리진 간의 TCP 연결이 끊어진 경우, CloudFront 동작은 오리진이 응답에 Content-Length 헤더를 포함했는지 여부에 따라 달라집니다.

  • Content-Length 헤더 – CloudFront에서는 오리진에서 객체를 가져오는 동안 최종 사용자에게 객체를 반환합니다. 그러나 Content-Length 헤더의 값이 객체의 크기와 일치하지 않는 경우, CloudFront에서는 객체를 캐싱하지 않습니다.

  • Transfer-Encoding: Chunked – CloudFront에서는 오리진에서 객체를 가져오는 동안 최종 사용자에게 객체를 반환합니다. 그러나 조각난 응답이 완전하지 않은 경우, CloudFront에서는 객체를 캐싱하지 않습니다.

  • No Content-Length 헤더 – CloudFront에서는 최종 사용자에게 객체를 반환하고 이를 캐싱하지만, 이 객체는 불완전할 수 있습니다. CloudFront에서는 Content-Length 헤더 없이는 TCP 연결이 실수로 또는 고의로 끊어졌는지 여부를 판단할 수 없습니다.

Content-Length 헤더를 추가하여 CloudFront에서 부분적인 객체를 캐싱하지 못하도록 HTTP 서버를 구성하는 것이 좋습니다.

CloudFront에서 제거하거나 대체하는 HTTP 응답 헤더

CloudFront는 오리진에서 최종 사용자에게 응답을 전달하기 전에 다음 헤더 필드를 제거하거나 업데이트합니다.

  • Set-Cookie – 쿠키를 전달하도록 CloudFront를 구성하는 경우, Set-Cookie 헤더 필드가 클라이언트에 전달됩니다. 자세한 내용은 쿠키를 기반으로 콘텐츠 캐싱 단원을 참조하십시오.

  • Trailer

  • Transfer-Encoding – 오리진에서 이 헤더 필드를 반환하는 경우, CloudFront에서는 최종 사용자에게 응답을 반환하기 전에 chunked에 값을 설정합니다.

  • Upgrade

  • Vary – 다음을 참조하십시오.

    • 디바이스별 헤더 중 하나를 오리진(CloudFront-Is-Desktop-Viewer, CloudFront-Is-Mobile-Viewer, CloudFront-Is-SmartTV-Viewer, CloudFront-Is-Tablet-Viewer)에 전달하도록 CloudFront를 구성하고 Vary:User-Agent를 CloudFront에 반환하도록 오리진을 구성하는 경우, CloudFront에서는 최종 사용자에게 Vary:User-Agent를 반환합니다. 자세한 내용은 디바이스 유형을 기반으로 캐싱하도록 구성 단원을 참조하십시오.

    • Vary 헤더에서 Accept-Encoding 또는 Cookie를 포함하도록 오리진을 구성하는 경우, CloudFront는 최종 사용자에 대한 응답에 대한 값을 포함합니다.

    • 헤더 화이트리스트를 오리진에 전달하도록 CloudFront를 구성하는 경우와 Vary 헤더(예를 들어 Vary:Accept-Charset,Accept-Language)의 CloudFront에 헤더 이름을 반환하도록 오리진을 구성하는 경우, CloudFront에서는 최종 사용자에게 Vary 헤더를 그 값과 함께 반환합니다.

    • CloudFront가 Vary 헤더의 * 값을 처리하는 방법에 대한 자세한 내용은 콘텐츠 협상 단원을 참조하십시오.

    • Vary 헤더에 그 밖의 값을 포함하도록 오리진을 구성하는 경우, CloudFront는 최종 사용자에게 응답을 반환하기 전에 값을 제거합니다.

  • Via – CloudFront는 최종 사용자에 대한 응답으로 값을 다음과 같이 설정합니다.

    Via: http-version alphanumeric-string.cloudfront.net (CloudFront)

    예를 들어, 클라이언트가 HTTP/1.1을 통해 요청한 경우 값은 다음과 같습니다.

    Via: 1.1 1026589cc7887e7a0dc7827b4example.cloudfront.net (CloudFront)

최대 파일 크기

CloudFront에서 최종 사용자에게 반환하는 응답 본문의 최대 크기는 20GB입니다. 여기에는 Content-Length 헤더 값으로 지정하지 않은 조각난 전송 응답이 포함됩니다.

오리진 사용 불가

오리진 서버를 사용할 수 없고 CloudFront에서 엣지 캐시에 있지만 만료된(Cache-Control max-age 명령에 지정된 기간이 지났다는 이유 등으로) 객체에 대한 요청을 받은 경우, CloudFront에서는 만료된 버전의 객체를 제공하거나 사용자 지정 오류 페이지를 표시합니다. 사용자 지정 오류 페이지를 구성한 경우 CloudFront 동작에 대한 자세한 내용은 사용자 지정 오류 페이지를 구성했을 때 CloudFront에서 오류를 처리하는 방법 단원을 참조하십시오.

경우에 따라 자주 요청되지는 않는 객체는 제거되고 엣지 캐시에서 더 이상 사용할 수 없게 됩니다. CloudFront에서는 제거된 객체를 제공할 수 없습니다.

리디렉션

오리진 서버에 있는 객체의 위치를 변경하는 경우 요청을 새 위치로 리디렉션하도록 웹 서버를 구성할 수 있습니다. 리디렉션을 구성한 뒤 처음으로 최종 사용자가 객체에 대한 요청을 제출할 때 CloudFront에서는 요청을 오리진에 전송하고 오리진에서는 리디렉션으로 응답합니다(예: 302 Moved Temporarily). CloudFront에서는 이 리디렉션을 캐싱하고 최종 사용자에게 이를 반환합니다. CloudFront에서는 이 리디렉션을 따라가지 않습니다.

다음 위치 중 하나로 요청을 리디렉션하도록 웹 서버를 구성할 수 있습니다.

  • 오리진 서버에 있는 객체의 새 URL입니다. 최종 사용자가 새 URL에 대한 리디렉션을 따라갈 때 최종 사용자는 CloudFront를 우회하고 오리진으로 직행합니다. 따라서 오리진에 있는 객체의 새 URL로 요청을 리디렉션하지 않는 것이 좋습니다.

  • 객체에 대한 새 CloudFront URL입니다. 최종 사용자가 새 CloudFront URL을 포함한 요청을 제출할 때, CloudFront는 새 위치에서 객체를 가져오고 이를 엣지 로케이션에서 캐싱하여 최종 사용자에게 반환합니다. 이 객체에 대한 후속 요청은 엣지 로케이션에서 제공됩니다. 이를 통해 최종 사용자의 오리진에서의 객체 요청과 관련된 시간 지연과 로드 발생을 피할 수 있습니다. 그러나 객체에 대한 새로운 요청이 발생할 때마다 CloudFront에 대한 두 개의 요청에 대해 요금이 부과됩니다.

전송 인코딩

CloudFront에서는 Transfer-Encoding 헤더에 대해 chunked 값만 지원합니다. 오리진에서 Transfer-Encoding: chunked를 반환하는 경우, CloudFront에서는 객체를 엣지 로케이션에서 수신한 객체로 클라이언트에 반환하고 후속 요청에 대해 chunked 형식의 객체를 캐싱합니다.

최종 사용자가 Range GET 요청을 하고 오리진이 Transfer-Encoding: chunked를 반환하는 경우, CloudFront에서는 요청한 범위 대신에 뷰어에 전체 객체를 반환합니다.

응답의 콘텐츠 길이를 사전에 결정할 수 없는 경우 chunked 인코딩을 사용하는 것이 좋습니다. 자세한 내용은 TCP 연결 끊김 단원을 참조하십시오.