RS256(RSA SHA-256)によるJWT署名

RS256(RSA SHA-256)によるJWT署名の仕組み、公開鍵/秘密鍵ペアの使用方法、分散システムに適する理由、JWKSエンドポイント、鍵ローテーション戦略を解説します。

Algorithm

詳細な説明

RS256(SHA-256を使用するRSASSA-PKCS1-v1_5)は、RSA鍵ペアを使用する非対称署名アルゴリズムです。秘密鍵で署名を作成し、対応する公開鍵で検証します。この署名と検証の機能分離により、RS256は分散システムやサードパーティIDプロバイダーの標準的な選択肢となっています。

RS256の署名の仕組み:

RSA_SIGN(
  SHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload)),
  privateKey
)

サーバーはエンコードされたヘッダーとペイロードのSHA-256ハッシュを計算し、PKCS#1 v1.5パディングを使用してRSA秘密鍵でこのハッシュに署名します。検証では、公開鍵を使用してハッシュに対する署名を検証します。秘密鍵の所有者のみが有効な署名を作成できますが、公開鍵を持つ誰もが署名を検証できます。

JWKSによる鍵管理:

公開鍵は通常、JSON Web Key Set(JWKS)エンドポイントを通じて公開され、慣例として{issuer}/.well-known/jwks.jsonに配置されます。検証サービスはこのエンドポイントを取得して公開鍵を入手します。JWTヘッダーには、JWKSのどの鍵が署名に使用されたかを示すkid(鍵ID)フィールドが含まれます。これにより鍵ローテーションがサポートされます。発行者はJWKSに新しい鍵を追加し、新しい鍵で署名を開始し、古い鍵で署名されたすべてのトークンの有効期限が切れた後に古い鍵を削除します。

鍵サイズとパフォーマンス:

RS256のRSA鍵は少なくとも2048ビット必要で、新規デプロイメントでは4096ビットが推奨されます。RS256での署名はHS256よりも大幅に遅く(鍵サイズとハードウェアによって約10〜100倍)、検証は高速です。この非対称性は、署名がまれにしか発生しない(トークン発行時)のに対し、検証はすべてのリクエストで発生するため、許容されます。

RS256が分散システムで好まれる理由:

1つのIDプロバイダーと多数のマイクロサービスを持つアーキテクチャでは、秘密鍵を必要とするのはIDプロバイダーだけです。他のすべてのサービスは公開鍵のみを必要とし、セキュリティリスクなしに自由に配布できます。検証サービスが侵害されても、攻撃者は秘密鍵を持たないためトークンを偽造できません。これがHS256に対するRS256の主な利点です。

ユースケース

Auth0やKeycloakのようなIDプロバイダーがRSA秘密鍵でトークンに署名し、JWKSを通じて公開鍵を公開することで、あらゆるマイクロサービスが独立してトークンを検証できるようにします。

試してみる — JWT Decoder

フルツールを開く