OpenID Connectとは?その仕組みと必要な知識とフローをまとめて解説

知識

「ソーシャルログイン」や「Googleアカウントでサインイン」という機能を見たことがある方は多いと思います。その裏側で動いているのが OpenID Connect(OIDC) というプロトコルです。

本記事では、OpenID Connectがなぜ生まれたのか、OAuth 2.0との関係、IDトークンの構造、そして実際の認証フローまでを体系的に解説します。Web開発や認証設計に携わるエンジニアの方に特におすすめの内容です。


OpenID Connectとは何か

OpenID Connect(OIDC)は、OAuth 2.0をベースにした認証のための拡張仕様です。OAuth 2.0はアクセス権の委譲(認可)を行うプロトコルですが、「このユーザーが誰であるか」を確認する機能(認証)は持っていません。OIDCはその不足を補うために策定されました。

OpenID Foundationが策定し、OpenID Connect Core 1.0 として仕様が公開されています。2024年にはISO/IEC 26131:2024として国際標準規格にも認定されており、Google・Microsoft・GitHubなど主要なIDプロバイダーが採用しています。

認証(Authentication)と認可(Authorization)の違い:認証は「あなたは誰ですか?」という本人確認であり、認可は「あなたは何をしてよいですか?」というアクセス権の確認です。OIDCは認証、OAuth 2.0は認可を担います。


OAuth 2.0とOpenID Connectの違い

OAuth 2.0 と OpenID Connect の違いを示す比較図

OAuth 2.0は「アクセストークン」を発行してAPIへのアクセスを制御するプロトコルです。しかし、アクセストークン自体にはユーザー情報が含まれておらず、「誰がログインしているか」を特定することができません。

OpenID ConnectはOAuth 2.0の上に認証レイヤーを追加することで、この課題を解決します。具体的には「IDトークン」という新しいトークンを導入し、そこにユーザーの身元情報(クレーム)をJWT形式で含める仕組みを定義しています。

項目OAuth 2.0OpenID Connect
目的認可(権限委譲)認証(ユーザー確認)
発行トークンアクセストークンIDトークン+アクセストークン
ユーザー情報含まれないIDトークン内に含まれる
ユースケースAPIアクセス制御ソーシャルログイン・SSO
標準スコープなし(任意)openid(必須)


OpenID Connectに登場する主なロール

OpenID Connectの通信には、以下の3つの主要な登場人物がいます。それぞれの役割を把握することが、フローを理解する上での第一歩です。

  • エンドユーザー(End-User):ログインを行う人間のユーザーです。ブラウザやアプリを通じて操作します。
  • RP(Relying Party):ユーザーのログインを必要とするアプリケーション側(例:あなたが開発するWebサービス)。OPから認証情報を受け取り、ユーザーのセッションを管理します。
  • OP(OpenID Provider):ユーザーの認証を行い、IDトークンを発行する側です(例:Google、GitHub、Microsoft Entra IDなど)。IDプロバイダー(IdP)とも呼ばれます。

RPはOPに対してユーザーの認証を依頼し、認証が成功するとOPからIDトークンおよびアクセストークンを受け取ります。RPがOPを特定し、各エンドポイント情報を取得する仕組みを「Discovery」と呼びます。


OPが提供する主要なエンドポイント

OPはRPが利用するための複数のエンドポイントを提供します。代表的なものは以下の3つです。

エンドポイント役割
認証エンドポイント(authorization_endpoint)ユーザーの認証と認可コードの発行を行う
トークンエンドポイント(token_endpoint)認可コードをIDトークン・アクセストークンに交換する
UserInfoエンドポイント(userinfo_endpoint)アクセストークンを使ってユーザー情報(クレーム)を取得する

また、OPは /.well-known/openid-configuration という Discoveryエンドポイント を公開しており、RPはここへアクセスするだけで上記エンドポイントのURLや署名鍵(JWKs URI)などを自動取得できます。


IDトークンの構造と主要クレーム

IDトークン(JWT)の Header・Payload・Signature 構造と主要クレームの説明図

