HTTP

캐시와 조건부 요청 헤더 & 프록시 캐시와 캐시 무효화

느리지만 꾸준하게 2022. 4. 30. 23:47

캐시 제어 헤더

 

  • Cache - Control: 캐시 제어

 

  • Pragma: 캐시 제어(하위 호환)

 

  • Expires: 캐시 유효 기간(하위 호환)

 

 

 

 

 

Cache-Control

캐시 지시어(directives)

 

 

Cache-Control: max-age

 

  • 캐시 유효 시간, 초 단위

 

 

Cache-Control: no-cache

 

  • 데이터는 캐시해도 되지만, 항상 원(origin) 서버에 검증하고 사용

 

 

 

 

Cache-Control: no store

 

  • 데이터에 민감한 정보가 있으므로 저장하면 안됨

 

  • (메모리에서 사용하고 최대한 빨리 삭제)

 

 

 

 

Pragma

캐시 제어(하위 호환)

  • Pragma: no-cache
  • HTTP 1.0 하위 호환

 

Expires

캐시 만료일 지정(하위 호환)

 

 

  • expires: Mon, 01 Jan 1990 00:00:00 GMT

 

  • 캐시 만료일을 정확한 날짜로 지정

 

  • HTTP 1.0 부터 사용

 

  • 지금은 더 유연한 Cache-Control: max-age 권장

 

  • Cache-Control: max-age와 함께 사용하면 Expires는 무시

 

 

 

 

 

 

검증 헤더와 조건부 요청 헤더

  • 검증 헤더(Validator)

 

  • ETag: "v1.0", ETag: "asid93jkrh2l"

 

  • Last-Modified: Thu, 04 Jun 2020 07:19:24 GMT

 

  • 조건부 요청 헤더

 

  • If-Match, If-None-Match: ETag 값 사용

 

  • If-Modified-Since, If-Unmodified-Since: Last-Modified 값 사용

 

 

 

프록시 캐시에 대해서 보면

 

한국에 있는 여러 클라이언트에서 미국에 있는 원 서버로 갈려면 엄청 오래 걸린다.

 

한국 어딘가에 프록시 캐시 서버를 거쳐서 가게 해보자. 응답 속도가 굉장히 빠르다.

 

 

 

 

유튜브에서 개발 컨텐츠 같은 사람들이 잘 안보는걸 보면 유튜브 다운로드가 엄청 느리다.

 

사람들이 많이 보는 컨텐츠를 다운받으면 로딩속도가 엄청 빠르다. 즉 한국 어딘가에 있는 서버에서 다운로드 받는 것이다.(CDN Service)

 

 

 

 

 

 

 

Cache-Control

 

캐시 지시어(directives) - 기타

 

 

 

Cache-Control: public

  • 응답이 public 캐시에 저장되어도 됨

 

 

 

Cache-Control: private

  • 응답이 해당 사용자만을 위한 것임, private 캐시에 저장해야 함 (기본값)

 

 

 

Cache-Control: s-maxage

  • 프록시 캐시에만 적용되는 max-age

 

 

Age: 60(HTTP 헤더)

  • 오리진 서버에서 응답 후에 프록시 캐시 내에 머문 시간(초)

 

 

 

 

캐시 무효화를 알아보자.

확실한 캐시 무효화 응답

 

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

 

  • Pragma: no-cache

 

  • HTTP 1.0 하위 호환

 

 

Cache-Control

 

캐시 지시어(directives) - 확실한 캐시 무효화

 

 

Cache - Control: no-cache

 

  • 데이터는 캐시해도 되지만, 항상 원 서버에 검증하고 사용

 

 

 

 

Cache-Control: no-store

 

  • 데이터에 민감한 정보가 있으므로 저장하면 안됨(메모리에서 사용하고 최대한 빨리 삭제)  
  •  
  •  
  •  

 

Cache-Control: must-revalidate

 

  • 캐시 만료후 최초 조회시 원 서버에 검증해야함

 

  • 원 서버 접근 실패시 반드시 오류가 발생해야함 - 504(Gateway Timeout)

 

  • must-revalidate는 캐시 유효 시간이라면 캐시를 사용함

 

 

 

 

 

Pragma: no-cache

 

  • HTTP 1.0 하위 호환

 

 

 

 

 

 

최초의 요청응답과정을 했을 때 브라우저 캐시가 no-cache 즉 http 응답코드에 no-cache가 있었다.

그리고 원 서버에서 검증을 하고 ok 쓸 수 있구나하고 응답을 하게 되는 것이다.

 

 

 

 

 

no-cache로 보냈는데 캐시서버가 no-cache네 하고 원 서버에 데이터를 보내야 하는데

순간적으로 네트워크에 단절이 생긴다.

빈번한 경우인데 이러면 프록시 캐시서버가 장애가 나는거보다는 오래된 데이터라도 보야주자 하고 200 ok로 응답을 보내주게 된다.

 

 

 

 

 

그런데 must-revalidate는 무엇이냐?

캐시 서버 요청을 웹브라우저에서 보내면 프록시 캐시가 네트워크 단절시에 항상 오류가 발생되게 504 상태코드를 보여준다.

 

 

 

 

 

 

그래서 서버 쪽에서 HTTP 응답코드를 만들 때

Cache-Control을 기억하자!

 

  • no - cache

 

  • no - store

 

  • must - revalidate

 

 

 

 

하위 까지 생각해서

 

Pragma: no-cache

  • HTTP 1.0 하위 호환도 기억해주자.

 

 

 

 

 

 

 

 

 

 

 

 

<출처 김영한: 모든 개발자를 위한 HTTP 웹 기본 지식 >

https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/dashboard

 

모든 개발자를 위한 HTTP 웹 기본 지식 - 인프런 | 강의

실무에 꼭 필요한 HTTP 핵심 기능과 올바른 HTTP API 설계 방법을 학습합니다., - 강의 소개 | 인프런...

www.inflearn.com

 

'HTTP' 카테고리의 다른 글

Network  (0) 2022.12.19
캐시 기본 동작 & 검증 헤더와 조건부 요청  (0) 2022.04.30
인증 & 쿠키  (0) 2022.04.30
전송 방식 & 정보(일반 정보 and 특별한 정보)  (0) 2022.04.30
HTTP 헤더 개요 & 표현 및 컨텐츠 협상  (0) 2022.04.30