
🔐 認証を正しく構築しながら学べる。Hono、Turso、PBKDF2、JWTデュアルトークンセッションを備えた、Cloudflare Workers向けの拡張可能で標準準拠のリファレンス実装。
デモに関する注意: ログインエンドポイントは適応型PoWチャレンジによって保護されています。失敗を繰り返すと、proof-of-workの難易度が段階的に上がります。キャッシュバック型のレート制限は実装・テスト済みですが、現在ライブデモでは有効化されていません。
app.tsのcreateCacheClientを切り替えると有効化できます。
これは、Cloudflare Workers向けにスクラッチから構築した認証リファレンス実装です。PBKDF2パスワードハッシュ、JWTデュアルトークンセッション、定数時間比較、スライディング有効期限、そして削除可能なオブザーバビリティプラグインを、Hono、Turso(オプションのValkey/Redisキャッシュ付き)、および厳格なTypeScriptで結線しています。
すべての設計判断は標準規格に遡ることができます。認証情報はNIST SP 800-63B、鍵導出はNIST SP 800-132、検証はOWASP ASVS、JWTのベストプラクティスはRFC 8725です。
製品をリリースしますか? 代わりに**Better Auth**を使用してください。OAuth、パスキー、MFA、レート制限などを、活発なプラグインエコシステムとともにすぐに利用できます。このリポジトリは、認証がどのように機能するかを教えるためのものであり、本番ライブラリの代替ではありません。
| レイヤー | 機能 |
|---|---|
| パスワード保存 | 128ビットソルト、整合性ダイジェスト、バージョン追跡を備えたPBKDF2-SHA384(password-service.ts) |
| セッション管理 | デバイス追跡、スライディング有効期限、ユーザーあたり最大3セッションの制限を備えたサーバーサイドセッション。Valkey/Redisによるオプションのキャッシュバック型セッション(session-service.ts、cached-session-service.ts) |
| パスワード変更 | 現在のパスワードの再検証、完全なPBKDF2再ハッシュ、全セッションのアトミックな失効(account-service.ts、ADR-004) |
| JWTデュアルトークンパターン | 15分のアクセストークン+7日のリフレッシュトークン。失効のためにセッションにリンク(token-service.ts) |
| 認証ミドルウェア | 自動リフレッシュフロー、明示的なHS256固定、typクレーム検証(require-auth.ts) |
| セキュアクッキー | HttpOnly、Secure、SameSite=Strict、Path=/(cookie.ts) |
| セキュリティヘッダー | HSTS、CSP、CORP/COEP/COOP、Permissions-Policy、フィンガープリント除去(security.ts) |
| 入力検証 | NIST準拠のパスワードポリシー(長さのみ、複雑性ルールなし)を備えたZodスキーマ |
| レート制限 | ブルートフォースおよびクレデンシャルスタッフィング攻撃に対する固定ウィンドウスロットリング。公開認証ルート(例: ログイン)ではIPキー、保護されたアクションではユーザーキー。ハードロックアウトなし(NIST準拠)(ADR-006) |
| オブザーバビリティプラグイン | 構造化セキュリティイベント、適応型PoWチャレンジ、エージェント認証付き/ops API — ミドルウェア経由でプラグインでき、1つのパッケージを削除するだけで取り外せます(ADR-008) |
| CLIツール | /opsインターフェース経由でイベントの照会、セッション管理、エージェント認証情報のプロビジョニングを行うGo TUI(plctl)(tools/cli/) |
| 攻撃ベクトルテスト | JWT改ざん、アルゴリズム混同、型混同、Unicodeのエッジケース、情報漏洩チェック |
このプロジェクトは、教育目的の範囲外にある機能を意図的に省略しています。このコードを本番運用に向けて拡張する場合(または本番認証システムに必要なものを評価する場合)、以下の表に優先度別にギャップをまとめています。
ほとんどの実プロジェクトでは、これらを自前で構築する代わりにBetter Authを使用してください。
| 機能 | 重要な理由 | 標準 / リファレンス |
|---|---|---|
| 流出パスワードチェック | 公知の流出データベースに含まれることが判明しているパスワードの使用を防ぎます | NIST SP 800-63B §5.1.1.2、HIBP API |
| 機能 | 重要な理由 | 標準 / リファレンス |
|---|---|---|
| CSRF保護(SameSiteを緩和する場合) | 現在はSameSite=StrictがCSRFを防いでいます。UXのためにLaxに変更する場合、明示的なトークンが必要です | OWASP CSRFチートシート |
| リフレッシュトークンのローテーション | トークン盗難を検出します。ローテーションで置き換えられたリフレッシュトークンが再利用された場合、セッションファミリー全体を失効させます | RFC 6819 §5.2.2.3 |
JWTのaudクレーム | 同じシークレットを共有する別のサービスがトークンを受け入れることを防ぎます | RFC 7519 §4.1.3、RFC 8725 §3.9 |
| インラインスクリプト用のCSP nonce | 現在のCSPは'unsafe-inline'を使用しています。nonceを使用するとインラインスクリプトのXSSベクトルを排除できます | MDN CSP script-src |
| 機能 | 重要な理由 | 標準 / リファレンス |
|---|---|---|
| TOTP多要素認証 | 高価値アカウントに第二要素を追加します | RFC 6238、NIST SP 800-63B §5.1.4 |
| WebAuthn / パスキー | プラットフォームオーセンティケーターを使用したフィッシング耐性のある認証 | WebAuthn Level 2 |
| OAuth / ソーシャルログイン | 摩擦を減らし、パスワード疲れを回避します | RFC 6749 |
| マジックリンク / OTP | 低リスクフロー向けのパスワードレスオプション | NIST SP 800-63B §5.1.3 |
| セッション分析 | デバイス追跡、同時セッションの可視化、異常検出 | OWASPセッション管理チートシート |
| 署名鍵のローテーション | すべてのセッションを無効化せずに定期的なシークレットローテーションを可能にします | RFC 7517 (JWK) |