캐시 키 이해 - Amazon CloudFront

캐시 키 이해

캐시 키는 CloudFront 엣지 로케이션에 대한 최종 사용자 요청으로 캐시 적중이 발생하는지 여부를 확인합니다. 캐시 키는 캐시에 있는 객체의 고유 식별자입니다. 각 캐시 객체에는 고유한 캐시 키가 있습니다.

캐시 적중은 최종 사용자 요청이 이전 요청과 동일한 캐시 키를 생성하고 해당 캐시 키의 객체가 엣지 로케이션 캐시에 있고 유효할 때 발생합니다. 캐시 적중이 있는 경우, 요청된 객체가 CloudFront 엣지 로케이션에서 최종 사용자에게 제공되므로 다음과 같은 이점이 있습니다.

  • 오리진 서버의 부하 감소

  • 최종 사용자에 대한 지연 시간 감소

캐시 적중률이 높으면(최종 사용자 요청 비율이 높을수록 캐시 적중이 발생함) 웹 사이트 또는 애플리케이션 성능이 향상될 수 있습니다. 캐시 적중률을 향상시키는 한 가지 방법은 캐시 키에 필요한 최소 값만 포함시키는 것입니다. 자세한 내용은 다음 단원을 참조하세요.

캐시 정책을 사용하여 캐시 키의 값(URL 쿼리 문자열, HTTP 헤더 및 쿠키)을 수정할 수 있습니다. Lambda@Edge 함수를 사용하여 캐시 키를 수정할 수도 있습니다. 캐시 키를 수정하기 전에 애플리케이션의 설계 방식과 최종 사용자 요청의 특성에 따라 다양한 응답을 제공할 수 있는 시기 및 방법을 이해하는 것이 중요합니다. 최종 사용자 요청 값으로 오리진에서 반환하는 응답을 확인하는 경우 해당 값을 캐시 키에 포함해야 합니다. 그러나 오리진이 반환하는 응답에 영향을 미치지 않는 값을 캐시 키에 포함하면 중복 객체를 캐시하게 될 수 있습니다.

기본 캐시 키

기본적으로 CloudFront 배포의 캐시 키에는 다음 정보가 포함됩니다.

  • CloudFront 배포의 도메인 이름(예: d111111abcdef8.cloudfront.net)

  • 요청된 객체의 URL 경로(예: /content/stories/example-story.html)

참고

OPTIONS 메서드는 OPTIONS 요청에 대한 캐시 키에 포함됩니다. 이는 OPTIONS 요청에 대한 응답이 GETHEAD 요청에 대한 응답과 별도로 캐시됨을 의미합니다.

최종 사용자 요청의 다른 값은 기본적으로 캐시 키에 포함되지 않습니다. 웹 브라우저의 다음 HTTP 요청을 검토합니다.

GET /content/stories/example-story.html?ref=0123abc&split-pages=false HTTP/1.1 Host: d111111abcdef8.cloudfront.net User-Agent: Mozilla/5.0 Gecko/20100101 Firefox/68.0 Accept: text/html,*/* Accept-Language: en-US,en Cookie: session_id=01234abcd Referer: https://news.example.com/

CloudFront 엣지 로케이션에 이 최종 사용자 요청이 수신되면 CloudFront는 캐시 키를 사용하여 캐시 적중 여부를 확인합니다. 기본적으로 요청의 다음 구성 요소만 캐시 키 /content/stories/example-story.htmld111111abcdef8.cloudfront.net에 포함됩니다. 요청된 객체가 캐시에 없으면(캐시 누락) CloudFront는 오리진에 요청을 보내 객체를 가져옵니다. 객체를 가져온 후 CloudFront는 최종 사용자에게 반환하고 엣지 로케이션의 캐시에 저장합니다.

CloudFront가 캐시 키에 의해 확인된 동일한 객체에 대한 다른 요청을 수신하면 CloudFront는 오리진에 요청을 보내지 않고 캐싱된 객체를 최종 사용자에게 즉시 제공합니다. 예를 들어, 이전 요청 이후에 들어오는 다음 HTTP 요청을 검토합니다.

GET /content/stories/example-story.html?ref=xyz987&split-pages=true HTTP/1.1 Host: d111111abcdef8.cloudfront.net User-Agent: Mozilla/5.0 AppleWebKit/537.36 Chrome/83.0.4103.116 Accept: text/html,*/* Accept-Language: en-US,en Cookie: session_id=wxyz9876 Referer: https://rss.news.example.net/

