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

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

このドキュメントの目的

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サービス開発初心者