HTTP 웹 기본 - 08. HTTP 헤더 (캐시, 조건부 요청)
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
- 과정
- 서버 (검증 헤더)
- Last-Modified 헤더
- 해당 데이터가 마지막으로 수정된 시간을 표기하여 클라이언트로 전송
- 클라이언트 (조건부 요청)
- if-modified-since 헤더
- 요청 시 서버 측으로 클라이언트가 가지고 있는 캐시의 수정일을 전송
- 서버
- 304 Not Modified 코드 + HTTP Header 메타 정보만 클라이언트로 전송
- (HTTP Body 미포함)
- 클라이언트
- 응답 결과 재사용, 헤더 데이터 갱신
- 서버 (검증 헤더)
- 결과적으로 용량이 적은 헤더 정보만 다운로드 => 매우 실용적인 해결책
- 단점
- 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 하위 호환)
- 위 둘을 모두 다 적어주면 가능
댓글남기기