이 요청은 이전 요청과 동일한 객체에 대한 요청이지만 이전 요청과는 다릅니다. URL 쿼리 문자열, User-AgentReferer 헤더 및 session_id 쿠키가 다릅니다. 그러나 기본적으로 이러한 값은 캐시 키의 일부가 아니므로 이 두 번째 요청으로 인해 캐시 적중이 발생합니다.

캐시 키 사용자 지정

경우에 따라 캐시 적중이 줄어들더라도 캐시 키에 더 많은 정보를 포함하고 싶을 수도 있습니다. 캐시 정책을 사용하여 캐시 키에 포함할 항목을 지정합니다.

예를 들어 오리진 서버에서 최종 사용자 요청의 Accept-Language HTTP 헤더를 사용하여 최종 사용자 언어에 따라 다른 콘텐츠를 반환하는 경우 이 헤더를 캐시 키에 포함할 수 있습니다. 이렇게 하면 CloudFront에서는 이 헤더를 사용하여 캐시 적중을 확인하고 오리진 요청(캐시 누락이 있을 때 CloudFront가 오리진으로 보내는 요청)에 헤더를 포함합니다.

캐시 키에 추가 값을 포함하면 최종 사용자 요청에서 발생할 수 있는 변형 때문에 CloudFront에서 중복 객체를 캐시할 수 있습니다. 예를 들어 최종 사용자는 Accept-Language 헤더에 대해 다음 값 중 하나를 보낼 수 있습니다.

  • en-US,en

  • en,en-US

  • en-US, en

  • en-US

이 모든 다양한 값은 최종 사용자 언어가 영어라는 것을 나타내지만 변형으로 인해 CloudFront에서 동일한 객체를 여러 번 캐시할 수 있습니다. 이렇게 하면 캐시 적중을 줄이고 오리진 요청 수를 늘릴 수 있습니다. 캐시 키에 Accept-Language 헤더를 포함하지 않고 다른 언어로 된 콘텐츠에 서로 다른 URL을 사용하도록 웹 사이트 또는 애플리케이션을 구성하여 이러한 중복을 피할 수 있습니다(예: /en-US/content/stories/example-story.html).

캐시 키에 포함하려는 특정 값의 경우, 최종 사용자 요청에 나타날 수 있는 해당 값의 변형 수를 이해하는지 확인해야 합니다. 캐시 키에 특정 요청 값을 포함하는 것은 큰 의미가 없습니다. 예를 들어 User-Agent 헤더에는 수천 개의 고유한 변형이 있을 수 있으므로 일반적으로 캐시 키에 포함하기에는 적합하지 않습니다. 사용자별 또는 세션별 값이 있으며 수천(또는 수백만) 개의 요청에 걸쳐 고유한 쿠키도 캐시 키에 포함하기에는 적합하지 않습니다. 캐시 키에 이러한 값을 포함하면 고유한 각 변형으로 인해 캐시에 객체의 다른 복사본이 생성됩니다. 이 객체 복사본이 고유하지 않거나 객체 수가 너무 많아서 객체마다 캐시 적중 횟수가 적으면 다른 방법을 고려해 보는 것이 좋습니다. 변수가 많은 값을 캐시 키에서 제외하거나 객체를 캐시에 사용할 수 없도록 표시할 수 있습니다.

캐시 키를 사용자 지정할 때는 주의하세요. 경우에 따라 중복 객체를 캐시하고 캐시 적중률을 낮추며 오리진 요청 횟수를 늘리는 등의 의도하지 않은 결과가 발생할 수 있습니다. 오리진 웹 사이트 또는 애플리케이션에서 분석, 원격 측정 또는 기타 용도에 대한 최종 사용자 요청의 특정 값을 수신해야 하지만 이 값이 오리진에서 반환하는 객체를 변경하지 않는 경우, 오리진 요청 정책을 사용하여 이 값을 오리진 요청에 포함하지만 캐시 키에는 포함하지 않습니다.