- 캐시 기본 동작
- 검증 헤더와 조건부 요청
- 캐시와 조건부 요청 헤더
- 프록시 캐시
- 캐시 무효화
클라이언트가 데이터를 요청하면 서버는 응답 메시지 헤더에 캐시 설정 값을 담아 보내준다.
ex) cache-control: max-age=60
만료시간이 적힌 해당 데이터를 브라우저 캐시에 저장하고 만료시간 동안 유효하게 된다. 유효한 시간동안은 클라이언트가 같은 요청을 보낼 때, 네트워크를 사용하지 않고 캐시에 저장되어 있는 데이터를 사용하게 되면서, 빠른 로딩속도를 경험할 수 있다.
하지만 캐시 시간이 초과되면 다시 요청을 보내고 그만큼의 네트워크 사용이 발생한다. 이러한 기본 캐시를 보완하기 위해 검증 헤더와 조건부 요청을 사용한다.
Last-Modified
서버에서 응답 시, 캐시 설정값과 함께 데이터의 최종 수정일을 헤더에 담아 보내준다.
ex) Last-Modified: Fri, 27 Sep 2019 01:00:00 GMT (데이터의 최종 수정일)
클라이언트는 서버에 데이터를 요청할 때, 캐시를 먼저 살펴보고 만약 캐시 시간이 초과되었다면 데이터가 변경되었는지 확인하는 요청 메시지를 보낸다. 헤더에는 최종 수정일을 담아 보낸다.
ex) If-modified-since: Fri, 27 Sep 2019 01:00:00 GMT
만약 서버가 가지고 있는 데이터의 최종 수정일이 요청에서의 최종 수정일과 다르지 않다면 304 응답을 보내고 클라이언트는 캐시의 메타 정보를 갱신하고, 캐시에 저장되어 있는 데이터 재활용 가능하게 된다.
ex) 304 Not Modified (바디 없음)
이 방식은 네트워크 사용이 발생하지만 용량이 적은 헤더 정보만 다운로드 하므로, 매우 실용적인 해결책이다.
한계
ETag
캐시용 데이터에 버전 이름이나, 해시를 생성해서 클라이언트에게 전달해준다.
ex) ETag: "aaaaaaa"
클라이언트는 데이터 변경을 확인할 때, ETag 값을 넣어 서버로 보내주게 되고 서버는 ETag 값을 이용하여 일치하면 304 응답을 보내고 일치하지 않으면 데이터를 전송해준다.
ex) If-None-Match: "aaaaaaa"
캐시 제어 헤더
Cache-Control
Pragma 캐시제어(하위 호환)
ex) Pragma: no-cache
Expires 캐시 만료일 지정(하위 호환)
캐시 만료일을 정확한 날짜로 지정
ex) expires: Mon, 01 Jan 1990 00:00:00 GMT
Cache-Control: max-age 권장
검증헤더
조건부 요청 헤더
네트워크의 전송시간을 줄이기 위해 사용자에게 물리적으로 가까운 곳에 프록시 서버를 운영하고 DNS를 조작하여 사용자가 프록시 서버에 먼저 방문하도록 한다. 프록시 서버는 public 캐시 데이터를 저장해놨다가 사용자가 요청시 캐시 데이터를 전송해준다.
Cache-Control
Cache-Control: no-cache, no store, must-revalidate
Pragma: no-cache (하위 호환용으로 추가)
해당 포스팅은 김영한님의 인프런 강의 "모든 개발자를 위한 HTTP 웹 기본 지식"를 수강하고 배운 내용을 정리한 글입니다.