이전의 재검증 주기는 브라우저가 서버에서 준 정보로 캐시 사용 여부를 판단하는 것과 달리,
재검증 기준은 서버가 판단한다.
처음의 요청에 대해 서버가 재검증 기준의 헤더를 브라우저에게 보내고,
브라우저는 이 헤더의 내용들을 그대로 서버에게 보내서 판단한 후
사용하라 / 마라를 HTTP 응답 코드와 함께 반환한다.
다음은 첫 요청 이후 서버가 브라우저에게 보내는 재검증 기준 헤더이다.
Last-Modifed 헤더
- 데이터가 바뀐 시점을 서버가 클라이언트에게 이 헤더를 통해서 보낸다
ETag 헤더
- Entity Tag 의 줄임말.
- Hash-based를 가장 많이 쓴다.
- 데이터의 고윳값을 의미한다. 가령 데이터가 한 글자라도 바뀌면 고윳값이 달라진다.
위에 소개한 재검증 기준 헤더는 서버가 브라우저로 보내는 헤더들이다.
조건부 요청이란?
이전에 서술했던 Cache-Control 헤더에서의 max-age와 같은 재검증 주기가 만료되거나
이 글에서 서술한 Last-Modified 헤더와 ETag 재검증 기준 헤더를 브라우저가 받는 경우가 생긴다.
브라우저는 "이 캐시를 사용해도 되는지?" 라는 요청을 하게 된다. 이러한 요청을 조건부 요청이라고 한다.
서버측에서 보내준 헤더를 기반으로 요청 헤더에 각기 다른 방식으로 캐시 사용 여부를 서버에게 확인한다.
참고로 캐시뿐만이 아니라 CORS 관련해서도 조건부 요청을 사용하게 된다.
재검증 기준 헤더를 통한 브라우저의 조건부 요청과,
조건부 요청에 대해 서버의 반환은 다음과 같다.
Last-Modifed 헤더에 대한 브라우저의 요청 헤더
- If-Modified-Since :
- Last-Modified에서 준 시간을 기준으로 바뀌었는지를 물어보는 헤더이다.
- 보통 GET, HEAD와 같이 단순 조회를 위한 요청
- 이에 대한 서버의 답변은 다음과 같다.
- Yes ; 200 Resource Cache : 새로운 응답과 새로운 캐시를 준다.
- No ; 304 Not Changed : 안바뀌었으니 캐시를 계속 쓰게 한다.
- If-Unmodified-Since :
- Last-Modified에서 준 시간을 기준으로 안바뀌었는지를 물어보는 헤더이다.
- POST, PUT, DELETE와 같이 서버의 상태를 변경하는 non-safe 요청을 사용할 때 쓴다.
- Yes ; 200, 204(No Content) : 브라우저와 서버 사이의 데이터가 일치해서 정상적으로 요청 수행완료했음. 200의 경우 새 데이터와 캐시를 준다. 204면 내용을 바꾸고 굳이 이를 보여주지 않는 경우
- No ; 412 Precondition Failed : 현재 요청을 진행하려는데 브라우저와 서버 사이의 데이터가 다름. 이 상태에서는 변경요청 수행하지 못함.
ETag 헤더에 대한 브라우저의 요청 헤더
- If-None-Match:
- ETag에서 준 값을 기준으로 안바뀌었는지 확인해보라는 헤더이다.
- 보통 GET, HEAD와 같이 단순 조회를 위한 요청
- 이에 대한 서버의 답변은 다음과 같다.
- Yes ; 200 Resource Cache : 같으니 새로운 응답과 새로운 캐시를 준다.
- No ; 304 Not Changed : 맞지 않으니 캐시를 계속 쓰게 한다.
- If-Match:
- ETag에서 준 값을 기준으로 바뀌었는지 확인해보라는 헤더이다.
- POST, PUT, DELETE와 같이 서버의 상태를 변경하는 non-safe 요청을 사용할 때 쓴다.
- 이에 대한 서버의 답변은 다음과 같다.
- Yes ; 200, 204(No Content) : 브라우저와 서버 사이의 데이터가 일치해서 정상적으로 요청 수행완료했음. 200의 경우 새 데이터와 캐시를 준다. 204면 내용을 바꾸고 굳이 이를 보여주지 않는 경우
- No ; 412 Precondition Failed : 현재 요청을 진행하려는데 브라우저와 서버 사이의 데이터가 다름. 이 상태에서는 변경 요청 수행하지 못함.
위에 소개한 재검증 기준 헤더는 서버가 브라우저로 보내는 헤더들이다.
정리하자면 HTTP Cache의 동작원리는
서버가 브라우저측에 재검증 주기와 기준을 제시한다.
이에 브라우저는 재검증 주기와 기준을 기반으로 한 조건부 요청을 날리고
그에 대한 서버의 응답 반환을 통해서 이루어지는 것이다.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Conditional_requests
https://datatracker.ietf.org/doc/html/rfc7232#section-4.1
'정보 > WEB' 카테고리의 다른 글
Cookie를 보완하는 Storage, Session (0) | 2024.09.10 |
---|---|
Cookie 개요, 브라우저에서 쿠키의 작동 (1) | 2024.09.03 |
Proxy Server (1) | 2024.08.30 |
HTTP Cache 동작 원리와 Cache-control 헤더 (1) | 2024.08.28 |
HTTP Cache 역할, 종류 (0) | 2024.08.28 |