- 분야: 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회 결과다.
| 대표 입력 | 이전 스냅샷 | 후속 스냅샷 |
|---|---|---|
/about | no-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, must-revalidate였다. 별도 홈 요청 3회의 TTFB는 3.770·1.866·0.057초로 분산됐다.