쿼리 문자열 파라미터 기반의 콘텐츠 캐싱 - Amazon CloudFront

쿼리 문자열 파라미터 기반의 콘텐츠 캐싱

일부 웹 애플리케이션은 쿼리 문자열을 사용하여 오리진에 정보를 전송합니다. 쿼리 문자열은 ? 문자 다음에 오는 웹 요청의 일부이며 이 문자열은 & 문자로 구분된 하나 이상의 파라미터를 포함할 수 있습니다. 다음 예의 쿼리 문자열에는 color=redsize=large의 두 가지 파라미터가 포함되어 있습니다.

https://d111111abcdef8.cloudfront.net/images/image.jpg?color=red&size=large

배포의 경우 CloudFront에서 쿼리 문자열을 오리진에 전달하도록 선택할 수 있으며, 콘텐츠를 모든 파라미터를 기준으로 캐싱할지 아니면 일부 파라미터를 기준으로 캐싱할지를 선택합니다. 이 기능이 유용한 이유를 알아보려면 다음 예제를 살펴보십시오.

웹사이트가 5개 언어로 제공되는 경우를 가정하겠습니다. 5개 웹사이트 버전의 디렉터리 구조와 파일 이름은 동일합니다. 사용자가 웹사이트를 볼 때 CloudFront로 전달되는 요청에는 사용자가 선택한 언어를 기준으로 하는 언어 쿼리 문자열 파라미터가 포함됩니다. 쿼리 문자열을 오리진으로 전달하고 언어 파라미터를 기준으로 캐싱하도록 CloudFront를 구성할 수 있습니다. 웹 서버에서 선택한 언어에 해당하는 특정 페이지의 버전을 반환하도록 구성할 경우 CloudFront는 언어 쿼리 문자열 파라미터 값을 기준으로 각 언어 버전을 별도로 캐싱합니다.

이 예에서 웹 사이트의 메인 페이지가 main.html인 경우 다음과 같은 5개 요청이 발생하면 CloudFront에서 언어 쿼리 문자열 파라미터의 각 값에 대해 한 번씩 main.html을 다섯 번 캐싱합니다.

  • https://d111111abcdef8.cloudfront.net/main.html?language=de

  • https://d111111abcdef8.cloudfront.net/main.html?language=en

  • https://d111111abcdef8.cloudfront.net/main.html?language=es

  • https://d111111abcdef8.cloudfront.net/main.html?language=fr

  • https://d111111abcdef8.cloudfront.net/main.html?language=jp

다음을 참조하십시오.

  • 일부 HTTP 서버는 쿼리 문자열 파라미터를 처리하지 않으므로 파라미터 값을 기준으로 객체의 다른 버전을 반환하지 않습니다. 이러한 오리진의 경우 CloudFront에서 쿼리 문자열 파라미터를 오리진으로 전달하도록 구성할 경우 CloudFront는 오리진에서 모든 파라미터 값에 대해 CloudFront에 동일한 객체 버전을 반환할 경우에도 파라미터 값을 기준으로 캐싱합니다.

  • 쿼리 문자열 파라미터가 위의 예제에서 설명한 대로 작동하려면 쿼리 문자열 파라미터 간에 & 문자를 구분 기호로 사용해야 합니다. 다른 구분 기호를 사용하는 경우에는 캐싱 기준으로 CloudFront에서 지정하는 파라미터 및 쿼리 문자열에서 파라미터가 나타나는 순서에 따라 결과가 달라질 수 있습니다.

    다음 예는 다른 구분 기호를 사용하고, color 파라미터에 따라서만 캐싱하도록 CloudFront를 구성할 경우의 결과를 보여줍니다.

    • 다음 요청에서 CloudFront는 color 파라미터 값을 기준으로 콘텐츠를 캐싱하지만 CloudFront는 이 값을 red;size=large로 해석합니다.

      https://d111111abcdef8.cloudfront.net/images/image.jpg?color=red;size=large

    • 다음 요청에서 CloudFront는 콘텐츠를 캐싱하지만 쿼리 문자열 파라미터를 기준으로 캐싱하지 않습니다. 그 이유는 CloudFront에서 color 파라미터를 기준으로 캐싱하도록 구성했지만 CloudFront는 다음 문자열에 large;color=red 값을 가진 size 파라미터만 포함된 것으로 해석하기 때문입니다.

      https://d111111abcdef8.cloudfront.net/images/image.jpg?size=large;color=red

CloudFront에서 다음 중 하나를 수행하도록 구성할 수 있습니다.

  • 쿼리 문자열을 오리진에 전혀 전달하지 않음. 쿼리 문자열을 전달하지 않을 경우 CloudFront는 쿼리 문자열 파라미터를 기준으로 캐싱하지 않습니다.

  • 쿼리 문자열을 오리진으로 전달하며 쿼리 문자열의 모든 파라미터를 기준으로 캐싱함

  • 쿼리 문자열을 오리진으로 전달하며 쿼리 문자열 중 지정된 파라미터를 기준으로 캐싱함

자세한 내용은 캐싱 최적화 단원을 참조하십시오.

쿼리 문자열 전달 및 캐싱에 대한 콘솔 및 API 설정

