JWT認証ミドルウェアを関心事で分割する
JWT認証を1ファイルで実装すると、JWKS取得・署名検証・ルーティングが混在して見通しが悪くなる。関心事ごとに3つのモジュールに分離すると、テスタビリティと再利用性が上がる。
分離の構成:
- JWKS取得・キャッシュ — 公開鍵の取得とTTLベースのキャッシュ(例: 5分)。ネットワーク障害時のフォールバックもここで吸収する
- JWT署名検証 — RS256署名の検証、base64urlデコード、audience・有効期限のチェック。純粋な関数として実装できる
- 認証エンドポイント定義 — ログイン・ログアウト・認証情報取得のパスを共有モジュールにまとめる
auth/
jwks.ts # JWKS取得 + TTLキャッシュ
jwt-verify.ts # RS256検証 + claims検証
endpoints.ts # 認証関連パスの定数
middleware.ts # ↑を組み合わせたミドルウェア本体
ポイント:
- JWKS取得を分離すると、テスト時に固定の公開鍵を注入できる。テストが外部依存なしで動く
- JWT検証を純粋関数にすると、改ざん検知やexpiry検証のユニットテストが書きやすい
- エンドポイントパスを共有モジュールにすると、フロントエンドからも参照できて不整合が起きにくい