콘텐츠가 캐시에 유지되는 기간(만료) 관리 - Amazon CloudFront

콘텐츠가 캐시에 유지되는 기간(만료) 관리

CloudFront에서 다른 요청을 오리진에 전달하기 전에 파일을 CloudFront 캐시에 보관하는 시간을 제어할 수 있습니다. 이 기간을 단축함으로써 동적 콘텐츠를 제공할 수 있습니다. 이 기간이 늘어나면 파일이 엣지 캐시에서 바로 제공될 가능성이 높으므로 사용자에게 제공되는 성능이 향상됩니다. 보관 기간이 늘어나면 오리진에 걸리는 부하 역시 줄어듭니다.

일반적으로 CloudFront는 지정한 캐시 기간이 지날 때까지, 즉 파일이 만료될 때까지 엣지 로케이션에서 파일을 제공합니다. 파일이 만료된 후 다음에 엣지 로케이션에서 이 파일에 대한 요청을 받으면, CloudFront에서는 이 요청을 오리진으로 전달하여 캐시에 최신 버전의 파일이 포함되어 있는지 확인합니다. 오리진의 응답은 파일 변경 여부에 따라 달라집니다.

  • CloudFront 캐시에 이미 최신 버전이 있는 경우 오리진에서는 상태 코드 304 Not Modified를 반환합니다.

  • CloudFront 캐시에 최신 버전이 없는 경우 오리진에서는 상태 코드 200 OK와 최신 버전의 파일을 반환합니다.

엣지 로케이션의 파일이 자주 요청되지 않는 경우 CloudFront에서는 만료 날짜 전에 이 파일을 제거하여 보다 최근에 요청된 파일을 위한 공간을 마련할 수 있습니다.

기본적으로 각 파일은 24시간 후에 자동으로 만료되지만, 다음 두 가지 방식으로 기본 동작을 변경할 수 있습니다.

  • 동일한 경로 패턴과 일치하는 모든 파일에 대해 캐시 기간을 변경하려면 캐시 동작에 대한 Minimum TTL(최소 TTL), Maximum TTL(최대 TTL)Default TTL(기본 TTL)의 CloudFront 설정을 변경할 수 있습니다. 개별 설정에 대한 자세한 내용은 배포 설정 참조최소 TTL, 최대 TTL기본 TTL을 참조하십시오.

  • 개별 파일의 캐시 기간을 변경하려면 max-age 또는 s-maxage 지시문이 있는 Cache-Control 헤더 또는 Expires 헤더를 파일에 추가하도록 오리진을 구성할 수 있습니다. 자세한 내용은 헤더를 사용하여 개별 객체의 캐시 기간 제어 단원을 참조하십시오.

최소 TTL(Minimum TTL), 기본 TTL(Default TTL)최대 TTL(Maximum TTL)max-ages-maxage 명령 및 Expires 헤더 필드와 상호 작용하는 방식에 대한 자세한 내용은 CloudFront에서 객체를 캐싱하는 시간 지정 섹션을 참조하세요.

또한 CloudFront 에서 다른 요청을 오리진에 전달하여 요청된 객체의 가져오기를 다시 시도하기 전에 오류(예: 404 Not Found)가 CloudFront 캐시에 보관되는 시간 역시 제어할 수 있습니다. 자세한 내용은 CloudFront에서 오리진의 HTTP 4xx 및 5xx 상태 코드를 처리하는 방법 단원을 참조하십시오.

헤더를 사용하여 개별 객체의 캐시 기간 제어

Cache-ControlExpires 헤더를 사용하여 객체가 캐시에 머무르는 시간을 제어할 수 있습니다. 최소 TTL, 기본 TTL최대 TTL에 대한 설정은 캐시 기간에도 영향을 주지만 캐시 기간에 영향을 미치는 방식에 대한 개요는 다음과 같습니다.

  • Cache-Control max-age 명령을 사용하면 CloudFront가 오리진 서버에서 객체를 다시 가져오기 전에 이 객체를 캐시에 보관하려는 시간(초)을 지정할 수 있습니다. CloudFront가 지원하는 최소 만료 시간은 0초입니다. 최대값은 100년입니다. 다음 형식으로 값을 지정합니다.

    Cache-Control: max-age=

    예를 들어 다음 명령은 CloudFront에 3,600초(1시간) 동안 관련 객체를 캐시에 보관하도록 지시합니다.

    Cache-Control: max-age=3600

    브라우저 캐시에 보관하는 기간과는 다른 기간 동안 객체를 CloudFront 엣지 캐시에 보관하려는 경우, Cache-Control max-ageCache-Control s-maxage 명령을 함께 사용할 수 있습니다. 자세한 내용은 CloudFront에서 객체를 캐싱하는 시간 지정 단원을 참조하세요.

  • Expires 헤더 필드를 사용하면 다음과 같이 RFC 2616, Hypertext Transfer Protocol -- HTTP/1.1 Section 3.3.1, Full Date에 지정된 형식을 사용하여 만료 날짜와 시간을 지정할 수 있습니다.

    Sat, 27 Jun 2015 23:59:59 GMT

