배포하고, 사이트를 보고, 옛 버전을 봤습니다. 재배포. 여전히 옛날. 배포는 멀쩡했고 — 엣지가 저에게 거짓말하고 있었습니다.
무슨 일이었나
맨 URL이 Cloudflare 엣지 캐시에서 서빙되고 있었습니다 — 이전 버전의 캐시된 HTML. 배포는 오리진을 갱신했지만, 캐시된 엣지 사본에 닿는 방문자는 캐시 만료 전까지 옛 페이지를 계속 받았습니다.
헷갈리는 부분: 캐시버스터 쿼리(?v=1)를 붙이면 새 페이지가 즉시 나오는데 맨 URL은 stale 유지. 이 갈린 동작이 신호입니다 — 오리진은 갱신됐고, 엣지가 정본 URL의 옛 사본을 붙잡고 있는 것.
해결
엣지가 stale 문서를 붙잡지 않도록 HTML을 no-cache로 서빙:
# .htaccess (정적 호스트)
<FilesMatch "\.html$">
Header set Cache-Control "no-cache, must-revalidate"
</FilesMatch>이미 캐시된 건 퍼지(Cloudflare 대시보드). 엣지 캐시는 약 1시간 내 알아서 만료되지만, 퍼지나 no-cache 규칙이 즉시로 만듭니다.
디버깅 함정
Cloudflare 봇 차단이 curl과 헤드리스 Chrome을 막아, 평소의 "그냥 curl" 검증이 사이트가 아니라 챌린지 페이지를 반환했습니다. SSH로(오리진 파일 grep) 또는 실제 브라우저로 검증해야 했습니다. CDN이 오리진 앞에 있으면, CLI 체크가 콘텐츠가 아니라 CDN 챌린지와 대화 중일 수 있음을 기억하세요.
솔직한 부분
"재배포했는데 여전히 틀림"은 거의 항상 산출물이 문제가 아니라 — 나와 사용자 사이의 무언가가 문제라는 뜻입니다. 캐시·CDN·챌린지 페이지는 전부 자신 있게 틀린 답을 보여주며 실패합니다. 캐시버스터로 오리진과 엣지를 분리하고, 코드를 다시 만지기 전에 CDN이 가로채지 않는 경로로 검증하세요.