이제 사용자가 요청을 할 때 서버에서 아래와같이 cache-control이라는 응답헤더를 만들어서 내려주면
클라이언트는 이를 캐시 저장소에 저장해두었다가 두번째 요청할 땐 캐시 메모리를 뒤져서 아직 유효하다면 그냥 캐시에서 바로 가져오면 된다.
그럼 이제 또 문제가 생기는데 캐시시간이 초과된다면 똑같은 값을 서버를 통해 전체를 다시 데이터를 다운받고 캐시를 갱신한다.
이는 다시 네트워크 다운로드가 발생한다.
그럼 이 바보같은 상황을 어떻게 해결할까?
if-modified-since:
값을 넣어서 요청하면그럼이제 헤더에 값만 왔다갔다하기 때문에 실제 이미지 값이 들어있는 http body가 없기 때문에 굉장히 가볍고 빠르고, 싸게 소통하여 네트워크 부하를 확 줄일 수 있다.
참고로 개발자 도구의 네트워크 탭을 봤을 때 Status가 찐한게 있고 연한게 있는데 연한거는 그냥 cache에서 가져온 것이다.
예를들어 캐시용 데이터의 임의의 고유한 버전 이름을 달아두는데 이때 이름을 해당 데이터의 해쉬 값을 넣을 수도 있다. 그럼 데이터를 다시 원복해도 해쉬 값을 똑같을 테니까.
그래서 데이터가 바뀐다면 해쉬값도 바뀔거고, 무튼 그래서 해당 버전이름(ETag)만 주고받으면서 조건부 요청을 구현하는 것이다.
이때 클라이언트는 진짜 블랙박스 역할만 하여 서버에 값을 전달하는 기능만한다.
Cache-Control: max-age
Cache-Control: no-cache
Cache-Control: no-store
Cache-Control: must-revalidate
Cache-Control: public
Cache-Control: private
[참고] Cache-Control: s-maxage
[참고] Age: 60 (HTTP 헤더)
Pragma: 캐시 제어 (Cache-Control의 하위호환)
Expires: 캐시 유효 기간 (Cache-Control의 하위호환)
검증헤더 (validator)
조건부 요청 헤더
한국의 클라이언트가 미국에 있는 원 서버에 갔다오려면 꽤 오래걸린다.
이미지 하나를 받는데 0.5초가 걸린다는 뜻이다.
그래서 대안이 프록시 캐시(CDN 서비스)를 도입하는 것이다.
그래서 미국 원 서버에서 한국의 어딘가에 프록시 캐시 서버를 만들어 두고 요청을 할 때 이 proxy-cache server에 접근하게 만드는 것이다.
Cache-Control: no-cache, no-store, must-revalidate
를 모두 넣어줘야한다.Pragma: no-cache
도 넣어줘야한다.