OAuth 2.0 / OpenID Connect(OIDC)完全攻略|認可コードグラント・PKCE徹底解説
WebAPIの普及やSNSログインの標準化に伴い、情報処理安全確保支援士試験で近年大注目されているのが「OAuth 2.0(認可フレームワーク)」と「OpenID Connect(OIDC:認証プロトコル)」です。
「認可(Authorization)と認証(Authentication)の本質的な違い」「認可コードグラントの往復シーケンス」「PKCEがなぜネイティブアプリに必要なのか」を完全に整理しましょう。
1. OAuth 2.0 と OpenID Connect の違い
最も基本的な出題ポイントは、「OAuth 2.0 はアクセス権限を委譲する『認可』のための規格であり、ユーザーの身元を証明する『認証』の規格ではない」という点です。OAuth 2.0 の上にユーザー属性情報(クレーム)の安全な受渡し機能を追加したものが OpenID Connect です。
プロトコル | 主な目的 | 発行されるトークン | トークンの形式と役割 |
|---|---|---|---|
OAuth 2.0 | 認可(Authorization) ※リソースへのアクセス権の委譲 | アクセストークン (Access Token) | 不透明な文字列またはJWT。APIサーバ(リソースサーバ)に対して提示し、特定操作の権限があることを示す。 |
OpenID Connect (OIDC) | 認証(Authentication) ※ユーザーの識別・身元確認 | IDトークン (ID Token) + アクセストークン | JWT(JSON Web Token)形式でディジタル署名付き。ユーザーID、発行時刻、有効期限、プロファイル等が含まれる。 |
2. 認可コードグラント(Authorization Code Grant)のシーケンス
Webアプリケーションにおける標準的な認可コードグラントのフローです。
- ① 認可リクエスト: クライアントアプリがブラウザを認可サーバの認可エンドポイントへリダイレクト(client_id, redirect_uri, scope, state などを付加)。
- ② ユーザーのログインと同意: 利用者が認可サーバ上で直接ログインし、クライアントへの権限委譲に「同意(Consent)」する。
- ③ 認可コードの返却: 認可サーバがブラウザを経由して redirect_uri へ「認可コード(一時的な引換券)」をリダイレクトで渡す。
- ④ トークンリクエスト(バックチャネル): クライアントアプリのサーバが、認可サーバのトークンエンドポイントへ直接HTTPSで通信し、認可コードとクライアントシークレットを提示。
- ⑤ トークンの発行: 認可サーバが認可コードを検証し、アクセストークン(およびIDトークン)を発行。ブラウザを通さないため安全。
3. 安全性を支える重要パラメータ:state と PKCE
セキュリティ機構 | 仕組み | 防ぐ脅威・出題論点 |
|---|---|---|
state パラメータ | クライアントがリクエスト毎にランダムなセッション紐づき文字列を生成して認可リクエストに含め、コールバック時に同一値か検証する。 | 【CSRF攻撃の防止】 攻撃者が用意した認可コードを他人のセッションに強制的に紐づけさせる攻撃を遮断する。 |
PKCE (Proof Key for Code Exchange) | クライアントが「Code Verifier(秘密の値)」と「Code Challenge(そのハッシュ値)」を作成。リクエスト時にハッシュ値を送り、トークン交換時に元の値を提示して照合する。 | 【認可コード横取り攻撃の防止】 クライアントシークレットを安全に保持できないモバイルアプリやSPAで、他アプリに認可コードを盗聴されてもトークン交換を防ぐ。 |
nonce パラメータ (OIDC) | 認証リクエスト時にランダムな文字列を送り、IDトークン内に埋め込まれて返却された値と一致するか検証する。 | 【リプレイ攻撃(再送攻撃)の防止】 過去に傍受された古いIDトークンを再利用されるのを防ぐ。 |
4. 午後記述式試験(SC・AP)で使える得点キーワード・記述テンプレート
【定番記述フレーズ①(OAuthとOIDCの違い)】 「OAuthはAPIアクセス権限の認可を行い、OIDCはユーザーの身元を認証する。」(39字)
【定番記述フレーズ②(stateパラメータの目的)】 「認可リクエストとコールバックの対応関係を検証し、CSRF攻撃を防止する。」(37字)
【定番記述フレーズ③(PKCEの導入目的)】 「認可コード横取り攻撃を防ぎ、シークレットを保持できない環境での安全性を確保する。」(41字)
【定番記述フレーズ④(IDトークンの検証手順)】 「認可サーバの公開鍵で署名を検証し、iss、aud、有効期限、nonceを確認する。」(41字)