IDトークンは JWT(JSON Web Token) 形式で表現されます。JWTは Header.Payload.Signature の3パートを .(ドット)で区切った文字列です。各パートはBase64URLエンコードされています。

  • Header:署名アルゴリズム(alg)やトークン種別(typ)を示します。例:{"alg": "RS256", "typ": "JWT"}
  • Payload:ユーザー情報やトークンのメタデータを「クレーム(Claims)」という形で格納します。
  • Signature:HeaderとPayloadをOPの秘密鍵で署名したものです。RPは対応する公開鍵で検証することで改ざんを検知できます。

OpenID Connect Core 1.0が定める必須クレームは以下の通りです。

クレーム名意味
iss発行者(Issuer)https://accounts.google.com
subユーザーを一意に識別するID(Subject)110169484474386276334
audこのトークンの受信者(Audience)= client_idmy-app-client-id
exp有効期限のUnixタイムスタンプ(Expiration)1712345678
iat発行日時のUnixタイムスタンプ(Issued At)1712342078
nonceリプレイ攻撃防止のランダム文字列(任意だが推奨)abc123xyz

また、スコープに profileemail を追加することで、nameemailpicture などのユーザー属性クレームを追加取得できます。

{
  "iss": "https://accounts.google.com",
  "sub": "110169484474386276334",
  "aud": "my-app-client-id",
  "exp": 1712345678,
  "iat": 1712342078,
  "email": "user@example.com",
  "email_verified": true,
  "name": "Taro Yamada",
  "nonce": "abc123xyz"
}

JWTのPayloadはBase64URLデコードするだけで中身を読み取れます(暗号化ではない)。署名(Signature)はあくまでも「改ざんされていないこと」を保証するものです。機密情報はPayloadに含めないよう注意しましょう。


Authorization Code Flow with PKCE の詳細

Authorization Code Flow with PKCE の認証フローを示すシーケンス図

現在最も広く推奨されている認証フローが Authorization Code Flow with PKCE(認可コードフロー + PKCE)です。Webアプリ・モバイルアプリ・SPA(シングルページアプリケーション)のいずれにも適用できます。

  1. ログインリクエスト:ユーザーがRPのログインボタンを押すと、RPが処理を開始します。
  2. PKCE パラメータ生成:RPはランダムな文字列 code_verifier を生成し、そのSHA-256ハッシュ値を code_challenge として準備します。
  3. 認証エンドポイントへリダイレクト:RPはユーザーをOPの認証エンドポイントへリダイレクトします。この際、scope=openidresponse_type=codeclient_idredirect_uristatecode_challenge などのパラメータを付与します。
  4. ログイン画面の表示:OPがユーザーにログイン画面を表示します。
  5. ユーザー認証:ユーザーがID/パスワードを入力し、OPが認証を行います。
  6. 認可コードの返却:認証成功後、OPはRPの redirect_uri へ認可コードをリダイレクトで返します。
  7. トークンリクエスト:RPはトークンエンドポイントへ、認可コードと code_verifier を送信します。
  8. IDトークン・アクセストークンの返却:OPは code_verifiercode_challenge の一致を検証し、問題なければIDトークンとアクセストークンを返却します。
  9. UserInfoの取得(任意):追加のユーザー情報が必要な場合、RPはアクセストークンを使ってUserInfoエンドポイントを呼び出します。
  10. ログイン成功:RPはIDトークンを検証し、ユーザーのセッションを開始します。


PKCEとはなぜ必要か

PKCE(Proof Key for Code Exchange / ピクシー)は、認可コード横取り攻撃(Authorization Code Interception Attack)を防止するための拡張機能です。

モバイルアプリやSPAではクライアントシークレットを安全に保管できません。そのような環境で認可コードが第三者に傍受された場合、従来のフローではそのままトークンを取得されてしまいます。PKCEでは事前に生成した code_verifier を使った検証をOPに行わせるため、認可コードだけを持っていても不正にトークンを取得できなくなります。

# code_verifier: ランダムな文字列(43〜128文字)
code_verifier=$(openssl rand -base64 32 | tr -d '=+/' | head -c 43)

# code_challenge: code_verifier の SHA256 ハッシュを Base64URL エンコード
code_challenge=$(echo -n "$code_verifier" | openssl dgst -sha256 -binary | base64 | tr '+/' '-_' | tr -d '=')

