Lightsail 배포에 대한 요청 및 응답 동작을 관리합니다. - Amazon Lightsail

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Lightsail 배포에 대한 요청 및 응답 동작을 관리합니다.

이 안내서에서는 요청을 처리 및 오리진에 전달하고 오리진에서 응답을 처리할 때 Amazon Lightsail 배포가 작동하는 방식을 설명합니다. 배포에 대한 자세한 내용은 콘텐츠 전송 네트워크 배포를 참조하세요.

주제

배포에서 요청을 처리하고 오리진에 요청을 전달하는 방법

이 섹션에서는 배포에서 최종 사용자 요청을 처리하고 요청을 오리진으로 전달하는 방법에 대한 정보를 제공합니다.

목차

인증

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

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

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

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

HTTP 또는 HTTPS를 사용하여 오리진에 요청을 전달하도록 배포를 구성할 수 있습니다.

캐싱 기간

다음과 같은 방법으로 배포에서 다른 요청을 오리진에 전달하기 전에 객체를 배포의 캐시에 보관하는 기간을 제어할 수 있습니다.

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

  • 캐시 수명 주기(TTL)를 기본값인 1일로 설정합니다.

자세한 내용은 배포 고급 설정을 참조하세요.

클라이언트 IP 주소

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

X-Forwarded-For: 192.0.2.2

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

X-Forwarded-For: 192.0.2.4,192.0.2.3,192.0.2.2

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

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 인증

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

압축

Lightsail 배포는 필드 값이 Accept-Encoding 및 인 요청을 전달합니다. "identity" "gzip"

조건부 요청

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

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

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

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

쿠키

쿠키를 오리진에 전달하도록 배포를 구성할 수 있습니다. 자세한 내용은 배포 고급 설정을 참조하세요.

교차 오리진 리소스 공유(CORS)

배포에서 cross-origin 리소스 공유 설정을 준수하도록 하려는 경우, Origin 헤더를 오리진에 전달하도록 오리진을 구성합니다.

암호화(Encryption)

최종 사용자가 HTTPS를 사용하여 배포에 연결하도록 하고 배포에서 HTTP 또는 HTTPS를 사용하여 요청을 오리진에 전달하도록 할 수 있습니다.

배포에서는 SSLv3, TLSv1.0, TLSv1.1 및 TLSv1.2 프로토콜을 사용하여 HTTPS 요청을 오리진에 전달합니다. 다른 버전의 SSL 및 TLS는 지원되지 않습니다.

본문이 포함되는 GET 요청

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

HTTP 메소드

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

  • DELETE

  • GET

  • HEAD

  • OPTIONS

  • PATCH

  • POST

  • PUT

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

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

중요

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

HTTP 요청 헤더 및 배포 동작

