[TIL] 250904_Network: HTTP 헤더 - 캐시와 조건부 요청(3)

지코·2025년 9월 4일
0

Today I Learned

목록 보기
94/94
post-thumbnail

✴️ 캐시와 조건부 요청 헤더

캐시 제어와 관련된 헤더들은 다음과 같이 세 가지 정도가 있다.

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

💰 Cache-Control

  1. max-age: 캐시 유효 시간을 의미하며, 초 단위로 입력한다.
  2. no-cache: 데이터는 캐시해도 되지만, 항상 원 서버에 데이터의 변경 여부를 검증하고 캐시를 사용한다.
    ➡️ 이때 검증 헤더를 사용한다.
  3. no-store: 데이터에 민감한 정보가 있으므로 저장하면 안된다. 메모리에서 사용하고 최대한 빨리 삭제한다.

💰 Pragma

  1. no-cache: 데이터는 캐시해도 되지만, 항상 원 서버에 데이터의 변경 여부를 검증하고 캐시를 사용한다.

Pragma의 no-cache 는 HTTP 1.0의 하위 호환을 위한 헤더이다. 따라서 현재는 잘 사용하지 않는다.

💰 Expires

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

Expires 는 캐시 만료일을 정확한 날짜로 지정하는 헤더다. HTTP 1.0 부터 사용 가능하며, 지금은 더 유연한 Cache-Control: max-age 를 권장한다. 이 헤더를 사용하면 Expires 는 무시된다.


✴️ 프록시 캐시

한국에 있는 클라이언트들이 미국에 있는 원 서버에 접근한다고 가정해보자. 물리적 거리가 길수록 원 서버를 통해 데이터를 얻는 시간은 증가할 것이다.

따라서 한국에 프록시 캐시 서버를 도입한다. 미국에 있는 원 서버에서 데이터를 받아와 미리 프록시 캐시 서버에 저장해두고, 한국 클라이언트들이 요청했을 때 원 서버에 접속하는 것보다 훨씬 더 빠른 시간으로 데이터를 응답해줄 수 있다.

프록시 캐시 서버가 가지고 있는 캐시를 public 캐시 라고 하고, 클라이언트들이 로컬에 가지고 있는 캐시를 private 캐시 라고 한다.

  1. Cache-Control: public: 응답이 public 캐시에 저장되어도 된다는 뜻.

  2. Cache-Control: private (default): 응답이 해당 사용자만을 위한 것이기 때문에, private 캐시에 저장해야 함.

  3. Cache-Control: s-maxage: 프록시 캐시에만 적용되는 max-age 설정.

  4. Age: 60 (HTTP 헤더): 원 서버에서 응답 후 프록시 캐시 내에 머문 시간(초)


✴️ 캐시 무효화

완벽한 캐시 무효화를 위해서는 아래 헤더들을 모두 사용해야 한다.

Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
  1. Cache-Control: no-cache: 데이터는 캐시해도 되지만, 항상 원 서버에 검증하고 사용한다. (이름에 주의!)

  2. Cache-Control: no-store: 데이터에 민감한 정보가 있으므로 저장하면 안된다. 메모리에서 사용하고 최대한 빨리 삭제한다.

  3. Cache-Control: must-revalidate

  • 캐시 만료 후 최초 조회 시 원 서버에 검증해야한다.
  • 원 서버 접근 실패 시 반드시 오류가 발생해야 한다 ➡️ 504(Gateway Timeout)
  • 캐시 유효 시간 이내라면 캐시를 사용한다.
  1. Pragma: no-cache: HTTP 1.0 하위 호환을 위한 헤더이다.

🤔 no-cache vs must-revalidate 비교하기

1️⃣ no-cache

no-cache 기본 로직은 이러하다.
웹 브라우저가 요청한 no-cache 설정을 보고 프록시 캐시 서버는 원 서버에게 요청을 전달한다. 원 서버는 검증 이후 데이터가 변경되지 않았다면 304 Not Modified 응답을 전달하고, 이를 받은 클라이언트는 브라우저 캐시에 저장되어 있던 캐시를 사용한다.

만약 프록시 캐시 서버와 원 서버 사이의 네트워크가 단절되어 원 서버에 접근이 불가한 상태가 된다면, no-cache 는 클라이언트에게 오류를 전달하는 것보다 오래된 데이터라도 전달하는 것이 낫다는 기반 하에 200 OK를 응답한다.

2️⃣ must-revalidate

같은 상황에서 must-revalidate 는 다른 결과를 제공한다. 원 서버에 접근할 수 없는 경우 항상 오류가 발생해야 하기 때문에, 504 Gateway Timeout을 응답한다.

Reference

🎥 모든 개발자를 위한 HTTP 웹 기본 지식

profile
꾸준함이 무기

0개의 댓글