Vary
Vary 는 캐시에게 같은 주소라도 요청에 따라 응답을 갈라 저장하라고 알리는 헤더입니다. 서버는 응답을 만들 때 참고한 요청 헤더의 이름을 이 필드에 적어 보냅니다. 캐시는 그 이름이 가리키는 값까지 함께 봐야 어떤 응답을 내줄지 판단할 수 있습니다.
쉽고 빠른 이해
Vary 는 캐시에게 「이 응답은 요청의 이런 헤더를 보고 갈렸다」고 알리는 값입니다. 언어별로
다른 페이지를 주는 서버라면 Vary: Accept-Language 를 붙입니다. 언제나 같은 응답을
낸다면 붙이지 않습니다.
이게 없으면 캐시는 같은 주소로 들어온 요청을 전부 같은 것으로 봅니다. 한 사용자에게 내준 한국어 응답을 다른 사용자의 영어 요청에도 그대로 돌려줄 수 있습니다.
캐시는 이렇게 판단합니다.
- 저장된 응답에 Vary 가 있는지 봅니다
- 있으면 거기 적힌 헤더 값이 새 요청과 같은지 비교합니다
- 값이 같으면 그대로 내주고, 다르면 서버에 다시 확인하거나 새로 받습니다
대가는 저장 공간입니다. 같은 주소라도 헤더 값 조합마다 따로 저장해야 해서 캐시 적중률이 낮아질 수 있습니다.
상세
Vary 는 HTTP(HyperText Transfer Protocol, 하이퍼텍스트 전송 프로토콜)의 콘텐츠 협상 필드 중 하나입니다. 콘텐츠 협상은 같은 주소를 두고 서버와 클라이언트가 언어나 형식 같은 표현을 고르는 절차입니다. Vary 는 그 협상에서 서버가 실제로 무엇을 보고 골랐는지를 응답에 남깁니다. 이 규칙은 RFC 9110(Request for Comments, 요청을 위한 설명서)에 있습니다.
서버는 요청에 따라 실제로 다른 응답을 만들었을 때만 이 헤더를 붙입니다. 언제나 같은 응답을 낸다면 붙일 이유가 없습니다.
값의 생김새는 둘 중 하나입니다. 헤더 이름을 쉼표로 이은 목록이거나, 별표 하나입니다.
Vary: Accept-Language
Vary: Accept-Language, Accept-Encoding
Vary: *
첫 줄은 언어에 따라 응답이 갈렸다는 뜻입니다. 둘째 줄은 언어와 인코딩 둘 다가 응답을 갈랐다는 뜻입니다. 별표는 뒤에서 따로 다룹니다.
캐시가 저장한 응답을 다시 쓰는 조건
캐시는 저장된 응답에 Vary 가 있으면 그 헤더가 지목한 요청 헤더 값을 새 요청과 비교합니다. 값이 전부 같을 때만 재검증(서버에 그 응답이 아직 맞는지 다시 확인받는 절차입니다) 없이 그대로 쓸 수 있습니다. 하나라도 다르면 캐시는 그 응답을 그대로 쓰지 못하고 서버에 다시 확인하거나 새로 받습니다.
값을 견주는 기준은 문자열이 완전히 같은지가 아닙니다. 같은 헤더가 여러 줄로 나뉘어 왔으면 합쳐서 봅니다. 대소문자처럼 뜻이 안 바뀌는 차이도 같은 값으로 봅니다. 한쪽 요청에 그 헤더 자체가 없으면, 다른 쪽 요청에도 없을 때만 같다고 봅니다.
flowchart TD
A["저장된 응답에 Vary 가 있나"] -->|없다| S["그대로 재사용한다"]
A -->|있다| B["지목된 헤더 값이<br/>새 요청과 전부 같나"]
B -->|같다| S
B -->|다르다| R["다시 확인하거나 새로 받는다"]
값이 별표 하나면 상황이 다릅니다. 별표가 들어간 응답은 항상 일치에 실패해 캐시가 그 응답을 다시 쓸 방법이 없습니다. 서버가 특정 요청 헤더 하나로는 설명할 수 없는 이유로 응답을 갈랐을 때 이 값을 씁니다.
캐시 키가 늘어나는 예
같은 주소라도 Vary 가 지목한 헤더 값이 다르면 캐시는 따로 저장합니다. 캐시가 저장 위치를 가르는 기준을 캐시 키라고 부릅니다. Vary 가 지목한 값은 그 키의 두 번째 조각이 되는 셈입니다.
| 주소 | Accept-Language | 캐시가 저장하는 것 |
|---|---|---|
| /index.html | ko | 한국어 응답 |
| /index.html | en | 영어 응답(별도) |
주소는 같지만 언어 값이 달라 두 응답이 따로 저장됩니다. 이 값을 안 가르면 캐시는 먼저 저장된 쪽을 계속 내줍니다. 나중 요청의 언어와 안 맞을 수 있습니다.
지목하는 헤더가 늘수록 저장해야 할 조합도 늘어납니다. 그만큼 캐시 적중률은 떨어집니다. 별표를 쓴 응답은 이 조합을 아예 셀 수 없는 극단적인 경우입니다.
관련 항목
이 필드를 정의하고 캐시 규칙을 붙인 표준 문서
RFC 9110 · RFC 9111 · RFC 7231 · RFC 7234
이 필드와 함께 콘텐츠 협상을 이루는 요청 헤더
Accept · Accept-Language · Accept-Encoding
이 필드가 관여하는 캐시 개념
이 필드를 해석하는 캐시
이것이 속하는 상위 분류
다른 이름: Vary 헤더 · Vary 필드