본문 바로가기
네트워크/HTTP 기초

HTTP 헤더 - 캐시와 조건부 요청

by Programmer.Junny 2024. 12. 19.

캐시

캐시란 자주 사용될 것 같은 데이터나 결과물을 더 빠르게 제공하기 위해서 원본 저장소(서버)보다 접근 속도가 더 빠른 저장소(메모리, 디스크 등)에 보관하는 메커니즘이다.

만약 헤더가 0.1MB, 바디가 1MB 라고 한다면 위의 경우 첫 응답에는 1.1MB의 리소스를 다운받게 된다.

그리고 이를 캐시에 저장한다.

두 번째 요청에서는 먼저 캐시 유효 시간 등을 검증한 후 이에 부합되면 캐시에서 리소스를 가져온다.

이후 캐시 시간이 초과되면 다시 서버로부터 리소스를 응답받은 후 응답 결과를 다시 캐시에 저장한다.

검증 헤더와 조건부 요청 1

만약 캐시 시간이 초과되어 다시 데이터를 받을 때, 서버에 있는 데이터와 캐시에 저장되어있는 데이터가 동일하다면(변경되지 않았다면) 캐시에 있는 데이터를 사용해도 되지 않을까?
이러한 부분을 해소할 수 있는 것이 검증 헤더와 조건부 요청이다.

만약 캐시시간이 초과되었으나 서버와 캐시의 데이터가 동일하다면?
데이터가 마지막에 수정된 시간을 응답 패킷 헤더로 내려준다.
서버에서 응답결과로 'Last-Modified' 를 내려주면 이 날짜(UTC)를 캐시에 저장하도록 한다.
캐시 시간이 초과되었다면 클라이언트에서는 캐시에 저장된 Last-Modified 값을 확인 후 가져온다.

 

요청 패킷에 'if-modified-since'를 추가하여 요청한다.
서버에서는 데이터가 변경되지 않았다는 것을 알 수 있다.
304(페이지 리다이렉션)을 HTTP Body없이 헤더만을 전송한다.
304를 받은 클라이언트는 캐시에서 데이터를 사용한다.

검증 헤더와 조건부 요청 2

기존 Last-Modified 검증 헤더와 If-Modified-Since 조건부요청은 위와 같은 단점을 가지고 있다.
예를 들어 A 데이터를 수정하여 B로 갱신하였지만 다시 A로 변경된 경우가 있다면 결과적으로 A - A 두 가지의 데이터는 동일하다. 이러한 경우 같은 데이터임에도 네트워크 통신이 이루어지게 된다.

ETag는 해시나 버전 정보에 기반하여 리소스의 변경 유무를 추적한다. 즉 리소스가 변경되면 해시 정보의 값이 변경되고, 동일한 리소스라면 해시 정보의 값이 동일할 것이다.

Last-Modified 와 차이점은 크게 없다. 정리하면 아래와 같다.


캐시와 조건부 요청 헤더

캐시 제어 헤더란 캐시를 사용하기 위한 조건(제어)을 걸 수 있는 헤더를 의미한다. 현재는 Cache-Control을 주로 사용한다.

  • Cache-Control: 캐시 제어
  • Pragma: 캐시 제어(하위 호환)
  • Expires: 캐시 유효 기간(하위 호환)


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

위에서 'Last-Modified' 와 'ETag' 는 검증 헤더에 속하며, 이에 맞춰 'If-Modified-Since', 'If-None-Match' 등이 조건부 요청 헤더에 속한다.

프록시 캐시

미국에 있는 원(Origin) 서버에서 리소스를 응답받는데 500ms가 걸리는 것을 최적화 하기 위한 방법은 뭘까?

프록시 캐시 서버는 쉽게 생각하면 경유지라고 생각하면 되겠다.


캐시 무효화

위와 같은 캐시 지시어를 전부 포함하여야 한다.
no-cache와 must-revalidate 차이점은 아래와 같다.
no-cache 는 프록시 캐시 서버와 원 서버와의 네트워크 단절 시 프록시 캐시 서버 자체에서 200 OK를 내려준다.
must-revalidate는 마찬가지로 프록시와 원 서버 네트워크 단절 시 504 Gateway Timeout 을 내려준다.

이로써 김영한님의 HTTP 웹 기초 강의는 수료하였다. 솔직히 크게 어려운 부분이 없었던 이유는 실무에서 RPC를 구축하고 서버와 통신을 하면 위와 같은 것을 많이 접하기 때문이다.
다만 개념적인 부분이 약했는데, 이번 기회를 통해 좀 더 확실히 알게된 부분들이 많았다.
그리고 특히 이번 캐시에 대한 부분은 내가 기존에 포스팅한 S3에서 클라이언트 JSON 다운로드하는 부분에서 정말 고민해서 구축한 부분이 ETag 였는데 이렇게 HTTP 강의에서 보게되니 반갑기도 했다.
아무튼 이렇게 정리할 수 있고 기초를 익히게 도와주신 김영한님에게 무한한 감사를 드리며 여기서 마친다.

해당 내용은 김영한님의 HTTP 웹 기초 강의(인프런)의 자료와 내용을 사용하였습니다.

'네트워크 > HTTP 기초' 카테고리의 다른 글

HTTP 헤더 - 일반 헤더  (1) 2024.12.18
HTTP 상태코드  (0) 2024.12.16
HTTP 메서드 활용  (1) 2024.12.15
HTTP 메서드  (1) 2024.12.13
HTTP 특징  (1) 2024.12.13

최근댓글

최근글

skin by © 2024 ttuttak