RFC 9700: OAuth 2.0 Security Best Current Practice
RFC 9700 は、OAuth 2.0 のセキュリティベストプラクティスをまとめた仕様です。このドキュメントでは、主要な推奨事項を解説します。
第1部: 概要編
RFC 9700 とは何か?
RFC 9700(旧 OAuth 2.0 Security BCP)は、OAuth 2.0 実装におけるセキュリティのベストプラクティスをまとめた文書です。
RFC 6749(OAuth 2.0 Core)の発行から 10 年以上が経過し、新たな攻撃手法や対策が明らかになったため、それらを集約しています。
なぜ必要なのか?
| RFC 6749 の問題 | RFC 9700 の対応 |
|---|---|
| Implicit Grant を許可 | 非推奨、使用禁止を推奨 |
| PKCE は任意 | すべてのクライアントで推奨 |
| redirect_uri の部分一致 | 完全一致を必須化 |
| Bearer トークンのみ | DPoP/mTLS によるバインディングを推奨 |
主要な推奨事項サマリー
| カテゴリ | 推奨事項 |
|---|---|
| 認可グラント | Authorization Code + PKCE を使用 |
| redirect_uri | 完全一致(exact match)で検証 |
| トークン | Sender-Constrained Token を推奨 |
| リフレッシュトークン | ローテーションまたはバインディング |
| クライアント認証 | 可能な限り強力な方式を使用 |
第2部: 詳細編
Authorization Code Grant の強化
PKCE の必須化
Authorization servers SHOULD require the use of PKCE for all OAuth clients.
以前: パブリッククライアントのみ PKCE 推奨
現在: すべてのクライアントで PKCE 推奨
理由:
- Confidential クライアントでも認可コード横取り攻撃のリスクあり
- PKCE はコストが低く、導入障壁が低い
Implicit Grant の廃止
The implicit grant MUST NOT be used.
以前: SPA 向けに Implicit Grant を使用
現在: Authorization Code + PKCE を使用
理由:
- アクセストークンが URL フラグメントに露出
- トークン漏洩リスクが高い
- リフレッシュトークンが使えない
Resource Owner Password Grant の廃止
The resource owner password credentials grant MUST NOT be used.
理由:
- クライアントがユーザーのパスワードを知ることになる
- フィッシングに対する防御ができない
- MFA の実装が困難
redirect_uri の検証
完全一致の強制
The authorization server MUST compare URIs using exact string matching.
ワイルドカードの禁止
Authorization servers SHOULD NOT allow clients to register redirect URI patterns.
禁止:
https://app.example.com/callback/*
https://*.example.com/callback
許可:
https://app.example.com/callback
https://app.example.com/oauth/callback
localhost の扱い
Clients SHOULD NOT use localhost as the hostname.
非推奨: http://localhost:8080/callback
推奨: http://127.0.0.1:8080/callback
推奨: http://[::1]:8080/callback
理由:DNS リバインディング攻撃のリスク。