RFC 7523: JWT を使った OAuth 2.0 認証ガイド
RFC 7523 は、OAuth 2.0 で JWT(JSON Web Token)を活用するための仕様です。このドキュメントでは、初学者でも理解できるよう、概要から詳 細まで段階的に解説します。
第1部: 概要編
RFC 7523 とは何か?
RFC 7523 の正式名称は「JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants」です。
簡単に言うと、OAuth 2.0 において JWT を使って以下の2つを実現するためのルールを定めた仕様です。
- クライアント認証 — アプリケーション(クライアント)が「自分は正規のクライアントである」と認可サーバーに証明する
- 認可グラント — JWT を使ってアクセストークンを取得する
なぜ RFC 7523 が必要なのか?
従来の OAuth 2.0 では、クライアント認証に client_id と client_secret をそのまま送信する方式(client_secret_post や client_secret_basic)が一般的でした。しかし、この方式にはいくつかの課題があります。
| 課題 | 説明 |
|---|---|
| 秘密情報の直接送信 | client_secret がリクエストごとにネットワーク上を流れる |
| 有効期限がない | 一度発行された client_secret は変更するまで永続的に有効 |
| リプレイ攻撃 | 傍受されたリクエストをそのまま再送される可能性がある |
RFC 7523 では、JWT を使った署名ベースの認証により、これらの課題を軽減します。
- 有効期限付き: JWT には
expクレームがあり、短い有効期限を設定できる - 一回限りの使用:
jtiクレームでリプレイ攻撃を防止できる - 署名による証明: クライアントが署名を生成したことを検証可能
2つの主要なユースケース
ユースケース1: JWT クライアント認証
クライアントがトークンエンドポイントにアクセスする際、client_secret の代わりに署名付き JWT を送信して自分自身を証明します。
POST /token HTTP/1.1
Host: auth.example.com
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code
&code=AUTH_CODE_HERE
&client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer
&client_assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
この方式は OIDC では以下の名前で知られています。
| 方式 | 署名アルゴリズム | 鍵の種類 |
|---|---|---|
client_secret_jwt | HMAC(HS256, HS384, HS512) | 共有秘密(client_secret を鍵として使用) |
private_key_jwt | RSA / ECDSA(RS256, ES256 など) | 公開鍵暗号(クライアントが秘密鍵を保持) |
2つの方式の比較
| 観点 | client_secret_jwt | private_key_jwt |
|---|---|---|
| 鍵管理 | 認可サーバーとクライアントが同じ秘密を共有 | クライアントのみが秘密鍵を保持 |
| セキュリティ | client_secret が認可サーバーにも存在 | 秘密鍵はクライアント外に出ない |
| 否認防止 | 認可サーバーも署名を生成可能(否認可能) | クライアントのみが署名可能(否認不可) |
| 導入の容易さ | 既存の client_secret をそのまま利用可能 | 鍵ペア生成・公開鍵登録が必要 |
| 用途 | 一般的な OAuth 2.0 クライアント認証 | FAPI など高セキュリティ要件 |
どちらを選ぶかは、セキュリティ要件と運用コストのバランスで決定します。
ユースケース2: JWT Bearer グラント
外部システムで発行された JWT を、そのままアクセストークンに交換します。サービス間連携やフェデレーション認証で活用されます。
POST /token HTTP/1.1
Host: auth.example.com
Content-Type: application/x-www-form-urlencoded
grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer
&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
関連する仕様
RFC 7523 は単独で存在するわけではなく、いくつかの仕様と関連しています。
RFC 7521 (Assertion Framework)
├── RFC 7522 (SAML Profile)
└── RFC 7523 (JWT Profile) ← 本ドキュメント
RFC 7519 (JWT)
└── JWT の基本構造を定義
OpenID Connect Core
└── private_key_jwt, client_secret_jwt として参照
第2部: 詳細編
JWT の構造と必須クレーム
RFC 7523 で使用する JWT には、特定のクレーム(claim)が必須または推奨として定められています。
必須クレーム
| クレーム | 説明 | 例 |
|---|---|---|
iss | 発行者。クライアント認証の場合は client_id | "my-client-app" |
sub | 主体。クライアント認証では client_id、Bearer グラントではユーザー識別子 | "my-client-app" or "user-123" |
aud | 対象者。認可サーバーのトークンエンドポイント URL または識別子 | "https://auth.example.com/token" |
exp | 有効期限(Unix タイムスタンプ) | 1735689600 |