공개 HTML에도 no-store가 적용되는 원인

이 글의 목차 4개 항목
  • 분야: BE
  • 기술 스택: TypeScript · HTTP · Cloudflare Workers

문제와 원인

공통 proxy는 소개·개인정보·가이드 같은 공개 페이지를 포함한 모든 HTML 요청에 no-cache, no-store, must-revalidate를 적용한다. 공개 정보 HTML과 로그인·개인 응답을 구분하는 조건이 없어 공개 HTML의 저장과 재사용도 막힌다. 후속 코드에서도 공개 페이지와 개인 페이지가 같은 분기를 사용한다.

현재 코드

proxy.ts — applySecurityHeaders

if (htmlDocumentRequest) {
  response.headers.set("Cross-Origin-Opener-Policy", "same-origin");
  response.headers.set(
    "Cache-Control",
    "no-cache, no-store, must-revalidate",
  );
}

no-store가 포함된 응답은 저장할 수 없다. 홈은 서버에서 Cookie를 읽고 proxy는 요청마다 CSP nonce를 생성해 사용자별 본문과 nonce가 응답에 포함된다.

진단 결과

Node에서 원본 전후 스냅샷의 applySecurityHeaders를 추출해 HTTPS canonical·HTML 조건의 합성 Response를 경로 대표 입력마다 1회 전달했다. 함수의 인수에 pathname이 없어 아래 네 입력은 동일한 HTML 분기를 실행한 총 8회 결과다.

대표 입력이전 스냅샷후속 스냅샷
/aboutno-cache, no-store, must-revalidate같은 정책
/privacy같은 정책같은 정책
/guides같은 정책같은 정책
/guides/sqld같은 정책같은 정책
no-store 적용 횟수4/4회4/4회

Swagger UI, 1280×720 CSS px, DPR 2에서 로컬 서버가 각 스냅샷의 함수를 새 합성 HTML Response에 적용한 /about 대표 입력을 각각 1회 요청했다. 두 응답은 HTTP 200을 반환했다. 이전 HTML helper의 응답 헤더에는 no-cache, no-store, must-revalidate가 있었다.

이전 HTML helper의 no-store 캐시 정책원본 보기 (새 창)

이전 HTML helper의 no-store 캐시 정책

100%원본 보기 (새 창)

확대한 이미지는 상하좌우로 이동할 수 있습니다. 키보드는 이미지 영역에 초점을 두고 방향키를 사용하세요. Esc로 닫습니다.

후속 HTML helper도 같은 캐시 정책을 반환했다.

후속 HTML helper의 같은 no-store 캐시 정책원본 보기 (새 창)

후속 HTML helper의 같은 no-store 캐시 정책

100%원본 보기 (새 창)

확대한 이미지는 상하좌우로 이동할 수 있습니다. 키보드는 이미지 영역에 초점을 두고 방향키를 사용하세요. Esc로 닫습니다.

기존 운영 헤더 기록의 공개 페이지 값은 no-store, must-revalidate였다. 별도 홈 요청 3회의 TTFB는 3.770·1.866·0.057초로 분산됐다.