CloudFront 콘솔에서 쿼리 문자열 전달 및 캐싱을 구성하려면 배포 설정 참조에서 다음 설정을 참조하십시오.

CloudFront API를 사용하여 쿼리 문자열 전달 및 캐싱을 구성하려면 Amazon CloudFront API 참조의 CachePolicyOriginRequestPolicy를 참조하세요.

캐싱 최적화

쿼리 문자열 파라미터를 기반으로 캐싱하도록 CloudFront를 구성하는 경우 다음 단계를 수행하여 CloudFront에서 오리진에 전달되는 요청 수를 줄일 수 있습니다. CloudFront 엣지 로케이션에서 객체를 제공하면 사용자에게 보다 엣지 로케이션에서 객체가 제공되므로 오리진 서버의 부하를 줄이고 지연 시간을 단축할 수 있습니다.

원본이 다른 버전의 객체를 반환하는 파라미터만 기반으로 캐시

웹 애플리케이션에서 CloudFront로 각 쿼리 문자열 파라미터를 전달할 때마다 CloudFront는 모든 파라미터 값에 대해 오리진에 요청을 전달하며 모든 파라미터 값에 대해 별도의 객체 버전을 캐싱합니다. 이는 오리진에서 파라미터 값과 상관없이 항상 같은 객체를 반환하는 경우라도 그렇습니다. 복수 파라미터의 경우 요청 수와 객체 수를 곱합니다.

오리진에서 다른 버전을 반환하는 쿼리 문자열 파라미터만 기준으로 캐싱하도록 CloudFront를 구성하고 각 파라미터를 기준으로 캐싱하는 이점을 주의 깊게 고려하는 것이 좋습니다. 예를 들어, 소매 웹사이트가 있다고 가정해봅시다. 6가지 색상의 자켓 사진이 있고 이 자켓은 10가지 사이즈로 제공됩니다. 가지고 있는 자켓 사진은 다른 색상을 보여주지만 다른 사이즈는 보여주지 않습니다. 캐싱을 최적화하려면 CloudFront에서 크기 파라미터가 아닌 색상 파라미터만 기준으로 캐싱하도록 구성해야 합니다. 이렇게 하면 CloudFront에서 캐시로부터 요청을 제공할 수 있는 가능성이 높아지고, 그에 따라 성능이 향상되며 오리진에 걸리는 부하가 줄어듭니다.

파라미터를 항상 동일한 순서로 나열

쿼리 문자열에서 파라미터의 순서는 중요합니다. 다음 예에서 쿼리 문자열은 파라미터 순서가 다른 것을 제외하고 동일합니다. 이 경우 CloudFront는 image.jpg에 대한 별도의 두 가지 요청을 오리진에 전달하고 객체의 두 가지 별도 버전을 캐싱합니다.

  • https://d111111abcdef8.cloudfront.net/images/image.jpg?color=red&size=large

  • https://d111111abcdef8.cloudfront.net/images/image.jpg?size=large&color=red

사전순과 같이 파라미터 이름을 항상 동일한 순서로 나열하는 것이 좋습니다.

파라미터 이름 및 값에 대해 항상 동일한 대소문자 사용

CloudFront는 쿼리 문자열 파라미터를 기준으로 캐싱할 때 파라미터 이름과 값의 대소문자를 고려합니다. 다음 예에서 쿼리 문자열은 파라미터 이름과 값의 대소문자가 다른 것을 제외하고 동일합니다. 이 경우 CloudFront는 image.jpg에 대한 별도의 네 가지 요청을 오리진에 전달하고 객체의 네 가지 별도 버전을 캐싱합니다.

  • https://d111111abcdef8.cloudfront.net/images/image.jpg?color=red

  • https://d111111abcdef8.cloudfront.net/images/image.jpg?color=Red

  • https://d111111abcdef8.cloudfront.net/images/image.jpg?Color=red

  • https://d111111abcdef8.cloudfront.net/images/image.jpg?Color=Red

파라미터 이름과 값을 모두 소문자로 하는 경우와 같이 대소문자를 일관적으로 사용하는 것이 좋습니다.

서명된 URL과 충돌하는 파라미터 이름은 사용하지 않음

서명된 URL을 사용하여 콘텐츠에 대한 액세스를 제한하는 경우(신뢰할 수 있는 서명자를 배포에 추가한 경우), CloudFront에서는 나머지 URL을 오리진에 전달하기 전에 다음 쿼리 문자열 파라미터를 제거합니다.

  • Expires

  • Key-Pair-Id

  • Policy

  • Signature

서명된 URL을 사용하면서 CloudFront에서 쿼리 문자열을 오리진에 전달하도록 구성하려는 경우 자체 쿼리 문자열 파라미터를 Expires, Key-Pair-Id, Policy 또는 Signature라는 이름으로 지정할 수 없습니다.

쿼리 문자열 파라미터 및 CloudFront 표준 로그(액세스 로그)

로깅을 활성화한 경우 CloudFront는 쿼리 문자열 파라미터를 포함해 전체 URL을 로깅합니다. 오리진에 쿼리 문자열을 전달하도록 CloudFront를 구성했는지와 관계없이 로깅합니다. CloudFront 로깅에 대한 자세한 내용은 표준 로그(액세스 로그) 구성 및 사용 단원을 참조하십시오.