YOGAE

TODO: FIXME:

Cache 설정

23 May 2019

HTTP 캐싱

ETag로 캐시된 응답에 대한 유효성 검사 수행

브라우저에서 최대 cache 저장 기간이 지난 후 리소스를 요청하는 경우 새 요청을 발송하고 새 응답을 가져올 수 있습니다. 그러나 리소스가 변경되지 않은 경우 이미 캐시에 있는 동일한 정보를 다운로드할 이유가 없습니다.

요청 시 ETag 헤더에 지문을 넣어서 서버에 전송하기만 하면 됩니다. 디지털 지문이 여전히 동일한 경우 리소스가 변경되지 않고 이 다운로드를 건너뛸 수 있습니다.

Cache-Control

no-cache 및 no-store

‘no-cache’는 반환된 응답이 변경된 경우 서버와 먼저 확인하지 않고는 동일한 URL에 대한 후속 요청을 충족하는 데 사용할 수 없음을 나타냅니다. 따라서 적절한 유효성 검사 토큰(ETag)이 있을 경우 ‘no-cache’는 캐시된 응답의 유효성을 검사하는 데 한 번의 왕복을 발생시키지만, 리소스가 변경되지 않은 경우 다운로드를 제거할 수 있습니다.

‘no-store’는 브라우저와 모든 중간 캐시는 반환된 응답의 모든 버전(예: 비공개 개인 데이터 또는 은행 데이터가 포함된 응답)을 저장할 수 없습니다. 사용자가 이러한 자산을 요청할 때마다 요청이 서버로 전송되고 전체 응답이 다운로드됩니다.

public vs private

public이면 공유 캐시(또는 중개 서버)에 저장해도 된다

‘private’ 응답은 브라우저가 캐시할 수 있습니다. 그러나 일반적으로 이 응답은 단일 사용자를 대상으로 하므로 중간 캐시가 이 응답을 캐시하는 것은 허용되지 않습니다.

CloudFront

CloudFront 동작

오리진의 응답은 파일 변경 여부에 따라 달라집니다.

  • CloudFront 캐시에 이미 최신 버전이 있는 경우 오리진에서는 304 상태 코드(수정되지 않음)를 반환합니다.
  • CloudFront 캐시에 최신 버전이 없는 경우 오리진에서는 200 상태 코드(OK)와 최신 버전의 파일을 반환합니다.

X-Cache 헤더가 “Hit from cloudfront” 또는 “RefreshHit from cloudfront”인 경우 엣지 로케이션의 캐시에서 요청이 처리된 것입니다.

기본적으로 CloudFront는 오리진에서 클라이언트로 오류 응답을 전달합니다. 또한 CloudFront는 오리진의 오류 응답을 5분(300초)간 캐싱합니다. 오리진의 오류 응답에 Cache-Control 헤더가 포함되어 있는 경우 CloudFront는 기본 설정인 5분간이 아니라 관련 TTL에 따라 오류를 캐싱합니다.

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

  • 오리진 서버에서 객체에 Cache-Control 헤더를 추가하여 CloudFront 캐시에 객체가 머무르는 시간을 제어하는 경우와, Cache-Control 값을 변경하지 않으려는 경우 Use Origin Cache Headers(오리진 캐시 헤더 사용)를 선택합니다.
    • 오리진이 캐싱 헤더를 반환하지 않으면 배포에 기본 TTL을 사용합니다.
    • 오리진이 최소 TTL보다 작거나 최대 TTL보다 캐싱 헤더를 반환하면 각각 최소 TTL과 최대 TTL을 사용합니다.
  • Cache-Control 헤더와 관계없이 CloudFront 캐시에 객체가 머무르는 최소 및 최대 시간과 객체에서 Cache-Control 헤더가 누락된 경우 CloudFront 캐시에 객체가 머무르는 기본 시간을 지정하려면 Customize(사용자 지정)를 선택합니다. 그런 다음 최소 TTL, 기본 TTL최대 TTL 필드에서 값을 지정합니다.

CloudFront에서 웹 배포용 객체를 캐싱하는 시간 지정

Minimum TTL(최소 TTL), Maximum TTL(최대 TTL) 및 Default TTL(기본 TTL)의 값을 지정하려면 Object Caching(객체 캐싱) 설정에 대해 사용자 지정 옵션을 선택해야 합니다.

오리진 구성 최소 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 < 최대 TTLCloudFront는 Cache-Control max-age 명령의 값 동안 객체를 캐싱합니다.max-age < 최소 TTLCloudFront는 CloudFront 최소 TTL의 값 동안 객체를 캐싱합니다.max-age > 최대 TTLCloudFront는 CloudFront 최대 TTL의 값 동안 객체를 캐싱합니다.브라우저 캐싱브라우저는 Cache-Control max-age 명령의 값 동안 객체를 캐싱합니다.
오리진에서 Cache-Control max-age 명령을 객체에 추가하지 않음 CloudFront 캐싱CloudFront는 CloudFront 기본 TTL의 값 동안 객체를 캐싱합니다.브라우저 캐싱브라우저에 따라 다릅니다. CloudFront 캐싱CloudFront는 CloudFront 최소 TTL 또는 기본 TTL의 값 중 더 큰 값 동안 객체를 캐싱합니다.브라우저 캐싱브라우저에 따라 다릅니다.
오리진에서 Cache-Control max-age 및 Cache-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 < 최대 TTLCloudFront는 Cache-Control s-maxage 명령의 값 동안 객체를 캐싱합니다.s-maxage < 최소 TTLCloudFront는 CloudFront 최소 TTL의 값 동안 객체를 캐싱합니다.s-maxage > 최대 TTLCloudFront는 CloudFront 최대 TTL의 값 동안 객체를 캐싱합니다.브라우저 캐싱브라우저는 Cache-Control max-age 명령의 값 동안 객체를 캐싱합니다.
오리진에서 Expires 헤더를 객체에 추가 CloudFront 캐싱CloudFront는 Expires 헤더의 날짜 또는 CloudFront 최대 TTL의 값 중 더 빨리 도래하는 때까지 객체를 캐싱합니다.브라우저 캐싱브라우저는 Expires 헤더의 날짜까지 객체를 캐싱합니다. CloudFront 캐싱CloudFront 캐싱은 CloudFront 최소 TTL과 최대 TTL 및 Expires 헤더의 값에 따라 달라집니다.최소 TTL < Expires < 최대 TTLCloudFront는 Expires 헤더의 날짜와 시간까지 객체를 캐싱합니다.Expires < 최소 TTLCloudFront는 CloudFront 최소 TTL의 값 동안 객체를 캐싱합니다.Expires > 최대 TTLCloudFront는 CloudFront 최대 TTL의 값 동안 객체를 캐싱합니다.브라우저 캐싱브라우저는 Expires 헤더의 날짜와 시간까지 객체를 캐싱합니다.
오리진에서 Cache-Control: no-cache, no-store 및/또는 private 명령을 객체에 추가 CloudFront 및 브라우저에서는 헤더의 설정을 따릅니다.CloudFront에서 Cache-Control: no-cache헤더를 처리하는 방식에 대한 예외 사항은 동일 객체에 대한 동시 요청(트래픽 스파이크) 단원을 참조하십시오. CloudFront 캐싱CloudFront는 CloudFront 최소 TTL의 값 동안 객체를 캐싱합니다.브라우저 캐싱브라우저에서는 헤더의 설정을 따릅니다.

Reference