캐시이 유효기간을 초과해도 만약 동일한 데이터를 써도 되는 상황에서는 어떻게 해야할까?
이러한 상황에서 캐시의 검증하고 사용할 수 있는 방법이 있다.
바로 검증 헤더 (Last Modified)를 통해 캐시의 마지막 수정 시간을 알아보는 것이다.
Last Modified는 데이터가 마지막으로 수정된 시간 정보를 헤더에 포함한다. 이로 인해 응답 결과를 캐시에 저장할 때 데이터 최종 수정일도 저장된다.
그리고 이 때 서버의 해당 자료의 최종 수정일과 비교해서 데이터가 수정이 안되었을 경우 응답 메시지에 이를 담아서 알려준다.
데이터가 수정되었는지 검증한다.
수정되지 않았으면 바디를 제외하고 HTTP헤더만 전송된다. 304Not Modified
브라우저 캐시에서 응답 결과를 재사용하고 헤더 메타데이터 또한 갱신한다.
브라우저는 캐시에서 조회한 데이터를 렌더링한다.
304 Not Modified + 헤더 메타데이터만 응답한다. (바디에 없음)
클라이언트는 서버가 보낸 응답 헤더 정보로 캐시의 메타데이터를 갱신한다.
클라이언트는 캐시에 저장된 데이터를 재사용한다.
결국 네트워크 다운로드가 발생하지만 용량이 적은 헤더 정보만 다운로드 된다.
1초 미만 단위로는 캐시 수정이 안된다.
날짜 기반의 로직을 사용한다.
데이터를 수정해서 날짜가 다르지만, 같은 데이터를 수정해서 데이터 결과가 똑같은 경우
서버에서 별도의 캐시 로직을 관리하고 싶은 경우
Last-Modified, if-Modified-Since 보다 좀 더 간편한 방식인 ETag와 If-None-Match 검증 헤더도 알아보자.
👉🏻 ETag는 서버에서 완전히 캐시를 컨트롤하고 싶은 경우에 사용한다.
캐시용 데이터에 임의의 고유한 버전 이름을 달아둔다.
데이터가 변경되면 이 버전 이름을 바꿔서 변경한다. (Hash를 다시 생성한다.)
단순하게 ETag만 보내서 같으면 유지하고, 다르면 다시 받는 방식이다.
서버에서 헤더에 ETag를 작성해서 응답한다. 클라이언트의 캐시에서 해당 ETag 값을 저장한다.
ETag값을 검증하는 If-None-Match를 요청 헤더에 작성해서 보낸다. (조건부 요청을 할 수 있다. )
위와 동일하게 데이터가 변경되지 않은 경우
(동일하면 If-None-Match는 거짓이 된다.)
데이터가 수정되었는지 ETag를 이용해 검증한다.
수정되지 않았다면 바디를 제외한 HTTP헤더만 전송한다.
브라우저 캐시에서 응답 결과를 재사용하고, 헤더 메타데이터 또한 갱신한다.
브라우저 캐시에서 조회한 데이터를 렌더링한다.
단순하게 ETag만 보내서 같으면 유지하고 다르면 다시 받는다.
캐시 제어 로직을 서버에서 완전히 관리한다.
클라이언트는 단순히 이 값을 서버에 제공한다.
캐시 유효 시간이며 초 단위이다.
데이터는 캐시해도 되지만, 항상 오리진 서버에 검증하고 사용한다.
데이터에 민감한 정보가 있으므로 저장하면 안된다. (메모리에서 사용하고 최대한 빨리 삭제)
캐시 만료일을 정확한 날짜로 지정한다.
HTTP 0.1부터 사용한다.
Cache-Control:max-age를 사용하는 것을 더 권장한다.
Cache-Control:max-age과 사용되면 Expires는 무시된다.
👉👉🏻 검증 헤더(Vaildator)는 Etag, Last-Modified 를 사용하고 이에 따른 조건부 요청 헤더는 If-None-Match, If-Match와 if-Modified-Since, if-Unodified-Since 이다.