Cloudflare Workers Static Assets 운용 가이드 — 라우팅과 캐시를 안정적으로 잡는 방법

4 min read
Cloudflare WorkersStatic AssetsEdge배포
Cloudflare Workers Static Assets 운용 가이드 — 라우팅과 캐시를 안정적으로 잡는 방법

Cloudflare에서 정적 파일을 붙이는 방식은 이제 “파일 서빙” 문제가 아니라 라우팅 설계 문제다. 같은 Workers라도 assets 설정을 어떻게 하느냐에 따라 요청 흐름이 완전히 달라진다.


한 줄 결론부터

  • 정적 사이트 중심이면: 기본 자산 우선 라우팅이 가장 단순하다.
  • 인증/미들웨어가 있으면: run_worker_first가 필요하다.
  • SPA 라우팅이면: not_found_handling = "single-page-application"이 사실상 필수다.

왜 헷갈리기 쉬운가

Workers Static Assets는 설정이 짧아서 쉬워 보이지만, 실제로는 “자산이 먼저 응답할지, Worker가 먼저 실행될지”가 서비스 동작을 좌우한다.

[💡 잠깐! 이 용어는?] run_worker_first: 정적 파일 매칭 전에 Worker를 먼저 실행하는 옵션이다. 인증, 헤더 주입, A/B 라우팅 같은 미들웨어 성격 작업에 필요하다.


라우팅 옵션 비교

옵션동작 방식추천 상황
기본값자산 경로면 파일 우선 응답, 아니면 Worker 실행정적 콘텐츠 중심 사이트
single-page-application미매칭 경로를 index.html로 폴백SPA 라우터 사용
run_worker_firstWorker 선실행 후 자산/응답 결정인증, 사용자별 응답 분기

비유하면 기본값은 무인 키오스크고, run_worker_first는 입구에 안내 직원이 서 있는 구조다.


실무 설정 예시

wrangler.toml
name = "my-app"
main = "src/index.ts"
compatibility_date = "2026-02-20"
 
[assets]
directory = "./dist"
not_found_handling = "single-page-application"
run_worker_first = true

이 조합은 “SPA + 인증 미들웨어” 조합에서 자주 쓰인다.


자주 터지는 문제와 해결

1) 로그인 페이지가 정적 파일로만 내려오는 문제

원인: 기본 자산 우선 라우팅이라 Worker 인증 로직이 실행되지 않음. 해결: run_worker_first = true 또는 경로별 선실행 규칙 적용.

2) SPA 새로고침 404

원인: /dashboard/settings 같은 경로가 실제 파일이 아니라서 매칭 실패. 해결: not_found_handling = "single-page-application"로 폴백 설정.

3) 캐시가 너무 오래 남는 문제

원인: 정적 자산 캐시 정책과 API 응답 캐시를 같은 기준으로 처리. 해결: 해시된 자산(app.abc123.js)은 장기 캐시, HTML/API는 짧은 캐시로 분리.


운영 체크리스트

  • 자산 우선/Worker 우선 정책을 문서화했나
  • SPA 폴백 경로를 명시했나
  • 인증이 필요한 경로에서 Worker 선실행이 보장되나
  • 자산 캐시와 API 캐시를 분리했나

이 네 가지를 먼저 정리하면 배포 후 장애 대부분을 줄일 수 있다.


마무리

Workers Static Assets는 “정적 파일 편의 기능”이 아니라 엣지 라우팅 전략의 일부다. 설정 몇 줄이지만, 순서 하나 잘못 잡으면 인증 누락/404/캐시 꼬임이 같이 터진다. 먼저 요청 흐름을 설계하고 설정을 붙이는 순서가 안전하다.


참고:

관심 있을 만한 포스트

Vinext — Vite 위에서 Next.js를 1주일 만에 다시 만든 이야기

Cloudflare가 AI와 함께 단 일주일, $1,100의 API 비용으로 Next.js 호환 프레임워크를 Vite 위에 구축한 과정.

VinextNext.js

Next.js 블로그 만들기 — GitHub Pages에서 Cloudflare Pages로 이전하기

GitHub Pages의 한계를 넘어 Cloudflare Pages로 블로그를 이전한 과정. 비교, 설정, SEO까지 한 번에 정리.

Cloudflare배포

AI 코딩의 맹점 — Artifacts 없이 에이전트는 기억을 잃는다

PRD, ADR, TDD가 AI 코딩 워크플로우에서 왜 선택이 아닌 필수인지, 실전 구조와 함께 살펴본다.

AI 코딩Artifacts

Next-Translate 3.0 — Turbopack과 App Router를 위한 i18n 재건

1년간 공백 후 돌아온 Next-Translate 3.0이 Turbopack 지원, 비동기 params, App Router 안정화를 한 번에 처리하는 방법.

Next.jsi18n

V8 WasmGC 투기적 최적화 — 가상 메서드를 인라인으로 만드는 법

V8이 WasmGC의 가상 메서드 디스패치에 투기적 인라이닝을 도입해 Dart와 Java 앱에서 최대 8% 성능을 끌어낸 방법.

V8WebAssembly

Tsonic — TypeScript를 네이티브 바이너리로 컴파일하는 실험

TypeScript → C# → NativeAOT 파이프라인으로 네이티브 실행 파일을 만드는 Tsonic. 어떻게 동작하고, 어떤 한계가 있는지 살펴봤다.

TypeScriptNativeAOT

VS Code 팀의 AI 에이전트 병렬화 — 월간 릴리스를 주간으로 만든 워크플로우

VS Code 팀이 월간 릴리스에서 주간 릴리스로 전환한 비결. 에이전트 세션 병렬화, 자동화 파이프라인, 품질 게이트 설계 전반을 공개했다.

VS CodeAI

React Compiler의 한계 — 뭘 최적화하고 뭘 못 하는가

React Compiler가 자동 메모이제이션으로 해결하는 것과 해결하지 못하는 것. 컴파일러 기반 UI 프레임워크의 능력 경계를 정리했다.

ReactReact Compiler