Expires 헤더 필드 대신 Cache-Control max-age 명령을 사용하여 객체 캐싱을 제어하는 것이 좋습니다. Cache-Control max-ageExpires 모두에 대해 값을 지정한 경우, CloudFront에서는 Cache-Control max-age의 값만 사용합니다.

자세한 내용은 CloudFront에서 객체를 캐싱하는 시간 지정 단원을 참조하세요.

최종 사용자의 Cache-Control 요청에 HTTP Pragma 또는 GET 헤더 필드를 사용하여 CloudFront가 객체에 대한 오리진 서버로 돌아가도록 할 수는 없습니다. CloudFront에서는 최종 사용자 요청의 헤더 필드를 무시합니다.

Cache-ControlExpires 헤더 필드에 대한 자세한 내용은 RFC 2616, Hypertext Transfer Protocol -- HTTP/1.1의 다음 단원을 참조하십시오.

오래된(만료된) 콘텐츠 제공

CloudFront는 Stale-While-RevalidateStale-If-Error 캐시 제어 지시문을 지원합니다.

  • stale-while-revalidate 지시문을 통해 CloudFront는 오리진에서 새 버전을 비동기적으로 가져오는 동안 캐시에서 오래된 콘텐츠를 제공할 수 있습니다. 따라서 사용자가 백그라운드 가져오기를 기다릴 필요 없이 CloudFront의 엣지 로케이션에서 즉시 응답을 받으며 향후 요청을 위해 백그라운드에서 새로운 콘텐츠가 로드되므로 지연 시간이 단축됩니다.

    다음 예제에서 CloudFront는 한 시간(max-age=3600) 동안 응답을 캐시합니다. 이 기간 이후에 요청이 이루어지면 CloudFront는 오래된 콘텐츠를 제공하는 동시에 캐시된 콘텐츠를 재검증하고 새로 고치라는 요청을 오리진에 전송합니다. 오래된 콘텐츠는 콘텐츠가 재검증되는 동안 최대 10분(stale-while-revalidate=600) 동안 제공됩니다.

    Cache-Control: max-age=3600, stale-while-revalidate=600
    참고

    CloudFront는 stale-while-revalidate 지시문의 값 또는 CloudFront 최대 TTL의 값 중 더 적은 값까지 오래된 콘텐츠를 제공합니다.

  • stale-if-error 지시문을 통해 CloudFront는 오리진에 연결할 수 없거나 500에서 600 사이의 오류 코드를 반환하는 경우 캐시에서 오래된 콘텐츠를 제공할 수 있습니다. 이를 통해 뷰어가 오리진 가동 중단 중에도 콘텐츠에 액세스할 수 있습니다.

    다음 예제에서 CloudFront는 한 시간(max-age=3600) 동안 응답을 캐시합니다. 이 기간 이후에 오리진이 다운되거나 오류가 반환되는 경우 CloudFront는 최대 24시간(stale-if-error=86400) 동안 오래된 콘텐츠를 계속 제공합니다.

    Cache-Control: max-age=3600, stale-if-error=86400
    참고

    CloudFront는 stale-if-error 지시문의 값 또는 CloudFront 최대 TTL의 값 중 더 적은 값까지 오래된 콘텐츠를 제공합니다.

    stale-if-error사용자 지정 오류 응답이 모두 구성된 경우 CloudFront는 지정된 stale-if-error 기간 내에 오류가 발생하면 먼저 오래된 콘텐츠를 제공하려고 시도합니다. 오래된 콘텐츠를 사용할 수 없거나 콘텐츠가 stale-if-error 지속 시간을 초과한 경우 CloudFront는 해당 오류 상태 코드에 대해 구성된 사용자 지정 오류 응답을 제공합니다.

둘 다 함께 사용

stale-while-revalidatestale-if-error는 지연 시간을 줄이고 오리진이 응답하거나 복구하기 위한 버퍼를 추가하도록 함께 사용할 수 있는 독립적인 캐시 제어 지시문입니다.

