캐시 검증 헤더, Last-Modified, If-Modified-Since

캐시의 경우 유효시간이 초과하면 다시 요청을 보내서 새로운 데이터로 캐시를 업데이트한다.
만약 캐시 유효시간이 지났지만 서버 데이터가 변경되지 않아서, 해당 데이터를 써도 되는 상황이라면 이를 검증하고 사용하는 방법은 없을까?
Last-Modified와 If-Modified-Since #
첫 번째 요청 #

검증 헤더 Last Modified를 이용해 캐시의 수정시간을 알 수 있다.
Last Modified는 데이터가 마지막으로 수정된 시간 정보를 헤더에 포함함
이로 인해 응답 결과를 캐시에 저장할 때 데이터 최종 수정일도 저장된다.
두 번째 요청 #
캐시 유효시간이 초과되더라도 If-Modified-Since 헤더를 이용해 조건부 요청을 할 수 있다.


서버의 해당 자료의 최종 수정일과 비교해서 데이터가 수정이 안되었을 경우 서버는 응답 메시지에 이를 담아서 알려준다.
이때 HTTP Body는 응답 데이터에 없으며 상태 코드는 304 Not Modified로 변경된 것이 없다는 뜻임
전송 데이터에 바디가 빠졌기 때문에 헤더만 포함된 0.1M만 전송됨
클라이언트에서는 해당 응답을 받은 뒤 캐시를 갱신해 주고 다시 일정 시간 (60초) 동안 유효하게 된다.
정리 #
- 캐시 유효 시간이 초과해도, 서버의 데이터가 갱신되지 않았다면?
- 304 Not Modified + 헤더 메타데이터만 응답 (body x)
- 클라이언트는 서버가 보낸 응답 헤더 정보로 캐시의 메타데이터를 갱신
- 클라이언트는 캐시에 저장되어 있는 데이터 재활용
- 결과적으로 네트워크 다운로드가 발생하지만 용량이 적은 헤더 정보만 다운로드 (매우 실용적인 해결책.)
메타데이터: 데이터를 설명하는 데이터
단점 #
1초 미만 단위로 캐시 조정 불가능
날짜 기반의 로직 사용
데이터를 수정해서 날짜가 다르지만, 같은 데이터를 수정해서 데이터 결과가 똑같은 경우
서버에서 별도의 캐시 로직을 관리하고 싶은 경우
e.g. 스페이스나 주석처럼 크게 영향이 없는 변경에서 캐시를 유지하고 싶은 경우