다음 목록에는 예외 사항과 함께 오리진으로 전달할 수 있는 HTTP 요청 헤더가 포함되어 있습니다. 각 헤더의 목록에는 다음과 같은 정보가 포함되어 있습니다.

  • 지원 여부 - 해당 헤더에 대해 헤더 값에 따라 객체를 캐싱하도록 배포를 구성할 수 있는지 여부입니다.

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

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

  • 헤더 - 기타 정의 헤더

    지원 여부 - 지원됨

    구성하지 않은 경우의 동작 - 배포에서 오리진에 헤더를 전달합니다.

  • 헤더 - Accept

    지원 여부 - 지원됨

    구성하지 않은 경우의 동작 - 배포에서 헤더를 제거합니다.

  • 헤더 - Accept-Charset

    지원 여부 - 지원됨

    구성하지 않은 경우의 동작 - 배포에서 헤더를 제거합니다.

  • 헤더 - Accept-Encoding

    지원 여부 - 지원됨

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

  • 헤더 - Accept-Language

    지원 여부 - 지원됨

    구성하지 않은 경우의 동작 - 배포에서 헤더를 제거합니다.

  • 헤더 - Authorization

    지원 여부 - 지원됨

    구성하지 않은 경우의 동작:

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

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

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

    • DELETE, PATCH, POSTPUT 요청 - 배포에서는 요청을 오리진에 전달하기 전에 헤더 필드를 제거하지 않습니다.

  • 헤더 - Cache-Control

    지원 여부 - 지원되지 않음

    구성하지 않은 경우의 동작 - 배포에서 오리진에 헤더를 전달합니다.

  • 헤더 - CloudFront-Forwarded-Proto

    지원 여부 - 지원됨

    구성하지 않은 경우의 동작 - 배포에서 오리진에 요청을 전달하기 전에 헤더를 추가하지 않습니다.

  • 헤더 - CloudFront-Is-Desktop-Viewer

    지원 여부 - 지원됨

    구성하지 않은 경우의 동작 - 배포에서 오리진에 요청을 전달하기 전에 헤더를 추가하지 않습니다.

  • 헤더 - CloudFront-Is-Mobile-Viewer

    지원 여부 - 지원됨

    구성하지 않은 경우의 동작 - 배포에서 오리진에 요청을 전달하기 전에 헤더를 추가하지 않습니다.

  • 헤더 - CloudFront-Is-Tablet-Viewer

    지원 여부 - 지원됨

    구성하지 않은 경우의 동작 - 배포에서 오리진에 요청을 전달하기 전에 헤더를 추가하지 않습니다.

  • 헤더 - CloudFront-Viewer-Country

    지원 여부 - 지원됨

    구성하지 않은 경우의 동작 - 배포에서 오리진에 요청을 전달하기 전에 헤더를 추가하지 않습니다.

  • 헤더 - Connection

    지원 여부 - 지원되지 않음

    구성하지 않은 경우의 동작 - 배포에서 요청을 오리진으로 전달하기 전에 이 헤더를 Connection: Keep-Alive로 바꿉니다.

  • 헤더 - Content-Length

    지원 여부 - 지원되지 않음

    구성하지 않은 경우의 동작 - 배포에서 오리진에 헤더를 전달합니다.

  • 헤더 - Content-MD5

    지원 여부 - 지원됨

    구성하지 않은 경우의 동작 - 배포에서 오리진에 헤더를 전달합니다.

  • 헤더 - Content-Type

    지원 여부 - 지원됨

    구성하지 않은 경우의 동작 - 배포에서 오리진에 헤더를 전달합니다.

  • 헤더 - Cookie

    지원 여부 - 지원되지 않음

    구성하지 않은 경우의 동작- 쿠키를 전달하도록 배포를 구성하면 Cookie 헤더 필드가 오리진으로 전달됩니다. 구성하지 않은 경우 배포에서는 Cookie 헤더 필드를 제거합니다.

  • 헤더 - Date

    지원 여부 - 지원되나 권장되지 않음

    구성하지 않은 경우의 동작 - 배포에서 오리진에 헤더를 전달합니다.

  • 헤더 - Expect

    지원 여부 - 지원됨

    구성하지 않은 경우의 동작 - 배포에서 헤더를 제거합니다.

  • 헤더 - From

    지원 여부 - 지원됨

    구성하지 않은 경우의 동작 - 배포에서 오리진에 헤더를 전달합니다.

  • 헤더 - Host

    지원 여부 - 지원됨

    구성하지 않은 경우의 동작 - 배포에서 요청된 객체와 연결된 오리진의 도메인 이름으로 값을 설정합니다.

  • 헤더 - If-Match

    지원 여부 - 지원됨

    구성하지 않은 경우의 동작 - 배포에서 오리진에 헤더를 전달합니다.

  • 헤더 - If-Modified-Since

    지원 여부 - 지원됨

    구성하지 않은 경우의 동작 - 배포에서 오리진에 헤더를 전달합니다.

  • 헤더 - If-None-Match

    지원 여부 - 지원됨

    구성하지 않은 경우의 동작 - 배포에서 오리진에 헤더를 전달합니다.

  • 헤더 - If-Range

    지원 여부 - 지원됨

    구성하지 않은 경우의 동작 - 배포에서 오리진에 헤더를 전달합니다.

  • 헤더 - If-Unmodified-Since

    지원 여부 - 지원됨

    구성하지 않은 경우의 동작 - 배포에서 오리진에 헤더를 전달합니다.

  • 헤더 - Max-Forwards

    지원 여부 - 지원되지 않음

    구성하지 않은 경우의 동작 - 배포에서 오리진에 헤더를 전달합니다.

  • 헤더 - Origin

    지원 여부 - 지원됨

    구성하지 않은 경우의 동작 - 배포에서 오리진에 헤더를 전달합니다.

  • 헤더 - Pragma

    지원 여부 - 지원되지 않음

    구성하지 않은 경우의 동작 - 배포에서 오리진에 헤더를 전달합니다.

  • 헤더 - Proxy-Authenticate

    지원 여부 - 지원되지 않음

    구성하지 않은 경우의 동작 - 배포에서 헤더를 제거합니다.

  • 헤더 - Proxy-Authorization

    지원 여부 - 지원되지 않음

    구성하지 않은 경우의 동작 - 배포에서 헤더를 제거합니다.

  • 헤더 - Proxy-Connection

    지원 여부 - 지원되지 않음

    구성하지 않은 경우의 동작 - 배포에서 헤더를 제거합니다.

  • 헤더 - Range

    지원 여부 - 기본적으로 지원됨

    구성하지 않은 경우의 동작 - 배포에서 오리진에 헤더를 전달합니다.

  • 헤더 - Referer

    지원 여부 - 지원됨

    구성하지 않은 경우의 동작 - 배포에서 헤더를 제거합니다.

  • 헤더 - Request-Range

    지원 여부 - 지원되지 않음

    구성하지 않은 경우의 동작 - 배포에서 오리진에 헤더를 전달합니다.

  • 헤더 - TE

    지원 여부 - 지원되지 않음

    구성하지 않은 경우의 동작 - 배포에서 헤더를 제거합니다.

  • 헤더 - Trailer

    지원 여부 - 지원되지 않음

    구성하지 않은 경우의 동작 - 배포에서 헤더를 제거합니다.

  • 헤더 - Transfer-Encoding

    지원 여부 - 지원되지 않음

    구성하지 않은 경우의 동작 - 배포에서 오리진에 헤더를 전달합니다.

  • 헤더 - Upgrade

    지원 - 아니요 (연결 제외) WebSocket

    구성되지 않은 경우의 동작 - WebSocket 연결을 설정하지 않은 경우 배포에서 헤더가 제거됩니다.

  • 헤더 - User-Agent

    지원 여부 - 지원되나 권장되지 않음

    구성하지 않은 경우의 동작 - 배포에서 이 헤더 필드의 값을 Amazon CloudFront로 바꿉니다.

  • 헤더 - Via

    지원 여부 - 지원됨

    구성하지 않은 경우의 동작 - 배포에서 오리진에 헤더를 전달합니다.

  • 헤더 - Warning

    지원 여부 - 지원됨

    구성하지 않은 경우의 동작 - 배포에서 오리진에 헤더를 전달합니다.

  • 헤더 - X-Amz-Cf-Id

    지원 여부 - 지원되지 않음

    구성하지 않은 경우의 동작 - 배포에서 요청을 오리진으로 전달하기 전에 최종 사용자 요청에 헤더를 추가합니다. 헤더 값에는 요청을 고유하게 식별하는 암호화된 문자열이 포함됩니다.

  • 헤더 - X-Edge-*

    지원 여부 - 지원되지 않음

    구성하지 않은 경우의 동작 - 배포에서 모든 X-Edge-* 헤더를 제거합니다.

  • 헤더 - X-Forwarded-For

    지원 여부 - 지원됨

    구성하지 않은 경우의 동작 - 배포에서 오리진에 헤더를 전달합니다.

  • 헤더 - X-Forwarded-Proto

    지원 여부 - 지원되지 않음

    구성하지 않은 경우의 동작 - 배포에서 헤더를 제거합니다.

  • 헤더 - X-Real-IP

    지원 여부 - 지원되지 않음

    구성하지 않은 경우의 동작 - 배포에서 헤더를 제거합니다.

