클라우드플레어, HTTP Vary 헤더 캐싱 지원 시작
원제 We just shipped support for the ugliest part of HTTP: Vary
112 포인트댓글 26

Key Point
같은 URL에서 언어나 형식이 다른 여러 응답을 캐싱할 때 효율성을 잃던 문제를 해결하는 방식이 나왔으므로, CDN을 쓰는 개발자와 운영자에게 캐시 전략을 재검토할 기회를 제공한다.
핵심 요약
- HTTP의 Vary 응답 헤더는 캐시에 요청의 어떤 필드가 응답에 영향을 미치는지 알려주지만, 어떤 차이가 실제로 중요한지는 알려주지 않는 것이 문제다.
- 같은 URL이 서로 다른 이미지 형식이나 언어로 여러 응답을 가질 수 있을 때, 캐시가 Vary를 무시하면 잘못된 응답을 전달하고, 모든 값을 구별하면 캐시 항목이 수천 개로 증가해 재사용성이 떨어진다.
- 원점 서버가 영어, 프랑스어, 독일어 3가지만 지원해도 클라이언트의 Accept-Language 값이 다르면 캐시는 같은 응답을 별개 항목으로 저장하고, 수십 개 필드에서 변동하면 1000개 이상의 조합이 생겨 캐시 효율이 급락한다.
- 클라우드플레어는 Cache Rules에서 Vary 지원을 추가해 세 가지 처리 방식을 제공한다: normalize는 Accept, Accept-Language, Accept-Encoding을 표준화해 동등한 요청이 같은 캐시를 공유하도록 하고, passthrough는 정확한 값 변동이 필요할 때 원본 바이트를 유지하며, bypass는 Cookie나 User-Agent처럼 개인화되거나 무한대 값을 가진 헤더를 캐시하지 않는다.
- normalize 방식은 값을 소문자로 통일하고 품질 값으로 정렬해 클라이언트의 순서 차이를 제거하며, Accept-Language에서 en-US는 en으로 축약된다 (설정된 경우 제외).
- 요청 처리 과정에서 Cache Rule은 원점 서버에 정규화된 값을 전달해 원점의 선택이 캐시 매칭과 일치하도록 보장하며, 응답에 Vary가 없으면 정상 캐싱하고, 일부 헤더가 bypass 설정이면 저장하지 않는다.
- Vary: *는 요청의 모든 측면(IP 주소 포함)이 응답에 영향을 미칠 수 있다는 뜻이므로 항상 캐시를 우회한다.
- 원점 서버는 캐시 가능한 모든 응답에서 일관되게 적절한 Vary 헤더를 반환해야 하며, 하나의 응답이 Vary를 생략하면 클라우드플레어가 변동성 없이 캐시해 잘못된 응답을 전달할 수 있다.
- 같은 리소스의 캐시 설정을 변경해도 기존 콘텐츠는 자동으로 지워지지 않으며, 새 정책으로 요청이 누락되면서 새 키로 다시 채워진다.
- Vary in Cache Rules은 모든 요금 계획(무료, Pro, Business, Enterprise)에서 대시보드, Rulesets API, Terraform을 통해 즉시 사용 가능하다.
- 클라우드플레어는 향후 Availability Hints 초안의 아이디어를 평가 중이며, 이를 통해 원점 서버가 지원하는 표현을 직접 명시해 수동 설정 작업을 줄일 계획이다.