メインコンテンツまでスキップ

署名アルゴリズムの選び方

このドキュメントの目的​

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対応推奨シーン
RS256RSA256B高✅ 可能✅ 対応OAuth 2.0/OIDC標準
ES256ECDSA64B低✅ 可能✅ 推奨FAPI、モバイル
HS256HMAC32B最低❌ 不可❌ 非対応サーバー間通信

アルゴリズムの選択基準​

ID Token​

推奨: RS256 または ES256

理由:

  • クライアントアプリが検証する
  • 公開鍵で検証可能
  • OpenID Connect Core 1.0で必須

選択:

  • 標準的な実装: RS256
  • FAPI準拠: ES256
  • モバイル最適化: ES256

Access Token​

推奨: RS256 または ES256

理由:

  • Resource Serverが検証する
  • 公開鍵で検証可能
  • マイクロサービス間でも使える

Refresh Token​

推奨: HS256 または RS256

理由:

  • Authorization Serverのみが検証
  • HS256で十分(高速、小サイズ)

選択:

  • 内部検証のみ: HS256
  • 統一性重視: RS256

鍵長の選択​

RSA鍵長​

鍵長セキュリティ署名サイズ推奨
1024bit❌ 脆弱128B❌ 非推奨
2048bit✅ 標準256B✅ 推奨
4096bit✅ 高512B⚠️ オーバースペック

推奨: 2048bit(標準的なセキュリティ)

ECDSA曲線​

曲線セキュリティ推奨
P-256✅ 標準✅ 推奨(ES256)
P-384✅ 高✅ 推奨(ES384)
P-521✅ 最高⚠️ オーバースペック

推奨: P-256(ES256)


よくある誤解​

誤解1: HS256は安全でない​

真実: HS256自体は安全。問題は鍵管理。

  • ✅ サーバー内部で使用する分には安全
  • ❌ クライアントに秘密鍵を配布すると危険

誤解2: 鍵長が長いほど安全​

真実: 適切な鍵長で十分。

  • RSA 2048bit: 十分なセキュリティ
  • RSA 4096bit: オーバースペック、パフォーマンス低下

誤解3: ES256はRS256より安全​

真実: 同等のセキュリティレベル。

  • ES256とRS256は同等のセキュリティ強度
  • ES256の利点はサイズと速度

まとめ​

アルゴリズム選択のフローチャート​

トークンをクライアントが検証する?
├─ Yes → RS256 または ES256
│ ├─ 標準的な実装 → RS256
│ └─ FAPI準拠/モバイル → ES256
│
└─ No → サーバー内部のみ検証
└─ HS256(高速、小サイズ)

学んだこと​

  • ✅ 3つの主要アルゴリズム(RS256、ES256、HS256)
  • ✅ 非対称暗号(RS256、ES256)vs 対称暗号(HS256)
  • ✅ 各アルゴリズムのトレードオフ
  • ✅ トークン種類別の推奨アルゴリズム
  • ✅ 鍵長の選択基準

次に読むべきドキュメント​

  1. JWS/JWEの基礎 - 署名と暗号化の違い

最終更新: 2025-12-18 対象: IDサービス開発初心者