echo "code_verifier: $code_verifier"
echo "code_challenge: $code_challenge"


認証リクエストの主要パラメータ

RPがOPの認証エンドポイントにリクエストを送る際の主なパラメータを確認しておきましょう。

パラメータ必須/任意説明
response_type必須code(認可コードフローの場合)
client_id必須OP側に登録されたクライアントID
redirect_uri必須認可コードの返送先URL
scope必須openid を必ず含める。他に profileemail など
state推奨CSRF攻撃防止のためのランダム文字列
nonce推奨リプレイ攻撃防止。IDトークン内のnonceと照合する
code_challengePKCE使用時必須code_verifier のSHA256ハッシュ(Base64URL)
code_challenge_methodPKCE使用時必須S256(SHA256使用)
# 認可リクエストの例(クエリパラメータ)

https://accounts.google.com/o/oauth2/v2/auth
?response_type=code &client_id=YOUR_CLIENT_ID &redirect_uri=https%3A//your-app.example.com/callback &scope=openid%20email%20profile &state=RANDOM_STATE_VALUE &nonce=RANDOM_NONCE_VALUE &code_challenge=CODE_CHALLENGE_VALUE &code_challenge_method=S256


その他の認証フロー(Implicit Flow・Hybrid Flow)

OpenID Connect Core 1.0 では、Authorization Code Flow 以外にも以下のフローが定義されています。ただし、現在のセキュリティベストプラクティスではAuthorization Code Flow with PKCE の使用が強く推奨されており、Implicit Flow は非推奨となっています。

  • Implicit Flowresponse_type=id_token token):認可コードを介さず、リダイレクトURLのフラグメント部分にIDトークンを直接返すフローです。かつてSPAで使われていましたが、トークンがURLに露出するリスクがあり現在は非推奨です。
  • Hybrid Flowresponse_type=code id_token など):認可コードとIDトークンを同時に返すフローです。特定のユースケース(ネイティブアプリ等)で利用されます。

OAuth 2.0 Security Best Current Practice(RFC 9700)では、すべてのクライアントタイプにおいてAuthorization Code Flow with PKCEの使用を推奨しており、Implicit FlowはOAuth 2.1でも削除される方向で検討されています。新規実装では必ずPKCEを採用しましょう。


OpenID Connectの主な活用シーン

OpenID Connectは以下のような場面で広く活用されています。

  • ソーシャルログイン:「Googleでログイン」「GitHubでサインイン」など、外部IDプロバイダーのアカウントで自社サービスにログインする機能。ユーザーは新たなID/パスワードを覚える必要がなくなります。
  • シングルサインオン(SSO):一度認証すれば、複数のサービスを再認証なしで利用できます。企業内の複数システムへのアクセスや、マイクロサービス間の認証に活用されます。
  • モバイルアプリ・SPAの認証:PKCE対応のAuthorization Code Flowにより、クライアントシークレットを持てない環境でも安全な認証が実現できます。
  • B2B SaaSのアイデンティティ連携:企業ごとのAD(Active Directory)やSAMLプロバイダーと連携し、従業員が自社アカウントで外部SaaSにログインできます。


まとめ

OpenID Connectは、OAuth 2.0の認可機能にIDトークンという認証レイヤーを追加したプロトコルです。本記事で解説した内容を以下に整理します。

  • OIDCはOAuth 2.0の拡張であり、「認証」を担うプロトコルである
  • IDトークン(JWT)にはユーザー情報がクレームとして含まれ、OPの秘密鍵で署名される
  • 主要なフローはAuthorization Code Flow with PKCEであり、認可コード横取り攻撃を防止できる
  • RPとOPの間では認証エンドポイント・トークンエンドポイント・UserInfoエンドポイントを使って通信する
  • Discoveryエンドポイントにより、RPはOPの設定情報を自動取得できる

認証設計において「ソーシャルログインを実装したい」「SSOを構築したい」という場面では、OIDCの仕様を正しく理解した上で実装することがセキュリティ上も重要です。ぜひ本記事をリファレンスとして活用してください。


参考リソース

コメント

タイトルとURLをコピーしました