HTTP 헤더 (캐시, 조건부 요청)

캐시

  • 주어진 리소스의 복사본을 저장하고 있다가 요청 시에 그것을 제공하는 기술
  • 웹 캐시가 자신의 저장소 내에 요청된 리소스를 가지고 있다면, 요청을 가로채 원래의 서버로부터 리소스를 다시 다운로드하는 대신 리소스의 복사본을 반환
  • 참고 문헌

  • 캐시가 없는 경우
    • 데이터가 변경되지 않아도 계속 네트워크를 통해 데이터를 다운로드 받아야 함
    • 네트워크는 느리고 비쌈 => 브라우저 로딩 속도 저하 => 사용자 경험 저하
  • 캐시 적용 헤더
    • cache-control : 캐시가 유효한 시간을 적용
  • 캐시 시간 초과
    • 서버를 통해 데이터를 재조회하고 캐시를 갱신 => 다운로드 재발생

만약 데이터가 변경되지 않았어도 굳이 데이터를 재다운로드를 해야할까?

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

  • 검증 헤더
    • 캐시 만료 후, ‘서버 측에서 데이터 변경이 일어나지 않았다’ 라는 사실을 확인하는 헤더
    • Last-Modified, ETag
    • 확인이 되면 저장해 두었던 캐시를 재사용
  • 조건부 요청 헤더
    • 검증 헤더로 조건에 따른 분기
    • if-modified-since : Last-Modified
    • if-none-match : ETag
    • 조건이 만족하면 200 OK 아니면 304 Not Modified

01. Last-Modified + if-modified-since

  • 과정
    1. 서버 (검증 헤더)
      • Last-Modified 헤더
      • 해당 데이터가 마지막으로 수정된 시간을 표기하여 클라이언트로 전송
    2. 클라이언트 (조건부 요청)
      • if-modified-since 헤더
      • 요청 시 서버 측으로 클라이언트가 가지고 있는 캐시의 수정일을 전송
    3. 서버
      • 304 Not Modified 코드 + HTTP Header 메타 정보만 클라이언트로 전송
      • (HTTP Body 미포함)
    4. 클라이언트
      • 응답 결과 재사용, 헤더 데이터 갱신
  • 결과적으로 용량이 적은 헤더 정보만 다운로드 => 매우 실용적인 해결책
  • 단점
    • 1초 미만 단위로 캐시 조정 불가능
    • 날짜 기반의 로직 사용
    • A -> B -> A의 순서처럼 원본 데이터로 재수정하는 경우 날짜는 변경
      • 날짜가 변경됐으니까 원본과 다르다고 판단
    • 서버에서 별도의 캐시 로직을 관리하지 못함

02. ETag + if-none-match

  • ETag (Entity Tag)
    • 캐시용 데이터에 임의의 고유한 버전 이름을 달아둠
    • 데이터가 변경되면 이 이름을 바꾸어서 변경 (Hash 다시 생성)
    • 단순하게 ETag만 보내서 같으면 유지, 다르면 재다운로드
  • 캐시 제어 로직을 서버에서 완전히 관리
  • 클라이언트는 값을 단순히 서버에 제공할 뿐 (캐시 메커니즘을 모름)
  • 과정은 Last-Modified + if-modified-since 동일

캐시 제어 헤더

  • Cache-Control
    • 캐시 제어
    • max-age : 캐시 유효 시간 (초 단위)
    • no-cache : 데이터는 캐시해도 되지만, 항상 origin 서버에 검증하고 사용해라
    • no-store : 민감한 정보가 있는 경우 저장하지 마라
    • must-revalidate : 캐시 만료 후 최초 조회시 origin 서버에서 검증
      • origin 서버 접근 실패시 504 Gateway Timeout 오류 반드시 발생
      • 캐시 유효 시간이라면 캐시를 그냥 사용
    • public : 응답이 public 캐시(프록시 캐시)에 저장되어도 됨
    • private : 응답이 private 캐시에 저장 (응답 자체가 사용자만을 위한 것, default)
    • s-maxage : 프록시 캐시에만 적용되는 max-age (중요 X)
    • Age (HTTP 헤더) : 오리진 서버에서 응답 후 프록시 캐시 내에 머문 초 (중요 X)
  • Pragma
    • 캐시 제어 (HTTP 1.0 하위 호환)
    • no-cache
  • Expires
    • 캐시 유효 기간 (하위 호환)
    • 만료일을 정확한 날짜로 지정 (초 단위 X)
    • Cache-Control의 max-age가 더 권장됨 => 동시 사용 시 Expires 무시

프록시 캐시 (프록시 서버)


ORIGIN 서버와 클라이언트 사이에 있는 중계기로, 클라이언트와 지리적으로 가까운 곳에 위치한 서버
빠른 응답시간을 보장하고, 웹 트래픽을 줄이고 병목 현상을 방지할 수 있음

위키피디아 참고

캐시 무효화

  • 캐시를 적용하지 않아도 웹 브라우저가 멋대로 캐시를 적용하는 경우가 있기에 이를 방지하자
  • Cache-Control: no-cache, no-store, must-reavlidate
  • Pragma: no-cache (HTTP 1.0 하위 호환)
  • 위 둘을 모두 다 적어주면 가능



인프런 - 김영한님의 모든 개발자를 위한 HTTP 웹 기본 지식을 정리한 내용입니다.


김영한님 인프런 강의

댓글남기기