CloudFront에서 객체에 대한 부분적인 요청을 처리하는 방법(범위 GET) - Amazon CloudFront

CloudFront에서 객체에 대한 부분적인 요청을 처리하는 방법(범위 GET)

대용량 객체의 경우 뷰어(웹 브라우저 또는 기타 클라이언트)는 여러 GET 요청을 하고 Range 요청 헤더를 사용하여 객체를 더 작은 부분으로 다운로드할 수 있습니다. Range GET 요청이라고도 하는 이러한 바이트 범위의 요청을 통해 부분 다운로드의 효율을 높이고 부분적으로 실패한 전송을 쉽게 복구할 수 있습니다.

CloudFront에서 Range GET 요청을 받은 경우, 요청을 받은 엣지 로케이션에서 캐시를 확인합니다. 엣지 로케이션의 캐시에 이미 전체 객체 또는 객체의 요청된 부분이 포함되어 있는 경우, CloudFront에서는 캐시로부터 요청된 범위를 즉시 제공합니다.

캐시에 요청된 범위가 포함되어 있지 않은 경우, CloudFront에서는 요청을 원본에 전달합니다. (성능 최적화를 위해 CloudFront에서는 클라이언트가 Range GET에서 요청한 것보다 더 큰 범위를 요청할 수 있습니다.) 오리진에서 Range GET 요청을 지원하는지 여부에 따라 다음 상황이 달라집니다.

  • 오리진에서 Range GET 요청을 지원하는 경우 - 요청된 범위를 반환합니다. CloudFront에서는 요청된 범위를 제공하고 이를 이후 요청을 위해 캐싱합니다. (Amazon S3는 많은 HTTP 서버와 마찬가지로 Range GET 요청을 지원합니다.)

  • 오리진에서 Range GET 요청을 지원하지 않는 경우 - 전체 객체를 반환합니다. CloudFront에서는 전체 객체를 전송하고 향후 요청을 위해 캐싱하여 현재 요청을 처리합니다. CloudFront에서 엣지 캐시에 전체 객체를 캐싱한 후에는 요청된 범위를 제공하여 새 Range GET 요청에 응답합니다.

두 경우 모두 오리진에서 첫 번째 바이트가 도착하면 CloudFront에서는 요청된 범위 또는 객체를 최종 사용자에게 제공하기 시작합니다.

참고

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

CloudFront에서는 일반적으로 Range 헤더에 대한 RFC 사양을 준수합니다. 그러나 Range 헤더가 다음 요구 사항을 준수하지 않는 경우, CloudFront에서는 지정된 범위와 함께 상태 코드 200을 반환하는 대신 전체 객체와 함께 HTTP 상태 코드 206을 반환합니다.

  • 범위는 오름차순으로 나열되어야 합니다. 예를 들어, 100-200,300-400은 유효하지만 300-400,100-200은 유효하지 않습니다.

  • 범위는 중복되어서는 안 됩니다. 예를 들어, 100-200,150-250은 유효하지 않습니다.

  • 모든 범위 사양은 유효해야 합니다. 예를 들어, 범위의 일부로 음수 값을 지정할 수 없습니다.

Range 요청 헤더에 대한 자세한 내용은 RFC 7233의 요청 범위 또는 MDN 웹 문서의 범위를 참조하십시오.

범위 요청을 사용하여 대형 객체 캐시

캐싱이 활성화되면 CloudFront는 50GB보다 큰 객체를 검색하거나 캐시하지 않습니다. 원본이 객체가 이보다 크다는 것을 나타내는 경우(Content-Length 응답 헤더에서), CloudFront는 원본에 대한 연결을 닫고 뷰어에게 오류를 반환합니다. (캐싱을 비활성화하면 CloudFront는 원본에서 이보다 큰 객체를 검색하여 뷰어에 전달할 수 있습니다. 그러나 CloudFront는 객체를 캐시하지 않습니다.)

그러나 범위 요청의 경우 CloudFront를 사용하여 최대 캐시 가능 파일 크기보다 큰 객체를 캐시할 수 있습니다.

  1. 예를 들어 100GB 객체가 있는 오리진을 가정해 보겠습니다. 캐싱이 활성화되면 CloudFront는 이렇게 큰 객체를 검색하거나 캐시하지 않습니다. 그러나 뷰어는 이 객체를 50GB보다 작은 각 부분으로 검색하기 위해 여러 범위 요청을 보낼 수 있습니다.

  2. 뷰어는 첫 번째 부분을 검색하기 위해 헤더 Range: bytes=0-21474836480가 포함된 요청, 다음 부분을 검색하기 위해 헤더 Range: bytes=21474836481-42949672960가 포함된 다른 요청을 전송하는 등의 방식으로 20GB 부분의 객체를 요청할 수 있습니다.

  3. 뷰어가 모든 부분을 받으면 이를 결합하여 원래 100GB 객체를 구성할 수 있습니다.

  4. 이 경우 CloudFront는 객체의 20GB 부분을 캐시하고 캐시에서 동일한 부분에 대한 후속 요청에 응답할 수 있습니다.