[ASAC 06] HTTP Cache - Revalidate 란?

flavor_blue·2024년 8월 21일

Cache

목록 보기
2/3

Revalidate 란?

캐시 데이터를 임의의 장소에 저장한다고 했는데, 그러면 또 이런 의문이 생깁니다.

해당 저장된 자료를 언제까지 참조해야 합니까?

서버의 정보는 이미 변경 되었는데, 만약 아직까지 브라우저가 캐시된 자료를 참조하고 있다면 어떨까요? 아마 받아들이는 정보에 시차가 생기고 어쩌면 정확한 정보 전달이 어려워질수도 있겠죠?
정보는 종류에 따라 실시간성이 필요한 경우가 있는데, 이럴 경우 해당 컨텐츠를 통해 받아들이는 정보가 실시간성을 띄지 않게 됩니다. 그래서 웹 브라우저는 캐시를 사용할 때, 이 데이터가 혹시 최신 데이터가 맞는지 재검증을 진행하게 되고, 이런 재검증을 통해 정보의 준실시간성을 지원하고자 노력합니다.

재검증방법

이러한 재검증, Revalidate 에 대한 방법은 간단합니다. 바로 재검증 기준이 되는 값을 서버에게 보내게 됩니다. 이러한 재검증은 웹 서버가 설정한 특정 주기에 따라 재검증을 진행합니다.

재검증 주기

캐시 해 놓은 데이터를 얼마 간격으로 재검증할지에 대해 정하는 것 입니다. 데이터가 자주 바뀌는 데이터인지, 아닌지에 따라 주기를 설정하여 관리합니다. 주기가 너무 길어도 안되고, 너무 짧아도 안되는 심도 깊은 고민이 필요합니다.

재검증 기준

캐시 해 놓은 데이터가 오래됐는지 여부를 원본 주인인 웹 서버가 판단하기 위한 기준 근거를 가지고 기준을 잡습니다. 이러한 기준에는 수정일 (Last-Modified)과 고유값(ETag)이 있습니다.

Last-Modified(수정일)ETag (고유값)
낮은 정확도
- 파일이 수정되지 않았는데 수정일이 변경되는 경우
- 텍스트 파일 수정 후, 다시 원상복구한 경우 수정일만 변경
높은 정확도
그렇기에 사실 Last-modified 보다 ETag 사용이 좋다.
다만, HTTP 1.0 혹은 1.1 호환성을 위해 둘 다 사용하는 편.
검사 방법
- If-Modified-Since : 바뀌었어?
- If-Unmodified-Since : 안 바뀌었어?
검사 방법
- If-None-Match : 바뀌었어?
- If-Match : 안 바뀌었어?

재검증 주기 설정 : max-age

헤더에는 캐시를 관리하는 cache-control 영역이 존재합니다. 해당 영역에는 max-age라는 값이 있는데, 해당 값을 관리하여 이 페이지가 몇 초 동안 유효한지를 결정합니다.
max-age=3600 : 이 페이지는 1시간 동안 유효합니다. 1시간 뒤 재검증 할 예정입니다.

재검증 기준 : Last-Modified 기반

웹 서버가 해당 헤더를 주었다면, Last - Modified 값을 전송합니다. 이 때의 Last-Modified는 사실상의 마지막 수정일을 의미합니다. 이러한 응답의 답변은 HTTP Method에 따라 2가지로 구분이 가능합니다. 2가지의 전달 헤더에 따라 받게 되는 답과 http 응답 메시지를 받을 수 있습니다.
If-Modified-Since? ==> 바뀌었어?
서버 답변

  • Yes(바뀌었다.) : 200 Resource Cache + 새 응답
  • No(안바뀌었다.) : 304 Not Modified

If-Unmodified-Since? ==> 안 바뀌었어?
서버 답변

  • Yes (안바뀌었음) : 304 Not Modified
  • No (바뀌었음) : 412 Precondition Failed (조건부 요청에 대한 부정 응답.)

재검증 기준 : ETag 기반

ETag 는 Entity Tag로, 파일 내용에 대한 해시값을 기반으로 전달 해 줍니다. 해시값은 파일의 내용에 대한 값을 특정한 키로 암호화 한 값을 가지고 있는데, 파일의 내용이 살짝만 바뀌어도 값이 변하게 되어 해당 태그를 통해 컨텐츠가 바뀌었는지 판단합니다. 웹 서버가 ETag를 주었다면, 아래와 같은 2가지의 응답을 다시 보내게 됩니다.
If-None-Matched? ==> 다른거야? (= 바뀌었어?)
서버 답변

  • Yes(바뀌었다.) : 200 Resource Cache + 새 응답
  • No(안바뀌었다.) : 304 Not Changed + 412 Precondition Failed

If-Modifeid? ==> 같은거야 (= 안바뀌었어?)
서버 답변

  • Yes(안 바뀌었다.) : 304 Not Chagned
  • No (바뀌었다.) : 412 Precondition Failed

참조 - Response Header의 Last-modified, ETag

📑 출처 및 참조
[ASAC] 강의 자료
https://stackoverflow.com/questions/36020837/cache-control-headers-max-age-defined-but-back-button-always-deliver-web-cache

profile
아무거나 쓰려하지 말고 생각하며 쓰고 싶습니다

0개의 댓글