HTTP 버전

배포에서는 HTTP/1.1을 사용하여 오리진에 요청을 전달합니다.

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

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

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

요청 또는 URL이 이 최대값을 초과할 경우, 배포에서는 HTTP 상태 코드 413(요청 엔터티가 너무 큼)을 반환한 후 최종 사용자와의 TCP 연결을 종료합니다.

OCSP 스테이플링

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

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

지속적인 연결

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

프로토콜

배포는 Lightsail 콘솔의 Origin 프로토콜 정책 필드 값에 따라 HTTP 또는 HTTPS 요청을 오리진 서버에 전달합니다. Lightsail 콘솔에서는 HTTP만 사용할 수 있으며 HTTPS만 사용할 수 있습니다.

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

중요

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

쿼리 문자열

배포에서 쿼리 문자열 파라미터를 오리진에 전달할지를 구성할 수 있습니다.

오리진 연결 제한 시간 및 시도 횟수

기본적으로 배포는 30초(각 10초씩 3번 시도) 동안 기다린 후 최종 사용자에게 오류 응답을 반환합니다.

오리진 응답 제한 시간

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

  • 배포가 오리진에 요청을 전달한 후 응답을 기다리는 시간(초).

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

배포 동작은 최종 사용자 요청의 HTTP 메서드에 따라 달라집니다.

  • GETHEAD 요청 - 오리진에서 응답 제한 시간 내에 응답하지 않거나 응답이 중지된 경우, 배포에서는 연결을 끊습니다. 지정된 오리진 연결 시도 횟수가 1보다 많으면 배포가 다시 완료 응답을 수신하려고 시도합니다. 배포는 오리진 연결 시도 설정 값에 따라 최대 3회까지 시도합니다. 오리진이 마지막 시도에 응답하지 않는 경우, 배포에서는 동일한 오리진의 콘텐츠에 대해 다른 요청을 받을 때까지 다시 시도하지 않습니다.

  • DELETE, OPTIONS, PATCH, PUTPOST 요청 - 오리진에서 30초 내에 응답하지 않는 경우, 배포에서는 연결을 끊고 오리진에 다시 연결을 시도하지 않습니다. 필요한 경우 클라이언트는 요청을 다시 제출할 수 있습니다.

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

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

