Better Authの移行まで考慮したCloudflare Workersハッシュテンプレート
(github.com/imjlk)Cloudflare PagesでBetter Authを組み込んでみたところ、CPU time limitエラーが継続的に発生しました。そこでCodexと一緒に作ってみました。
Cloudflareでは、Worker同士が公開URLなしでService BindingとWorkerEntrypoint RPCを使って直接通信できるようになっているため、内部インフラ的な性格の機能はこちらのほうが自然だと考えました。そこでBetter Authのような認証ロジックで使えるprivate password hasher Workerテンプレートを考えてみました。
構成はシンプルです。authを担当するcaller Workerがprivate service bindingでhasher Workerを接続し、実際のハッシュ化と検証はhashPassword() / verifyPassword()のようなRPCメソッド経由でのみ呼び出します。public HTTPはGET /のmetadata/health程度だけを最小限に置き、パスワードハッシュ処理自体は外部endpointとして公開しないことを基本前提にしました。つまり、「ハッシュAPIを公開する」というより、「password hashingをCloudflare内部のWorkerコンポーネントとして分離する」という考え方に近いです。
実装はTypeScript Worker shellの上にRust/Wasm kernelを載せる形にし(全面Rustとの比較のために簡単なベンチマークテストを行ったうえで決定)、ハッシュアルゴリズムはArgon2idを基準にしました。このテンプレートのポイントはArgon2id自体を紹介することではなく、Cloudflare Workersの中でpassword hashingをどの境界で分離して運用するかにあります。アプリWorkerは認証フローとセッション管理に集中し、ハッシュ化/検証は別のhasher Workerが担当する形です。
Better Authと一緒に使う流れもあわせて考慮しました。Better Authはデフォルトでscryptを使用しますが、password hash/verifyをカスタマイズできるため、caller Workerからhasher Workerを呼び出す形で接続できます。また、既存アカウントがlegacy scrypt形式を使っていたとしても、ログイン時に検証したあとverifyAndMaybeRehash()で新しいArgon2idハッシュへ段階的に移行する流れを想定しました。つまり、既存ユーザーのパスワードを一度にすべて変更させるのではなく、実際のログイントラフィックに合わせて少しずつstronger presetへ移していく移行パスを念頭に置いて作っています。
運用面では、Cloudflare FreeとPaidを同じ基準では見られない点も反映しました。FreeではCPU上限が小さいため、Argon2idの基本構成をそのまま使うのは厳しい場合があり、standard-2026q1とは別にfree-tier-fallback-2026q1のようなpresetを置く構成を考えました。ただしfallback presetはあくまでプラットフォーム制約を考慮した運用上の妥協案であり、セキュリティ基準線として紹介したい値ではありません。Freeから始める場合でも、その後Paidへ上げながらよりstrongerなArgon2id presetへ再ハッシュを進められるよう、ドキュメントと例にはgradual migrationの流れも含めてあります。
まとめると、このテンプレートは「Cloudflare Workersでパスワードハッシュをどう計算するか」よりも、「Cloudflare Workersでpassword hashingをどの境界で分離して運用するか」に近いリポジトリです。Better AuthをWorkersで動かしながらハッシュ処理部分の負荷を分離してみたい場合、public hash endpointを開きたくない場合、legacy scryptアカウントを段階的にArgon2idへ移行したい場合の出発点になればと思います。
repo: https://github.com/imjlk/cloudflare-auth-hasher-template
benchmark: https://github.com/imjlk/cloudflare-auth-hasher-template/tree/codex/benchmark-workspace
deploy: [Deploy to Cloudflareリンク] (Cloudflareアカウントにログイン後、そのままデプロイを試せます。)
まだコメントはありません。