캐시 제어와 관련된 헤더들은 다음과 같이 세 가지 정도가 있다.
Cache-Control
: 캐시 제어Pragma
: 캐시 제어 (하위 호환)Expires
: 캐시 유효 기간 (하위 호환)
Pragma의 no-cache
는 HTTP 1.0의 하위 호환을 위한 헤더이다. 따라서 현재는 잘 사용하지 않는다.
expires: Mon, 01 Jan 1990 00:00:00 GMT
Expires
는 캐시 만료일을 정확한 날짜로 지정하는 헤더다. HTTP 1.0 부터 사용 가능하며, 지금은 더 유연한 Cache-Control: max-age
를 권장한다. 이 헤더를 사용하면 Expires
는 무시된다.
한국에 있는 클라이언트들이 미국에 있는 원 서버에 접근한다고 가정해보자. 물리적 거리가 길수록 원 서버를 통해 데이터를 얻는 시간은 증가할 것이다.
따라서 한국에 프록시 캐시 서버를 도입한다. 미국에 있는 원 서버에서 데이터를 받아와 미리 프록시 캐시 서버에 저장해두고, 한국 클라이언트들이 요청했을 때 원 서버에 접속하는 것보다 훨씬 더 빠른 시간으로 데이터를 응답해줄 수 있다.
프록시 캐시 서버가 가지고 있는 캐시를 public 캐시
라고 하고, 클라이언트들이 로컬에 가지고 있는 캐시를 private 캐시
라고 한다.
Cache-Control: public
: 응답이 public 캐시에 저장되어도 된다는 뜻.
Cache-Control: private (default)
: 응답이 해당 사용자만을 위한 것이기 때문에, private 캐시에 저장해야 함.
Cache-Control: s-maxage
: 프록시 캐시에만 적용되는 max-age 설정.
Age: 60
(HTTP 헤더): 원 서버에서 응답 후 프록시 캐시 내에 머문 시간(초)
완벽한 캐시 무효화를 위해서는 아래 헤더들을 모두 사용해야 한다.
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Cache-Control: no-cache
: 데이터는 캐시해도 되지만, 항상 원 서버에 검증하고 사용한다. (이름에 주의!)
Cache-Control: no-store
: 데이터에 민감한 정보가 있으므로 저장하면 안된다. 메모리에서 사용하고 최대한 빨리 삭제한다.
Cache-Control: must-revalidate
504(Gateway Timeout)
Pragma: no-cache
: HTTP 1.0 하위 호환을 위한 헤더이다.no-cache
기본 로직은 이러하다.
웹 브라우저가 요청한 no-cache
설정을 보고 프록시 캐시 서버는 원 서버에게 요청을 전달한다. 원 서버는 검증 이후 데이터가 변경되지 않았다면 304 Not Modified 응답을 전달하고, 이를 받은 클라이언트는 브라우저 캐시에 저장되어 있던 캐시를 사용한다.
만약 프록시 캐시 서버와 원 서버 사이의 네트워크가 단절되어 원 서버에 접근이 불가한 상태가 된다면,
no-cache
는 클라이언트에게 오류를 전달하는 것보다 오래된 데이터라도 전달하는 것이 낫다는 기반 하에 200 OK를 응답한다.
같은 상황에서 must-revalidate
는 다른 결과를 제공한다. 원 서버에 접근할 수 없는 경우 항상 오류가 발생해야 하기 때문에, 504 Gateway Timeout을 응답한다.