User-agent 헤더

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

  • CloudFront-Is-Desktop-Viewer

  • CloudFront-Is-Mobile-Viewer

  • CloudFront-Is-SmartTV-Viewer

  • CloudFront-Is-Tablet-Viewer

User-Agent 헤더의 값에 따라 배포에서는 요청을 오리진에 전달하기 전에 이러한 헤더의 값을 true 또는 false로 설정합니다. 디바이스가 둘 이상의 범주에 해당하는 경우 둘 이상의 값이 true일 수 있습니다. 예를 들어, 일부 태블릿 디바이스의 경우 배포에서 CloudFront-Is-Mobile-ViewerCloudFront-Is-Tablet-Viewer를 모두 true로 설정할 수 있습니다.

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

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

User-Agent = Amazon CloudFront

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

배포에서 오리진의 응답을 처리하는 방법

이 섹션에는 배포가 오리진의 응답을 처리하는 방법에 대한 정보가 포함되어 있습니다.

목차

100-Continue 응답

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

캐싱

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

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

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

취소된 요청

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

콘텐츠 협상

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

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

쿠키

캐시 동작에 대한 쿠키를 사용하는 경우 오리진에서 객체를 통해 쿠키를 반환하면 배포에서는 객체와 쿠키를 모두 캐싱합니다. 이렇게 하면 객체의 캐시 가능성이 줄어든다는 점에 유의하세요.

TCP 연결 끊김

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

  • Content-Length 헤더 - 배포가 오리진에서 객체를 가져올 때 최종 사용자에게 객체를 반환합니다. 그러나 Content-Length 헤더의 값이 객체의 크기와 일치하지 않으면 배포가 객체를 캐싱하지 않습니다.

  • Transfer-Encoding: 청크 분할 - 배포가 오리진에서 객체를 가져올 때 최종 사용자에게 객체를 반환합니다. 그러나 청크 응답이 완전하지 않을 경우 배포가 객체를 캐싱하지 않습니다.

  • Content-Length 헤더 없음 - 배포가 최종 사용자에게 객체를 반환하고 캐싱하지만, 객체가 불완전할 수 있습니다. Content-Length 헤더가 없으면 TCP 연결이 실수로 또는 고의로 끊어졌는지 여부를 배포가 확인할 수 없습니다.

배포가 부분적인 객체를 캐싱하는 것을 방지하기 위해 Content-Length 헤더를 추가하도록 HTTP 서버를 구성하는 것이 좋습니다.

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

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

  • Set-Cookie - 쿠키를 전달하도록 배포를 구성하면 Set-Cookie 헤더 필드가 클라이언트에 전달됩니다.

  • Trailer

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

  • Upgrade

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

    • 디바이스별 헤더 중 하나를 오리진(CloudFront-Is-Desktop-Viewer, CloudFront-Is-Mobile-Viewer, CloudFront-Is-SmartTV-Viewer, CloudFront-Is-Tablet-Viewer)에 전달하도록 배포를 구성하고 Vary:User-Agent를 배포에 반환하도록 오리진을 구성하는 경우, 배포에서는 최종 사용자에게 Vary:User-Agent를 반환합니다.

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

    • 헤더 허용 목록을 오리진에 전달하도록 배포를 구성하고 헤더 내 배포에 헤더 이름을 반환하도록 오리진을 구성한 경우 (예:Vary:Accept-Charset,Accept-Language) 배포는 해당 값이 포함된 Vary 헤더를 뷰어에게 반환합니다. Vary

    • 배포가 Vary 헤더의 * 값을 처리하는 방법에 대한 자세한 내용은 콘텐츠 협상을 참조하세요.

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

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

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

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

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

최대 파일 크기

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

오리진 사용 불가

오리진 서버를 사용할 수 없고 배포에서 엣지 캐시에 있지만 만료된(Cache-Control max-age 명령에 지정된 기간이 지났다는 이유 등으로) 객체에 대한 요청을 받은 경우, 배포에서는 만료된 버전의 객체를 제공하거나 사용자 지정 오류 페이지를 표시합니다.

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

리디렉션

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

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

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

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

전송 인코딩

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

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

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