반응형

캐시 무효화

Cache-Control에 확실한 캐시 무효화를 할 수 있는 응답이 있다.

"캐시를 적용안하면 캐시가 안되는 것 아닌가요?"라고 궁굼할 수 있는데,
캐시를 적용하지 않아도 웹브라우저들이 ex)GET요청인 경우에 임의로 캐시를 해버리기도 한다.

그래서, "이 페이지는 정말 캐시가 되면 안돼!!"라면, ex) 현재 사용자의 통장잔고는 계속 갱신이 될 수 있으므로 캐시를 하면 안된다.

확실한 캐시 무효화 응답을 원한다면, 이것을 다 넣어줘야한다.

[확실한 캐시 무효화 응답]

  • Cache-Control: no-cache, no-store, must-revalidate
  • Pragma: no-cache
    • HTTP 1.0 하위 호환

과거 브라우저에서도 요청이 올 수 있으므로, 위의 것들을 모두 넣어줘야 한다.

  • Cache-Control: no-cache
    • 데이터는 캐시해도 되지만, 항상 원 서버에 검증하고 사용(이름에 주의!)
  • Cache-Control: no-store
    • 데이터에 민감한 정보가 있으므로 저장하면 안됨
      (메모리에서 사용하고 최대한 빨리 삭제)
  • Cache-Control: must-revalidate
    • 캐시 만료후 최초 조회시 원 서버에 검증해야함
    • 원 서버 접근 실패시 반드시 오류가 발생해야함 - 504(Gateway Timeout)
    • must-reavalidate는 캐시 유효 시간이라면 캐시를 사용함
  • Pragma: no-cache
    • HTTP 1.0 하위 호환

 

no-cache vs must-revalidate 가 왜 필요할까?

no-cache + ETag로 프록시 캐시로 갔다고 하자,
그러면 프록시 캐시 서버가 받아보니까, "어? no-cache네? 이건 내가 처리하면 안되는 거네?" 라고 하고선,
원서버에 요청한다.

그러면 원 서버가 검증을 해본다.

그리고나서 304응답을 해준다.
그러면 클라이언트는 해당 캐시를 그제서야 사용할 수 있을 것이다.

 

그런데 만약에, no-cache+ETag로 요청을 보내서,
프록시 캐시가 해당 요청을 보고 "no-cache네? 내가 처리못하는거네?" 라고하고선 원서버에 요청을 보내야하는데,
순간적으로 프록시 캐시서버와 원서버와의 네트워크가 단절되서 원서버에 접근이 불가하면? 어떻게 될까?

 

그러면, 이 프록시 캐시 서버에 "그래도 장애가 나는 것 보다는 옛날 데이터라도 보여주자!"라는 설정을 하는 경우가 있다.
그러면 Error가 아니라, 200OK로 할 수도  있다.

물론 왠만하면 원 서버에 요청을 하겠지만,
순간적으로 네트워크 단절이 되었을 때, 어떻게 할것인가? 에 대한 고민을 했을 때,
"옛날 데이터라도 보여주자"라고 판단해서 설정해놓았으면,
오류가아니라 200OK 라고 프록시 캐시 응답을 해버릴 수도 있다.

그런데, must-revalidate는 뭐냐면,
위와같이  순간 네트워크가 단절되어 원 서버 접근이 불가능 할 때,
항상 오류가 발생하여 504 Gateway Timeout이 발생하도록 설정하는 옵션이다.

예를 들면, 매우 중요한 돈과 관련된 것을 생각했을 때,

확실한 캐시 무효화를 하려면,
Cache-Control:no-cache, no-store, must-revalidate
Pragma: no-cache 를 작성해줘야 한다.

반응형