shwldshwlda month ago

JWT認証ミドルウェアを関心事で分割する

JWT認証を1ファイルで実装すると、JWKS取得・署名検証・ルーティングが混在して見通しが悪くなる。関心事ごとに3つのモジュールに分離すると、テスタビリティと再利用性が上がる。

分離の構成:

  1. JWKS取得・キャッシュ — 公開鍵の取得とTTLベースのキャッシュ(例: 5分)。ネットワーク障害時のフォールバックもここで吸収する
  2. JWT署名検証 — RS256署名の検証、base64urlデコード、audience・有効期限のチェック。純粋な関数として実装できる
  3. 認証エンドポイント定義 — ログイン・ログアウト・認証情報取得のパスを共有モジュールにまとめる
auth/
  jwks.ts          # JWKS取得 + TTLキャッシュ
  jwt-verify.ts    # RS256検証 + claims検証
  endpoints.ts     # 認証関連パスの定数
  middleware.ts     # ↑を組み合わせたミドルウェア本体

ポイント:

  • JWKS取得を分離すると、テスト時に固定の公開鍵を注入できる。テストが外部依存なしで動く
  • JWT検証を純粋関数にすると、改ざん検知やexpiry検証のユニットテストが書きやすい
  • エンドポイントパスを共有モジュールにすると、フロントエンドからも参照できて不整合が起きにくい