✨ HTTP 프록시 캐시와 캐시 무효화 (no-cache, Must-revalidate)

leehyunju·2021년 6월 11일
4

네트워크

목록 보기
8/14
post-thumbnail

만약에 웹브라우저에서 저 멀리 있는 미국에 있는 원 서버까지 보내려면 되게 느리다. 대략 500ms가 걸린다고 해보자. 그래서 이미지 하나 다운받는데 500ms가 걸리는데 중간에 프록시 캐시를 도입하면 한국 어딘가에다가 프록시 캐시를 넣어두고, 요청이 오면 미국 원서버로 바로 보내는 것이 아니라 프록시를 거쳐서 오게 한다.

그래서 유투브를 볼 때, 사람들이 잘 안보는 외국 컨텐츠를 보면 유투브 다운로드가 굉장히 느리다. 사람들이 많이 보는 콘텐츠를 다운로드 받을 때는 로딩속도가 굉장히 빠르다. 그 이유는 한국에 있는 수많은 사람들이 다 다운로드를 받았기 때문이라고 한다!

첫 번째 유저는 보통 느리다. 두 번째 유저부터는 빨라진다. 퍼블릭 캐시와 프라이빗 캐시가 있는데, 중간에서 공용에서 사용하는 캐시를 퍼블릭 캐시라고 한다. 웹브라우저나 로컬에 저장된 캐시는 프라이빗 캐시라부른다.

Cache-Control (캐시 지시어)

  1. Cache-Control (public) : 응답이 퍼블릭 캐시에 저장되어도 된다.
  2. Cache-Control (private) : 응답이 해당 사용자만을 위한 것. 프라이빗 캐시에 저장해야 한다. (😀기본값😀)
  3. Cache-Control (s-maxage) : 프록시 캐시에만 적용되는 max-age
  4. Age: 60 (HTTP 헤더) : 오리진 서버에서 응답 후 프록시 캐시 내에 머문 시간 (초)
  • Cache-Control:no-cache => 데이터는 캐시해도 되지만, 항상 원 서버에 검증하고 사용 (이름에 주의!)
  • Cache-Control:no-store => 데이터에 민감한 정보가 있으므로 저장하면 안됨 (메모리에서 사용하고 최대한 빨리 삭제하기)
  • Cache-Control:must-revalidate
    • 캐시 만료 후 최초 조회시 원 서버에 검증해야한다.
    • 원 서버 접근 실패시 반드시 오류가 발생해야 한다. (504, Gateway Timeout)
    • must-revalidate는 캐시 유효 시간이라면 캐시를 사용한다.
  • Pragma : no-cache
    - HTTP 1.0 하위호환

💙 캐시 무효화 (확실한 캐시 무효화 응답)

Cache-Control : no-cache, no-store, must-revalidate
Pragma : no-cache

HTTP 1.0 하위 호환

이 페이지는 진짜 캐시가 되면 안돼! 라고 한다면 위에 코드들을 다 넣어주면 된다. 예를들어 통장잔고라던가 이런 개인정보유출이 되는 것에는 위에 코드를 써서 캐시를 막아 놓아야 한다. (국내 네이버에는 이렇게 되어있다.)

NO-cache

노캐시는 예를들어 Etag로 들어가면 프록시 캐시로 간다. 그럼 프록시 캐시가 이건 내가 처리하는 것이 아니군! 하고 원서버에 넘겨준다. 그러면 원서버가 검증을 해본다. 그럼 정상적으로 응답을 해준다.

Must-revalidate

1.캐시서버요청 옵션이 들어가버리면 프록시 캐시가 들어간다. 그런데, 프록시캐시가 이거 내가 처리하는거 아니네 라고하면 네트워크가 바로 단절이 된다. 그럼 504 게이트웨이 타임아웃이 나오도록 하는 것이 HTTP 스펙에 적혀있다.

예를들어서, 만약에 ! 통장잔고같은 돈과 관련된 것들은 정말 중요하다. 이것들은 오류가 나서 안보여야 한다. 프록시 캐시에 있는 과거 데이터들이 보이면 안된다.

이런 것들을 확실하게 프록시 캐시에 안보이게 해주려면

Cache-Control : no-cache, no-store, must-revalidate
Pragma : no-cache 👈 (HTTP 1.0하위호환까지 막아주려면 이 코드넣기)

이 코드 처리를 해줘야 한다.

profile
아늑한 뇌공간 🧠

2개의 댓글

comment-user-thumbnail
2022년 9월 24일

출처가 있는 자료같은데..

1개의 답글