본문 바로가기
CS

HTTP 헤더 - 헤더2 (캐시, 조건부)

by 김선지 2024. 6. 9.

캐시가 없을때 response를 줄때

 

  HTTP 헤더: 0.1M

  HTTP 바디: 1.0M 이런식으로 줄 수 있다.

이는 다시 요청해도 마찬가지다.

즉, 요청시마다 네트워크를 이용해야 한다.

 

캐시가 있을 때

응답헤더 (

 cache-control: max-age=60

60초동안은 캐시가 유효하다.

)

 

 캐시가 있다면

  HTTP 헤더: 0.1M

  HTTP 바디: 1.0M 

응답 결과를 브라우저 캐시에 저장한다.

 

두번째 요청하는 경우 브라우저 캐시를 뒤져서 유효한 캐시가 있을 경우 캐시에서 조회한다.

즉, 네트워크를 사용하지 않아도 됨.

캐시 유효시간 초과시, 서버를 통해 데이터 다시 조회하고 캐시를 갱신

 

검증헤더와 조건부 요청1

캐시 만료 후에도 서버에서 데이터를 변경하지 않을 경우 캐시 재사용가능, 다만 클라이언트와 서버 데이터가 같다는 검증이 필요함.

Last-Modified: 2020년 1월 11일 10:00:00 (response)

if-Modified-Since:2020년 11월 10일 10:00:00 (request), 이후에 데이터가 수정되었으면?

if-Unmodified-Since

if-modified-since 쪽이 더 늦게 변경되었거나 동일할 경우 304 Not Modified를 응답해주고 HTTP Body를 보내주지 않음

-> 클라이언트는 서버가 보낸 응답 헤더 정보로 캐시의 메타 정보 갱신, 클라인트는 캐시 데이터 재활용

=> 네트워크 다운로드가 발생하지만 헤더 분량의 0.1M만 사용

 

-> 아닐 경우 200OK, Body 포함 데이터 전송

단점: 1초 미만 캐시조정 불가, 날짜기반 로직 사용해서 데이터를 수정해서 날짜가 다르지만, 같은 데이터라서 결과가 같은 경우, 서버에서 별도의 캐시 로직을 관리하고 싶은 경우 (주석 갱신)

 

검증헤더와 조건부 요청2

ETag : 캐시용 데이터에 임의의 고유한 버전 이름을 달아둠, 데이터가 변경되면 이 이름을 바꾸어서 (Hash 다시생성) 변경함, ETag만 같으면 유지, 다르면 다시 받기

ETag: "aaaaaaaaaaaaaaaaaaa"

if-None-Match: " aaaaaaaaaaaaaaaaaaa" 보내서 서버의 ETag와 이름이 같으면 304, 아니면 200

if-Match

특징: 캐시 제어 로직을 서버에서 완전히 관리

 

캐시 제어 헤더

Cache-Control: max-age  => 캐시 유효시간, 초 단위

Cache-Control: no-cache => 데이터는 캐시해도 되지만, 항상 origin 서버에 검증하고 사용, (캐시가 유효해도 항상 검증)

Cache-Control: no-store => 데이터에 민감한 정보가 있으므로 저장하면 안됨 (메모리에 사용하고 최대한 빨리 삭제)

 

프록시캐시

클라이언트 - 원서버가 너무 멀 경우, 프록시 캐시 서버를 이용한다. 

첫번째 클라이언트가 프록시 캐시를 통해 원서버에게 요청하면, 프록시 캐시 서버에는 데이터가 쌓이고 이를 통해서 다음 클라이언트가 빠르게 접근할 수 있다.

 

클라이언트(private cache), 프록시 캐시 서버(public cache)

 

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

no-cache의 경우 원서버에 접근 불가능한 경우 오류보다는 오래된 데이터를 보여줄 수도 있음.

must-revalidate : 캐시 만료 후 최초 조회시 원 서버에 검증해야한다. (캐시 유효시간이라면 캐시를 사용함),

원서버에 접근이 불가능할 때  (504 Gateway Timeout을 뱉는다.)

 

Pragma: no-cache (HTTP 1.0 하위호환)

'CS' 카테고리의 다른 글

HTTPServletRequest, HTTPServletResponse  (0) 2024.06.11
HTTP 헤더 - 헤더1  (0) 2024.06.09
HTTP 상태코드  (0) 2024.06.09
URI와 웹 브라우저 요청 흐름, Stateful  (0) 2024.06.04
IP(인터넷 프로토콜), PORT, DNS  (0) 2024.06.03