OAuth 2.0 / OpenID Connect(OIDC)完全攻略|認可コードグラント・PKCE徹底解説
「外部アプリにAPIを使わせる」と「外部サービスでログインする」は、どこが違うのでしょうか。OAuth 2.0とOIDCを、渡す値と受け手から読み分けます。
「認可(Authorization)と認証(Authentication)の本質的な違い」「認可コードグラントの往復シーケンス」「PKCEがなぜネイティブアプリに必要なのか」を完全に整理しましょう。
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、発行時刻、有効期限、プロファイル等が含まれる。 |
認可コードグラント(Authorization Code Grant)のシーケンス
Webアプリケーションにおける標準的な認可コードグラントのフローです。
- ① 認可リクエスト: クライアントアプリがブラウザを認可サーバの認可エンドポイントへリダイレクト(client_id, redirect_uri, scope, state などを付加)。
- ② ユーザーのログインと同意: 利用者が認可サーバ上で直接ログインし、クライアントへの権限委譲に「同意(Consent)」する。
- ③ 認可コードの返却: 認可サーバがブラウザを経由して redirect_uri へ「認可コード(一時的な引換券)」をリダイレクトで渡す。
- ④ トークンリクエスト(バックチャネル): クライアントアプリのサーバが、認可サーバのトークンエンドポイントへ直接HTTPSで通信し、認可コードとクライアントシークレットを提示。
- ⑤ トークンの発行: 認可サーバが認可コードを検証し、アクセストークン(およびIDトークン)を発行。ブラウザを通さないため安全。
安全性を支える重要パラメータ:state と PKCE
セキュリティ機構 | 仕組み | 防ぐ脅威・出題論点 |
|---|---|---|
state パラメータ | クライアントがリクエスト毎にランダムなセッション紐づき文字列を生成して認可リクエストに含め、コールバック時に同一値か検証する。 | 【CSRF攻撃の防止】 攻撃者が用意した認可コードを他人のセッションに強制的に紐づけさせる攻撃を遮断する。 |
PKCE (Proof Key for Code Exchange) | クライアントが「Code Verifier(秘密の値)」と「Code Challenge(そのハッシュ値)」を作成。リクエスト時にハッシュ値を送り、トークン交換時に元の値を提示して照合する。 | 【認可コード横取り攻撃の防止】 クライアントシークレットを安全に保持できないモバイルアプリやSPAで、他アプリに認可コードを盗聴されてもトークン交換を防ぐ。 |
nonce パラメータ (OIDC) | 認証リクエスト時にランダムな文字列を送り、IDトークン内に埋め込まれて返却された値と一致するか検証する。 | 【リプレイ攻撃(再送攻撃)の防止】 過去に傍受された古いIDトークンを再利用されるのを防ぐ。 |
設問の条件から、対策の理由を書く
【定番記述フレーズ①(OAuthとOIDCの違い)】 「OAuthはAPIアクセス権限の認可を行い、OIDCはユーザーの身元を認証する。」(39字)
【定番記述フレーズ②(stateパラメータの目的)】 「認可リクエストとコールバックの対応関係を検証し、CSRF攻撃を防止する。」(37字)
【定番記述フレーズ③(PKCEの導入目的)】 「認可コード横取り攻撃を防ぎ、シークレットを保持できない環境での安全性を確保する。」(41字)
【定番記述フレーズ④(IDトークンの検証手順)】 「認可サーバの公開鍵で署名を検証し、iss、aud、有効期限、nonceを確認する。」(41字)
この記事に関連する教科書用語
この記事に関連する過去問演習
次におすすめの学習
編集・検証について
編集・検証:IT資格ラボ編集部
IPAが公開する試験要綱・シラバス・過去問題と、各技術の公式資料を優先して内容を確認しています。制度変更や誤りを確認した場合は、記事を見直して更新します。
編集方針・情報源・訂正方針を見る