다음 예제에서 CloudFront는 한 시간(max-age=3600) 동안 응답을 캐시합니다. 이 기간 이후에 요청이 이루어지면 CloudFront는 콘텐츠가 재검증되는 동안 최대 10분(stale-while-revalidate=600)간 오래된 콘텐츠를 제공합니다. CloudFront가 콘텐츠 재검증을 시도하는 동안 오리진 서버에서 오류가 반환되는 경우 CloudFront는 최대 24시간(stale-if-error=86400) 동안 오래된 콘텐츠를 계속 제공합니다.

Cache-Control: max-age=3600, stale-while-revalidate=600, stale-if-error=86400
작은 정보

캐싱은 성능과 최신 상태 사이의 균형을 유지하는 것입니다. stale-while-revalidatestale-if-error와 같은 지시문을 사용하면 성능과 사용자 경험을 향상할 수 있지만 원하는 콘텐츠의 최신 상태에 맞게 구성을 조정해야 합니다. 오래된 콘텐츠 지시문은 콘텐츠를 새로 고쳐야 하지만 최신 버전이 필요하지 않은 사용 사례에 가장 적합합니다. 또한 콘텐츠가 전혀 또는 거의 변경되지 않는 경우 stale-while-revalidate로 인해 불필요한 네트워크 요청이 추가될 수 있습니다. 대신 캐시 기간을 길게 설정하는 것이 좋습니다.

CloudFront에서 객체를 캐싱하는 시간 지정

CloudFront에서 오리진에 다른 요청을 보내기 전에 객체를 캐시에 보관하는 시간을 제어하려면 다음을 수행할 수 있습니다.

  • CloudFront 배포의 캐시 동작에서 최소값, 최대값 및 기본 TTL 값을 설정합니다. 캐시 동작에 연결된 캐시 정책(권장) 또는 레거시 캐시 설정에서 이러한 값을 설정할 수 있습니다.

  • 오리진의 응답에 Cache-Control 또는 Expires 헤더를 포함합니다. 또한 이러한 헤더는 CloudFront로 다른 요청을 보내기 전에 브라우저에서 브라우저 캐시에 객체를 유지하는 기간을 결정하는 데 도움이 됩니다.

다음 표에는 오리진에서 전송된 Cache-ControlExpires 헤더와 캐시 동작의 TTL 설정이 캐싱에 미치는 영향이 설명되어 있습니다.

오리진 헤더 최소 TTL = 0 최소 TTL > 0

오리진에서 Cache-Control: max-age 지시문을 객체에 추가

CloudFront 캐싱

CloudFront는 Cache-Control: max-age 지시문의 값 또는 CloudFront 최대 TTL의 값 중 더 작은 값 동안 객체를 캐싱합니다.

브라우저 캐싱

브라우저는 Cache-Control: max-age 지시문의 값 동안 객체를 캐싱합니다.

CloudFront 캐싱

CloudFront 캐싱은 CloudFront 최소 TTL과 최대 TTL 및 Cache-Control max-age 지시문의 값에 따라 달라집니다.

  • 최소 TTL < max-age < 최대 TTL인 경우 CloudFront는 Cache-Control: max-age 지시문의 값 동안 객체를 캐싱합니다.

  • max-age < 최소 TTL인 경우 CloudFront는 CloudFront 최소 TTL의 값 동안 객체를 캐싱합니다.

  • max-age > 최대 TTL인 경우 CloudFront는 CloudFront 최대 TTL의 값 동안 객체를 캐싱합니다.

브라우저 캐싱

브라우저는 Cache-Control: max-age 지시문의 값 동안 객체를 캐싱합니다.

오리진에서 Cache-Control: max-age 지시문을 객체에 추가하지 않음

CloudFront 캐싱

CloudFront는 CloudFront 기본 TTL의 값 동안 객체를 캐싱합니다.

브라우저 캐싱

브라우저에 따라 다릅니다.

CloudFront 캐싱

CloudFront는 CloudFront 최소 TTL 또는 기본 TTL의 값 중 더 큰 값 동안 객체를 캐싱합니다.

브라우저 캐싱

브라우저에 따라 다릅니다.

오리진에서 Cache-Control: max-ageCache-Control: s-maxage 지시문을 객체에 추가

CloudFront 캐싱

CloudFront는 Cache-Control: s-maxage 지시문의 값 또는 CloudFront 최대 TTL의 값 중 더 작은 값 동안 객체를 캐싱합니다.

브라우저 캐싱

브라우저는 Cache-Control max-age 지시문의 값 동안 객체를 캐싱합니다.

CloudFront 캐싱

CloudFront 캐싱은 CloudFront 최소 TTL과 최대 TTL 및 Cache-Control: s-maxage 지시문의 값에 따라 달라집니다.

  • 최소 TTL < s-maxage < 최대 TTL인 경우 CloudFront는 Cache-Control: s-maxage 지시문의 값 동안 객체를 캐싱합니다.

  • s-maxage < 최소 TTL인 경우 CloudFront는 CloudFront 최소 TTL의 값 동안 객체를 캐싱합니다.

  • s-maxage > 최대 TTL인 경우 CloudFront는 CloudFront 최대 TTL의 값 동안 객체를 캐싱합니다.

