TL;DR

Một nguyên tắc cơ bản mà dev hay quên: API key, token, credential luôn phải lưu dạng mã hoá — kể cả app nội bộ hay project tạm. Trên Cloudflare, bạn có 2 lựa chọn: Worker secrets (gắn vào 1 Worker duy nhất, đơn giản, dùng từ 2020) và Secrets Store (beta từ 09/04/2025, account-level, share được giữa Workers và AI Gateway, có RBAC + audit log). Nếu bạn có cùng 1 key dùng ở nhiều Worker — Secrets Store là câu trả lời. Nếu chỉ 1 Worker cô lập — per-Worker secret vẫn OK.

Vấn đề: secret duplication trên Workers

Môi trường biến và secret của Cloudflare Workers ra đời năm 2020. Tính đến 2025, Cloudflare cho biết có hàng triệu local secret được deploy trên các script Workers — và rất nhiều trong số đó là giá trị trùng lặp. Ví dụ kinh điển: bạn dùng cùng 1 Stripe API key ở 10 Worker khác nhau, và vì mỗi secret chỉ truy cập được ở cấp từng Worker, bạn phải lưu 10 bản copy của cùng 1 giá trị.

Khi cần rotate key (xảy ra khá thường: nhân viên nghỉ, secret bị leak, compliance yêu cầu), bạn phải đi update 10 chỗ — thủ công, dễ sót, không có single source of truth. Thêm nữa: bất kỳ ai có quyền sửa Worker đều sửa được secret. Không có tách biệt giữa security admin và developer.

Secrets Store sinh ra để xử lý đúng vấn đề này.

Tại sao nên quan tâm

Đây không phải tính năng "nice to have". Nó trực tiếp sửa 3 rủi ro bảo mật thực tế:

  • Key duplication → tăng blast radius khi leak. 1 key lộ = 10 chỗ phải audit.
  • Over-permissioned access → dev frontend không cần biết giá trị Stripe secret key, nhưng per-Worker model cho phép họ đọc/xoá/sửa.
  • Rotation friction → khi việc rotate khó, dev sẽ né rotate. Key sống càng lâu, rủi ro càng lớn.

Với AI apps, vấn đề còn rõ hơn: nếu bạn route nhiều provider (OpenAI, Anthropic, Gemini) qua AI Gateway, mỗi key đi qua plain-text header trong mọi request. Secrets Store cho phép bạn chỉ pass một reference thay vì giá trị thật.

Technical facts

  • Launch: public beta 09/04/2025 (Developer Week 2025). Announce lần đầu từ 05/2023 — ship sau 2 năm.
  • Limit: 100 secrets/account (cả Free và Pay-as-you-go). Ban đầu chỉ 20, bump lên 100 vào 27/05/2025.
  • Encryption: two-level key hierarchy — Data Encryption Keys (DEK) mã hoá secret, Key Encryption Key (KEK) mã hoá DEK. Root key không bao giờ rời khỏi hệ thống an toàn. DEK refresh thường xuyên để giảm blast radius.
  • Propagation: Quicksilver — secret có mặt trên mọi server global ngay khi deploy.
  • Readable: sau khi tạo, giá trị không ai đọc được — kể cả dev, admin, nhân viên Cloudflare. Chỉ service được bind mới lấy ra ở runtime.
  • RBAC roles: Secrets Store Admin (full), Reporter (xem metadata), Deployer (bind vào Worker, không tạo/sửa được).
  • Wrangler: wrangler secrets-store store create|list, secrets-store secret create|duplicate|update|scope|delete. Local dev bỏ flag --remote.
  • Naming: tên secret không được chứa space.
  • Unavailable: Cloudflare China Network (JD Cloud partner region).

So sánh Worker secrets vs Secrets Store

Tiêu chíWorker secrets (wrangler secret put)Secrets Store (beta)
Scope1 WorkerAccount-level, scope được theo product
Access controlAi sửa được Worker = sửa được secretRBAC: Admin / Reporter / Deployer
ReuseDuplicate value qua N scriptTạo 1 lần, bind từ N Worker
RotationUpdate thủ công N chỗUpdate 1 lần, áp dụng everywhere
Audit logKhôngCó, ghi mọi thay đổi
AI Gateway BYOKKhông áp dụngCó — dùng reference ${secrets_store:key}
PricingFreeBeta, 100 secrets free (pricing GA chưa công bố)

Nói thẳng: nếu bạn có hơn 1 Worker hoặc dùng AI Gateway, Secrets Store là lựa chọn mặc định. Per-Worker secret chỉ hợp lý cho prototype cô lập hoặc secret thực sự chỉ dùng 1 lần 1 chỗ.

Use cases thực tế

  • Shared API tokens — Stripe, Supabase, Resend, PostHog, v.v. dùng chung ở API Worker + background job Worker + cron Worker.
  • Database credentials — connection string cho Neon/Turso/PlanetScale, rotate 1 lần là xong.
  • AI Gateway BYOK — thay vì gửi OpenAI key trong header mỗi request, pass reference: CF-AIG-Authorization: bearer ${secrets_store:openai_key}.
  • PKI root keys — trước đây dev thường nhét vào R2 + Worker code (awkward, rủi ro). Giờ có chỗ đúng để lưu.
  • Separation of duties — security admin quản secret, dev chỉ bind. Đúng chuẩn SOC2/ISO27001.

Limitations & pricing

Vì vẫn beta, có vài thứ chưa có:

  • Chỉ 2 integration: Workers và AI Gateway. Cloudflare Access, Transform Rules chưa support (đang trên roadmap).
  • Per-secret binding only: chưa bind được cả store vào 1 Worker — phải bind từng secret.
  • 1 store/account: chưa cho tạo nhiều store trong cùng account.
  • Local dev cô lập: không đọc được production secret từ local; phải recreate bằng Wrangler không có --remote.
  • KEK rotation chưa auto: DEK refresh tự động, nhưng KEK rotation và BYODEK đang trong roadmap.
  • Pricing GA: Cloudflare chưa công bố tier giá cuối. Hiện beta cho free 100 secrets.

What's next

Cloudflare đang đi về phía GA. Roadmap công bố:

  • Tích hợp Cloudflare Access (service token cho Zero Trust policies) và Transform Rules (header values).
  • Store-level binding — bind cả store vào Worker thay vì từng secret.
  • Multiple stores per account — tách theo team/môi trường.
  • Periodic KEK rotationBring Your Own DEK cho khách enterprise cần key của riêng họ.

Nếu bạn đang build trên Cloudflare Workers — đặc biệt có AI Gateway — hãy thử Secrets Store ngay trong beta. Và nhớ nguyên tắc đầu bài: không bao giờ lưu API key dạng plaintext, dù app chỉ là temp tool chạy nội bộ.

Nguồn: Cloudflare Blog — Secrets Store Beta, Cloudflare Docs, Secrets Store Changelog, @_ashleypeacock trên X.