署名アルゴリズムの選び方
このドキュメントの目的
JWT署名アルゴリズム(RS256、ES256、HS256等)の違いを理解し、適切なアルゴリズムを選択できるようになることが目標です。
主要な署名アルゴリズム
RS256(RSA + SHA-256)
暗号方式: RSA(公開鍵暗号)
鍵ペア:
- 秘密鍵: JWT署名に使用(サーバーのみ保持)
- 公開鍵: JWT検証に使用(クライアントが取得可能)
メリット:
- ✅ 非対称暗号: 秘密鍵なしで検証可能
- ✅ 広くサポート: 全てのライブラリがサポート
- ✅ 鍵配布が容易: 公開鍵をJWKSで配布
デメリット:
- ❌ 署名サイズ大: 256バイト(鍵長2048bitの場合)
- ❌ 計算コスト高: RSA演算が重い
推奨シーン:
- OAuth 2.0/OIDC(標準)
- マイクロサービス間認証(公開鍵で検証)
- クライアントアプリがトークン検証する場合
ES256(ECDSA + SHA-256)
暗号方式: ECDSA(楕円曲線暗号)
鍵ペア:
- 秘密鍵: JWT署名に使用
- 公開鍵: JWT検証に使用
メリット:
- ✅ 署名サイズ小: 64バイト(RS256の1/4)
- ✅ 計算コスト低: RSAより高速
- ✅ 非対称暗号: 秘密鍵なしで検証可能
- ✅ FAPI推奨: 金融機関向けセキュリティプロファイル
デメリット:
- ❌ サポート範囲狭: 古いライブラリは未対応の場合あり
推奨シーン:
- FAPI準拠(金融機関)
- モバイルアプリ(トークンサイズ削減)
- 高パフォーマンス要件
HS256(HMAC + SHA-256)
暗 号方式: HMAC(共有鍵暗号)
鍵:
- 共有秘密鍵: JWT署名と検証の両方に使用(同じ鍵)
メリット:
- ✅ 署名サイズ小: 32バイト
- ✅ 計算コスト低: 最も高速
- ✅ シンプル: 鍵管理が簡単
デメリット:
- ❌ 対称暗号: 検証に秘密鍵が必要
- ❌ 鍵配布困難: 秘密鍵を配布するとセキュリティリスク
- ❌ クライアント検証不可: クライアントに秘密鍵を渡せない
推奨シーン:
- サーバー間通信(内部API)
- Refresh Token(サーバーのみが検証)
- マイクロサービス内部(同じ組織内)
非推奨シーン:
- ID Token(クライアントが検証する)
- Access Token(Resource Serverが検証する)
アルゴリズムの比較
| アルゴリズム | 暗号方式 | 署名サイズ | 計算コスト | クライアント検証 | FAPI対応 | 推奨シーン |
|---|---|---|---|---|---|---|
| RS256 | RSA | 256B | 高 | ✅ 可能 | ✅ 対応 | OAuth 2.0/OIDC標準 |
| ES256 | ECDSA | 64B | 低 | ✅ 可能 | ✅ 推奨 | FAPI、モバイル |
| HS256 | HMAC | 32B | 最低 | ❌ 不可 | ❌ 非対応 |