브라우저 캐싱

브라우저는 Cache-Control: max-age 지시문의 값 동안 객체를 캐싱합니다.

오리진에서 Expires 헤더를 객체에 추가

CloudFront 캐싱

CloudFront는 Expires 헤더의 날짜 또는 CloudFront 최대 TTL의 값 중 더 빨리 도래하는 객체를 캐싱합니다.

브라우저 캐싱

브라우저는 Expires 헤더의 날짜까지 객체를 캐싱합니다.

CloudFront 캐싱

CloudFront 캐싱은 CloudFront 최소 TTL과 최대 TTL 및 Expires 지시문의 값에 따라 달라집니다.

  • 최소 TTL < Expires < 최대 TTL인 경우 CloudFront는 Expires 헤더의 날짜 및 시간까지 객체를 캐싱합니다.

  • Expires < 최소 TTL인 경우 CloudFront는 CloudFront 최소 TTL의 값 동안 객체를 캐싱합니다.

  • Expires > 최대 TTL인 경우 CloudFront는 CloudFront 최대 TTL의 값 동안 객체를 캐싱합니다.

브라우저 캐싱

브라우저는 Expires 헤더의 날짜와 시간까지 객체를 캐싱합니다.

오리진에서 Cache-Control: no-cache, no-store 및/또는 private 지시문을 객체에 추가

CloudFront 및 브라우저에서는 헤더의 설정을 따릅니다.

CloudFront 캐싱

CloudFront는 CloudFront 최소 TTL의 값 동안 객체를 캐싱합니다. 이 표 아래의 경고를 참조하세요.

브라우저 캐싱

브라우저에서는 헤더의 설정을 따릅니다.

주의

최소 TTL이 0보다 큰 경우 CloudFront는 Cache-Control: no-cache, no-store 및/또는 private 지시문이 오리진 헤더에 있더라도 캐시 정책의 최소 TTL을 사용합니다.

오리진에 연결할 수 있는 경우 CloudFront는 오리진에서 객체를 가져와 최종 사용자에게 반환합니다.

오리진에 연결할 수 없고 최소 또는 최대 TTL이 0보다 큰 경우 CloudFront는 이전에 오리진에서 가져온 객체를 제공합니다.

이 동작을 방지하려면 오리진에서 반환된 객체에 Cache-Control: stale-if-error=0 지시문을 포함합니다. 이렇게 하면 향후 요청 시 오리진에 연결할 수 없을 때 CloudFront가 이전에 오리진에서 가져온 객체를 반환하는 대신 오류를 반환합니다.

CloudFront 콘솔을 사용하여 배포에 대한 설정을 변경하는 방법에 대한 자세한 내용은 배포 업데이트 섹션을 참조하세요. CloudFront API를 사용하여 배포에 대한 설정을 변경하는 방법에 대한 자세한 내용은 UpdateDistribution을 참조하세요.

Amazon S3 콘솔을 사용하여 객체에 헤더 추가

Amazon S3 콘솔을 사용하여 Cache-Control 또는 Expires 헤더 필드를 Amazon S3 객체에 추가하려면
  1. AWS Management Console에 로그인한 후 https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

  2. 버킷 목록에서 헤더를 추가할 파일을 포함하는 버킷 이름을 선택합니다.

  3. 헤더를 추가할 파일 또는 폴더의 이름 옆에 있는 확인란을 선택합니다. 폴더에 헤더를 추가하면 해당 폴더 내 모든 파일에 영향을 줍니다.

  4. [작업(Actions)]을 선택하고 [메타데이터 편집(Edit metadata)]을 선택합니다.

  5. [메타데이터 추가(Add metadata)] 패널에서 다음을 수행합니다.

    1. [메타데이터 추가(Add metadata)]를 선택합니다.

    2. [유형(Type)]에서 [시스템 정의(System defined)]를 선택합니다.

    3. [키(Key)]에서 추가할 헤더의 이름(Cache-Control 또는 Expires)을 선택합니다.

    4. [값(Value)]에 헤더 값을 입력합니다. 예를 들어, Cache-Control 헤더의 경우 max-age=86400을 입력할 수 있습니다. Expires의 경우 만료 날짜 및 시간(예: Wed, 30 Jun 2021 09:28:00 GMT)을 입력할 수 있습니다.

  6. 페이지 하단에서 [메타데이터 편집(Edit metadata)]을 선택합니다.