ETag vs Cache-Control
- ETag - 매번 서버에 요청을 하고 서버와 클라이언트의 ETag값을 비교해 캐싱한 값을 계속 사용할 지 항상 물어본다.
- Cache-Control - 클라이언트에서 메모리 또는 디스크에 저장된 값을 불러오므로 실제론 서버에 요청을 하지 않는다. 따라서 서버에서 변경이 생겨도 캐시 무효화를 시킬 수 없다. 추가로 장점이자 단점으론 서버가 죽어있어도 실제론 성공으로 뜬다.첫 요청 이후 서버를 종료했음에도 200으로 나온다.
적용 예시
적용법
정규표현식 테스트
실제로 적용된 모습
- 첫 요청 이후 캐싱돼서 이후엔 status가 304로 나오고
- /api/d에 요청을 하면 ETag를 변경시켜서 캐시가 무효화 된다.(사이드 작업이 있어서 오래 걸린다.)
- /api/d 요청 이후 계속된 작업으로 인해 ETag가 계속 변한다. 따라서 200으로 오게 된다.
- 수정이 끝나면 ETag가 다시 일정해지니 304를 보내게 되는 것이다.
주의할 점
참고
ETag - HTTP | MDN
ETag HTTP 응답 헤더는 특정 버전의 리소스를 식별하는 식별자입니다. 웹 서버가 내용을 확인하고 변하지 않았으면, 웹 서버로 full 요청을 보내지 않기 때문에, 캐쉬가 더 효율적이게 되고, 대역폭도 아낄 수 있습니다. 허나, 만약 내용이 변경되었다면, "mid-air collisions" 이라는 리소스 간의 동시 다발적 수정 및 덮어쓰기 현상을 막는데 유용하게 사용됩니다.
https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/ETag
Cache-Control - HTTP | MDN
Cache-Control 일반 헤더 필드는 요청과 응답 내의 캐싱 메커니즘을 위한 디렉티브를 정하기 위해 사용됩니다. 캐싱 디렉티브는 단방향성이며, 이는 요청 내에 주어진 디렉티브가 응답 내에 주어진 디렉티브와 동일하다는 것을 뜻하지는 않는다는 것을 의미합니다.
https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Cache-Control
Last-Modified - HTTP | MDN
Last-Modified 응답 HTTP 헤더에는 원본 서버가 리소스가 마지막으로 수정되었다고 생각하는 날짜와 시간이 포함되어 있습니다. 이 헤더는 리소스가 이전에 저장된 리소스와 동일한지 확인하기 위한 유효성 검사기로 사용됩니다. ETag 헤더보다 정확하진 않지만 이 태그는 대비책으로 사용합니다. If-Modified-Since 또는 If-Unmodified-Since헤더를 포함하는 조건부 요청은 이 필드를 사용합니다.
https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Last-Modified