캐시 데이터를 임의의 장소에 저장한다고 했는데, 그러면 또 이런 의문이 생깁니다.
해당 저장된 자료를 언제까지 참조해야 합니까?
서버의 정보는 이미 변경 되었는데, 만약 아직까지 브라우저가 캐시된 자료를 참조하고 있다면 어떨까요? 아마 받아들이는 정보에 시차가 생기고 어쩌면 정확한 정보 전달이 어려워질수도 있겠죠?
정보는 종류에 따라 실시간성이 필요한 경우가 있는데, 이럴 경우 해당 컨텐츠를 통해 받아들이는 정보가 실시간성을 띄지 않게 됩니다. 그래서 웹 브라우저는 캐시를 사용할 때, 이 데이터가 혹시 최신 데이터가 맞는지 재검증을 진행하게 되고, 이런 재검증을 통해 정보의 준실시간성을 지원하고자 노력합니다.
이러한 재검증, 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 : 안 바뀌었어? |
헤더에는 캐시를 관리하는 cache-control 영역이 존재합니다. 해당 영역에는 max-age라는 값이 있는데, 해당 값을 관리하여 이 페이지가 몇 초 동안 유효한지를 결정합니다.
max-age=3600 : 이 페이지는 1시간 동안 유효합니다. 1시간 뒤 재검증 할 예정입니다.
웹 서버가 해당 헤더를 주었다면, Last - Modified 값을 전송합니다. 이 때의 Last-Modified는 사실상의 마지막 수정일을 의미합니다. 이러한 응답의 답변은 HTTP Method에 따라 2가지로 구분이 가능합니다. 2가지의 전달 헤더에 따라 받게 되는 답과 http 응답 메시지를 받을 수 있습니다.
If-Modified-Since? ==> 바뀌었어?
서버 답변
If-Unmodified-Since? ==> 안 바뀌었어?
서버 답변
ETag 는 Entity Tag로, 파일 내용에 대한 해시값을 기반으로 전달 해 줍니다. 해시값은 파일의 내용에 대한 값을 특정한 키로 암호화 한 값을 가지고 있는데, 파일의 내용이 살짝만 바뀌어도 값이 변하게 되어 해당 태그를 통해 컨텐츠가 바뀌었는지 판단합니다. 웹 서버가 ETag를 주었다면, 아래와 같은 2가지의 응답을 다시 보내게 됩니다.
If-None-Matched? ==> 다른거야? (= 바뀌었어?)
서버 답변
If-Modifeid? ==> 같은거야 (= 안바뀌었어?)
서버 답변
참조 - Response Header의 Last-modified, ETag

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