OIDCとは?認証の仕組みを初心者向けに徹底解説【5000語でわかる完全ガイド】
はじめに:なぜ今、OIDCを知る必要があるのか?
あなたが毎日使っているインターネットサービス。ニュースサイト、SNS、ショッピングサイト、動画配信サービス…。これらのサービスを利用するとき、ほぼ必ず「ログイン」という操作を行いますよね。
「サービスAにはこのメールアドレスとパスワード、サービスBにはこっちのIDとパスワード…」
たくさんのIDとパスワードを管理するのは、本当に大変です。覚えきれなくてメモ帳に書いたり、結局すべてのサービスで同じパスワードを使いまわしてしまったり…。そんな経験はありませんか?
実は、この「ID/パスワード問題」は、単に面倒なだけではありません。パスワードの使い回しは、一つのサービスから情報が漏洩しただけで、他のサービスにも不正ログインされてしまう危険性をはらんでいます。サービスを提供する側にとっても、ユーザーの大切な情報を預かる認証システムを自前で開発・運用するのは、莫大なコストとセキュリティリスクを伴う、非常に難しい課題でした。
こうした現代のWebサービスが抱える共通の悩みを、エレガントに解決してくれる技術こそが、今回解説するOIDC(OpenID Connect)です。
あなたも「Googleでログイン」や「Appleでサインイン」といったボタンを一度は目にしたことがあるはずです。あの便利な機能の裏側で動いているのが、まさにOIDCなのです。
この記事では、以下の内容を、IT初心者の方でも理解できるよう、専門用語を一つひとつ噛み砕きながら、丁寧に解説していきます。
- OIDCとは何か? その基本的な概念と役割
- 「認証」と「認可」の決定的的な違い(OIDCを理解する上で最も重要なポイント)
- OIDCはどのようにして安全なログインを実現しているのか? その具体的な仕組み(フロー)
- OIDCを使うと、なぜ便利で安全になるのか? 利用者と開発者、双方のメリット
この記事を読み終える頃には、あなたは「Googleでログイン」ボタンの裏側で何が起きているのかを自信を持って説明できるようになっているでしょう。それでは、さっそくOIDCの世界へ旅立ちましょう。
第1章:OIDCとは? – 基本のキ
OIDCは「OpenID Connect(オープンアイディー・コネクト)」の略称です。一言でいうと、「安全にユーザー認証を行うための、世界共通のルール(プロトコル)」のことです。
少しだけ専門的な言い方をすると、「OAuth 2.0というフレームワークを拡張して、認証機能を追加したプロトコル」となります。
…といきなり言われても、ピンとこないですよね。大丈夫です。ここで重要なキーワードは「認証」と「OAuth 2.0」の2つです。OIDCを理解するためには、まずこの2つのキーワード、特に「認証」と、それによく似た「認可」という言葉の違いをはっきりさせておく必要があります。これはOIDCを理解する上で最も重要な基礎知識です。
「認証」と「認可」- 似ているようで全く違う2つの言葉
「認証」と「認可」は、セキュリティの世界では明確に区別されますが、日常生活では混同されがちです。ここで、ホテルの例えを使って違いを理解しましょう。
認証(Authentication)とは:「あなたは誰ですか?」を確認すること
- 意味: 通信の相手が、名乗っている通りの本人であることを確認するプロセスです。
- ホテルの例え: あなたがホテルのフロントでチェックインする場面を想像してください。あなたは予約者本人であることを証明するために、運転免許証やパスポートなどの身分証明書を提示します。フロントスタッフがその身分証明書を見て、「確かに、予約された〇〇様ご本人ですね」と確認する行為。これが「認証」です。
- Webサービスでの例: IDとパスワードを入力してログインする行為。「あなたは登録ユーザー本人ですか?」を確認しています。
認可(Authorization)とは:「あなたに何をする権限がありますか?」を許可すること
- 意味: 認証された相手に対して、特定のリソース(情報や機能)へのアクセス権を与えるプロセスです。
- ホテルの例え: 認証が終わると、フロントスタッフはあなたに部屋のカードキーを渡してくれます。このカードキーを使えば、あなたは自分の部屋のドアを開けることができますが、他の人の部屋や、スタッフ専用のバックヤードのドアを開けることはできません。つまり、カードキーは「予約した部屋に入る」という特定の行動を「許可」された証です。これが「認可」です。
- Webサービスでの例: 写真加工アプリに「あなたのGoogleフォトにある写真へのアクセスを許可しますか?」と聞かれ、「許可」ボタンを押す行為。これにより、写真加工アプリはあなたのGoogleフォトを読み取る「権限」を得ます。
この違いを理解した上で、先ほどのOIDCの説明に戻りましょう。
OIDCの土台となっている「OAuth 2.0」という技術は、もともと「認可」のためのプロトコルでした。「あるサービス(例:写真加工アプリ)が、ユーザーの許可のもと、別のサービス(例:Googleフォト)のデータにアクセスする」といったシナリオで使われます。OAuth 2.0は、まさにホテルでいう「カードキー」を安全に受け渡しするためのルールなのです。
しかし、OAuth 2.0だけでは、「カードキー(アクセストークン)」は手に入りますが、「このカードキーを持っているのは一体誰なのか?」というユーザー本人に関する情報(身分証明書)を標準的な方法で取得する仕組みがありませんでした。
そこで登場したのがOIDCです。OIDCは、OAuth 2.0の「認可」の仕組みに、「認証」という層をきれいに上乗せしました。つまり、「カードキー(アクセストークン)」の受け渡しに加えて、「顔写真付きの身分証明書(IDトークン)」も一緒に発行してもらうためのルールを定めたのです。
- OAuth 2.0 = 認可(何ができるか)
- OIDC = 認証(誰であるか) + 認可(何ができるか)
この関係性さえ押さえれば、OIDCの核心にグッと近づけます。
第2章:OIDCが登場する前の世界 – なぜ必要になったのか?
便利な技術は、必ず何かしらの「不便」や「課題」を解決するために生まれます。OIDCが広く使われるようになった背景には、主に3つの大きな課題がありました。
課題1:パスワードの乱立と「パスワード疲れ」
インターネットが普及し、私たちは数えきれないほどのWebサービスを利用するようになりました。そのたびに、新しいIDとパスワードを作成しなければなりません。
- 数十個、人によっては百個以上のパスワードを管理しなければならない。
- 強力なパスワードをサービスごとに作るのは大変。
- 結果として、覚えやすい単純なパスワードや、複数のサービスでのパスワードの使い回しが横行。
この状態は「パスワード疲れ(Password Fatigue)」と呼ばれ、ユーザーに多大なストレスを与えるだけでなく、セキュリティ上も非常に危険な状態でした。一つのサービスでパスワードが漏洩すると、芋づる式に他のサービスへの不正アクセスを許してしまう「クレデンシャル・スタッフィング攻撃」の温床となっていたのです。
課題2:独自実装される認証機能のコストとリスク
サービス提供者側にも悩みがありました。ユーザーに安全にログインしてもらうための「認証機能」を、サービスごとに一から開発する必要があったのです。
- 開発コスト: ログイン画面、パスワード設定・変更・リセット機能、データベースでの安全なパスワード保管(ハッシュ化など)…これらをすべて自前で開発・保守するのは大変なコストがかかります。
- セキュリティリスク: 認証機能は、サービスの最も重要なセキュリティの要です。もし実装に脆弱性があれば、そこを突かれてユーザー情報が丸ごと盗まれる可能性があります。セキュリティの専門知識がない開発者が、安全な認証機能をゼロから作るのは非常に困難で、リスクが高い行為でした。
課題3:OAuth 2.0だけでは「ログイン」には不十分だった
前章で述べた通り、OIDCの登場以前にも「認可」のためのOAuth 2.0は存在しました。これを利用して「ソーシャルログイン」のような機能を実現しようという試みはありました。
例えば、あるサービスがOAuth 2.0を使ってGoogleにリクエストし、「アクセストークン(カードキー)」を取得します。そして、そのアクセストークンを使って、Googleが提供する「ユーザー情報取得API」にアクセスし、ユーザーの名前やメールアドレスを取得して、そのユーザーがログインしたものとみなす…という方法です。
しかし、これには問題がありました。
- 標準化されていない: ユーザー情報を取得するためのAPIの仕様は、Google、Facebook、Twitterなど、各社でバラバラでした。そのため、開発者は接続したいサービスごとに個別の実装をしなければならず、手間がかかりました。
- 「認証」の証明ではない: アクセストークンは、あくまで「リソースにアクセスする権限」を示すものであり、「ユーザーが確かにその場で認証された」という事実を直接証明するものではありませんでした。
この「OAuth 2.0を使ったログイン機能は、各社が独自拡張したバラバラの実装になっていて、相互運用性がない。認証の証拠となる標準的な方法も欲しい!」という強いニーズに応える形で、OAuth 2.0の上に「認証」の標準レイヤーとしてOIDCが策定されたのです。
第3章:OIDCの登場人物と重要なアイテム
OIDCの仕組みを理解するために、まずは物語の登場人物と、彼らが使う重要なアイテム(専門用語)を紹介します。ここをしっかり押さえると、後のフロー解説が驚くほどスムーズに頭に入ってきます。
OIDCの登場人物
OIDCの物語には、主に3人の登場人物がいます。
-
ユーザー (User / End-User)
- 役割: サービスの利用者。あなた自身です。
- 例え: クラブに入りたいと思っている「あなた」。
-
RP (Relying Party / リライング・パーティ)
- 役割: ユーザーに認証を求めるサービス。OIDCを利用してログイン機能を提供する側のアプリケーションです。
- 例え: あなたが入館したい「クラブ」そのもの。RPは「Relying Party(信頼する側)」の略で、後述するOPを「信頼して」認証を任せる、という意味合いです。
- 具体例: あなたが「Googleでログイン」ボタンを押した、その先のWebサービス(例:note、Tabelogなど)。
-
OP (OpenID Provider / オープンIDプロバイダー)
- 役割: ユーザーのID情報を管理し、RPからの要求に応じてユーザーを認証するサービス。
- 例え: 身分証明書を発行・確認してくれる「役所」や「クラブの受付(セキュリティゲート)」。
- 具体例: Google, Apple, Microsoft, LINE, Yahoo! JAPANなど、IDを発行している大手プラットフォーマー。IDaaS (Identity as a Service) と呼ばれるOktaやAuth0などもOPです。
OIDCの重要なアイテム(トークン)
登場人物たちがやり取りする情報の中でも、特に重要なのが「トークン」と呼ばれるデータです。OIDCでは主に3種類のトークンが使われます。
-
IDトークン (ID Token)
- 役割: OIDCの主役。ユーザーが認証された証となる「身分証明書」です。
- 中身: 「誰が (ユーザーID)」「誰によって (OP)」「誰のために (RP)」「いつ」認証されたか、といった情報がJSON形式で記録されています。
- 特徴: JWT (JSON Web Token) という標準形式で作られており、電子署名によって改ざんされていないことを検証できます。RPは、このIDトークンを受け取って中身を検証することで、ユーザーが本人であることを確認し、ログインを許可します。
-
アクセストークン (Access Token)
- 役割: OAuth 2.0から引き継がれたもので、保護されたリソースにアクセスするための「鍵(カードキー)」です。
- 使い方: RPは、このアクセストークンを使って、OPが管理しているAPI(例:ユーザーのプロフィール情報を取得するAPI)にアクセスします。
- 特徴: 通常、中身はRPにとって意味不明な文字列です。RPはこのトークンを鍵としてOPに提示するだけで、中身を解読する必要はありません。
-
リフレッシュトークン (Refresh Token)
- 役割: 新しいアクセストークンを取得するための「引換券」です。
- 背景: セキュリティのため、アクセストークンは有効期限が短く設定されています(数分~数時間程度)。有効期限が切れるたびにユーザーに再ログインを求めるのは不便です。
- 使い方: そこで、RPは有効期限の長いリフレッシュトークンを安全な場所に保管しておき、アクセストークンの有効期限が切れたら、このリフレッシュトークンを使ってOPに新しいアクセストークンを発行してもらいます。これにより、ユーザーは再ログインすることなく、サービスを継続して利用できます。
これらの登場人物とアイテムの関係を頭に入れて、いよいよOIDCの具体的な認証フローを見ていきましょう。
第4章:OIDCの認証フローを徹底解説 – 「Googleでログイン」の裏側で何が起きているか?
ここが本記事の核心部分です。最も一般的で安全な「認可コードフロー (Authorization Code Flow)」を例に、あなたが「Googleでログイン」ボタンを押してから、ログインが完了するまでの流れを、ステップ・バイ・ステップで追いかけていきましょう。
【物語の舞台設定】
* ユーザー: あなた
* RP (クラブ): 「CoolApp」という新しいWebサービス
* OP (受付): Google
Step 1:ログインの開始
あなたは「CoolApp」を使ってみたいと思い、サイトを訪れました。会員登録画面には「メールアドレスで登録」の隣に、「Googleでログイン」というボタンがあります。あなたはIDとパスワードを新しく作るのが面倒なので、迷わずこのボタンをクリックします。
[あなた] --(「Googleでログイン」をクリック)--> [CoolApp (RP)]
Step 2:OPへのリダイレクト(認証のお願い)
「Googleでログイン」ボタンが押されると、CoolApp (RP) は、あなたのブラウザに対して「Googleの認証ページに行ってください!」という指示を出します(これをリダイレクトと言います)。
このとき、ただ単にGoogleのトップページに飛ばすわけではありません。URLの後ろに、たくさんの情報を付けて送り出します。
https://accounts.google.com/o/oauth2/v2/auth?
response_type=code&
client_id=coolapp-client-id-12345&
scope=openid%20profile%20email&
redirect_uri=https://coolapp.com/callback&
state=xyz...&
nonce=abc...
この長いURLに含まれるパラメータが非常に重要です。
response_type=code
:「認可コードをください」というリクエスト方法(認可コードフロー)を指定しています。client_id
:CoolAppが事前にGoogleに登録した際にもらったIDです。「私はCoolAppです」と名乗っています。scope
:CoolAppがGoogleから欲しい情報の種類(権限)を要求しています。openid
:これが最重要!この文字列が含まれていることで、Googleは「これはOIDCの認証リクエストだな」と判断します。これがなければただのOAuth 2.0のリクエストになります。profile
:名前やプロフィール写真などの基本情報が欲しい、という要求。email
:メールアドレスが欲しい、という要求。
redirect_uri
:認証が終わった後に、Googleがユーザーを戻すべきCoolAppのページのURLです。Googleは、事前に登録されたURL以外にはユーザーを戻しません。これにより、悪意のあるサイトにリダイレクトされるのを防ぎます。state
,nonce
:セキュリティを高めるためのランダムな文字列です(後述)。
[CoolApp (RP)] --(上記URLでリダイレクト指示)--> [あなたのブラウザ] --(リクエスト)--> [Google (OP)]
Step 3:OPでの認証と同意
リダイレクトされたあなたのブラウザには、見慣れたGoogleのログイン画面が表示されます。あなたはGoogleのIDとパスワードを入力してログインします。(すでにGoogleにログイン済みの場合は、このステップは省略されます)。
ログインに成功すると、Googleは次に「同意画面 (Consent Screen)」を表示します。
「CoolAppが次の許可をリクエストしています:」
* あなたの名前、メールアドレス、言語、プロフィール写真の表示
* …
これは、「CoolAppに、あなたのこれらの個人情報を提供してもよろしいですか?」という最終確認です。あなたが内容を確認し、「許可」ボタンを押します。
[Google (OP)] <--(ID/PW入力 & 同意)--> [あなた]
Step 4:RPへのリダイレクト(認可コードの発行)
あなたが「許可」すると、Google (OP) は、Step 2で指定された redirect_uri
(https://coolapp.com/callback
)に、あなたのブラウザを再びリダイレクトさせます。
このとき、URLの後ろに「認可コード (Authorization Code)」という、一時的な使い捨ての短いコードを付けて返します。
https://coolapp.com/callback?code=asdfghjkl12345&state=xyz...
[Google (OP)] --(認可コード付きURLでリダイレクト指示)--> [あなたのブラウザ] --(認可コードを渡す)--> [CoolApp (RP)]
【なぜ直接トークンを渡さないの?】
ここで、「なぜIDトークンやアクセストークンを直接ブラウザに返さないの?」という疑問が湧くかもしれません。それはセキュリティのためです。ブラウザ(フロントエンド)を経由する通信は、URLが履歴に残ったり、悪意のあるブラウザ拡張機能などによって盗聴されたりするリスクがあります。
そこで、重要なトークンは直接渡さず、まずは有効時間が短く(通常10分以内)、一度しか使えない「引換券」である認可コードを渡します。本当のトークン交換は、この後、サーバー同士の安全な裏ルート(バックチャネル)で行います。
Step 5:トークンのリクエスト(サーバー間通信)
あなたのブラウザから認可コードを受け取ったCoolApp (RP) のサーバーは、今度は裏側で、Google (OP) のトークンエンドポイントと呼ばれる専用の窓口に直接通信を行います。これはあなたのブラウザを介さない、サーバー同士の安全な通信です。
CoolAppは、このリクエストに以下の情報を含めます。
- 認可コード: 先ほど受け取った
asdfghjkl12345
。 client_id
:「私はCoolAppです」という自己紹介。client_secret
:CoolAppがGoogleに事前登録した際に受け取った、誰にも見せてはいけない「秘密のパスワード」。これにより、このリクエストが本当にCoolAppのサーバーから送られたものであることをGoogleが確認できます。grant_type=authorization_code
:「認可コードをトークンに交換してください」というリクエストの種類。redirect_uri
:念のため、最初の要求と一致しているかを確認します。
[CoolApp (RP) のサーバー] --(認可コード, client_secretなど)--> [Google (OP) のトークンエンドポイント]
Step 6:トークンの発行
リクエストを受け取ったGoogle (OP) は、送られてきた情報を検証します。
「client_id
と client_secret
は正しいか?」「この認可コードは私が発行したもので、まだ使われていないか?」などをチェックします。
すべてが正しければ、Googleはついに、お目当ての3種類のトークンをCoolAppのサーバーに返します。
- IDトークン(身分証明書)
- アクセストークン(カードキー)
- リフレッシュトークン(引換券)
[Google (OP)] --(IDトークン, アクセストークン, リフレッシュトークン)--> [CoolApp (RP) のサーバー]
Step 7:IDトークンの検証とログイン完了
トークンを受け取ったCoolApp (RP) は、いよいよ最後の仕上げに入ります。まず、最も重要なIDトークンが本物で、内容が正しいかを徹底的に検証します。
- 署名の検証: Googleの公開鍵を使って、IDトークンの署名が正しいかを確認します。これにより、IDトークンが輸送中に誰にも改ざんされていないことを保証します。
- 発行者の検証 (
iss
): 発行者が、期待通りGoogle (https://accounts.google.com
) であることを確認します。 - 対象者の検証 (
aud
): このIDトークンの宛先が、自分自身(CoolAppのclient_id
)であることを確認します。他のサービス宛てのIDトークンを使いまわされていないかをチェックします。 - 有効期限の検証 (
exp
): 有効期限が切れていないかを確認します。 nonce
の検証: Step 2で送ったnonce
と、IDトークンに含まれるnonce
が一致するかを確認します。これにより、途中で攻撃者にレスポンスを横取りされて悪用される「リプレイ攻撃」を防ぎます。
これらの検証をすべてクリアして、初めてCoolAppは「このユーザーは、確かにGoogleによって認証された本人である」と確信できます。
そして、IDトークンの中からユーザーの識別子 (sub
) やメールアドレス (email
) を取り出し、CoolAppのデータベースにユーザー情報を登録(または更新)し、あなたをログイン状態にします。あなたのブラウザには「CoolAppへようこそ!」という画面が表示され、無事にログインが完了します。
(オプション)Step 8:UserInfoエンドポイントへのアクセス
もし、IDトークンに含まれている情報(名前、メールアドレスなど)だけでは足りず、もっと詳しい情報(例:誕生日や性別など、scope
で要求したもの)が必要な場合、CoolApp (RP) は、Step 6で受け取ったアクセストークン(カードキー)を使います。
このアクセストークンを提示して、Google (OP) のUserInfoエンドポイントという別のAPI窓口にアクセスすることで、追加のユーザー情報を取得することができます。
[CoolApp (RP)] --(アクセストークンを提示)--> [Google (OP) のUserInfoエンドポイント]
[Google (OP)] --(追加のユーザー情報を返す)--> [CoolApp (RP)]
以上が、OIDCの認可コードフローの全貌です。一見複雑に見えますが、一つひとつのステップには、セキュリティを確保するための明確な理由があることがお分かりいただけたかと思います。
第5章:IDトークンの中身を覗いてみよう
OIDCの心臓部であるIDトークン。これはJWT(JSON Web Token、”ジョット”と読む) という形式の文字列です。実際のIDトークンは、このような非常に長い文字列に見えます。
eyJhbGciOiJSUzI1NiIsImtpZCI6IjEyMzQ1...
(ヘッダー)
.
eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5j...
(ペイロード)
.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c...
(署名)
この文字列は、ピリオド (.
) で区切られた3つのパートから構成されています。
- ヘッダー (Header): トークンの種類(JWT)や、署名に使われているアルゴリズム(例:
RS256
)などの情報が、Base64Urlエンコードされて格納されています。 - ペイロード (Payload): トークンの本体。ユーザー情報や認証に関する情報(これを「クレーム (Claims)」と呼びます)がJSON形式で格納され、同じくBase64Urlエンコードされています。
- 署名 (Signature): ヘッダーとペイロードを、OPの秘密鍵で署名したものです。これにより、トークンの改ざんを検知できます。
ペイロード部分をデコードすると、以下のようなJSONデータが現れます。これらが「クレーム」です。
json
{
"iss": "https://accounts.google.com",
"sub": "110169484474386276334",
"aud": "coolapp-client-id-12345.apps.googleusercontent.com",
"exp": 1678886400,
"iat": 1678882800,
"nonce": "abc...",
"name": "Taro Yamada",
"picture": "https://lh3.googleusercontent.com/a/AATXAJz...",
"email": "[email protected]",
"email_verified": true
}
主要なクレームの意味は以下の通りです。
iss
(Issuer): 発行者。どのOPが発行したかを示す。sub
(Subject): 主体。そのOP内でユーザーを一意に識別するID。RPはこのIDをユーザーのキーとして利用すべきです。aud
(Audience): 対象者。このトークンがどのRP(クライアント)向けのものかを示す。exp
(Expiration Time): 有効期限。この日時を過ぎたトークンは無効です。iat
(Issued At): 発行日時。いつ発行されたトークンかを示します。nonce
: リプレイ攻撃を防ぐための値。name
,picture
,email
など:scope
で要求した、ユーザーのプロフィール情報。
RPは、これらのクレームを検証することで、安全にユーザーを認証できるのです。
第6章:OIDCがもたらす絶大なメリット
OIDCの仕組みがわかったところで、改めてOIDCがもたらすメリットを、ユーザー側と開発者(サービス提供者)側の両面から整理してみましょう。
ユーザーにとってのメリット
-
利便性の向上(パスワード疲れからの解放):
複数のサービスで同じID(例:Googleアカウント)を使い回せるため、新しいサービスごとにIDとパスワードを覚える必要がなくなります。数クリックで安全に新規登録やログインが完了し、非常に快適です。 -
セキュリティの向上:
認証処理を、GoogleやAppleといったセキュリティ対策に巨額の投資を行っている信頼性の高いプラットフォーマーに一任できます。怪しいかもしれない新規サービスに直接パスワードを入力する必要がないため、フィッシング詐欺などのリスクを大幅に低減できます。また、OP側で二要素認証などを設定しておけば、その強力なセキュリティがOIDCでログインするすべてのRPにも適用されます。
開発者・サービス提供者(RP)にとってのメリット
-
開発コストと期間の削減:
複雑でセキュリティリスクの高い認証機能を自前で開発・保守する必要がなくなります。OIDCに対応したライブラリを使えば、比較的簡単に堅牢なログイン機能を実装でき、本来のサービス開発に集中できます。 -
セキュリティの強化:
認証という最もクリティカルな部分を、セキュリティの専門家集団であるOPに任せることができます。これにより、自社で実装した場合に起こりうる脆弱性のリスクを回避し、ユーザーに安全なサービスを提供できます。 -
コンバージョン率の向上:
ユーザーにとって、新規登録は非常に面倒なプロセスです。「ソーシャルログイン」という簡単な選択肢を用意することで、登録のハードルが劇的に下がり、新規ユーザー獲得率(コンバージョン率)の向上が期待できます。ユーザーは使い慣れたアカウントで安心してサービスを使い始めることができます。
第7章:その他のOIDCフローと関連技術
これまで最も標準的な「認可コードフロー」を解説してきましたが、OIDCには他にもいくつかのフローや、関連する重要な技術仕様が存在します。
PKCE(Proof Key for Code Exchange)
「ピクシー」と読みます。これは認可コードフローをさらに安全にするための拡張仕様で、現在では事実上の必須技術となっています。
背景:
認可コードフローでは、RPがclient_secret
を安全に保管できるサーバーを持っていることが前提でした。しかし、スマートフォンアプリや、ブラウザ上だけで動作するSPA(Single Page Application)のような「パブリッククライアント」は、client_secret
を安全に隠しておく場所がありません。
このようなクライアントが認可コードフローを使うと、悪意のあるアプリが偽のredirect_uri
を使って割り込み、認可コードを横取りしてしまう「認可コード横取り攻撃」のリスクがありました。
PKCEの仕組み:
PKCEは、この攻撃を防ぐために動的な「鍵」の仕組みを導入します。
- RPはリクエストのたびに、ランダムな文字列
code_verifier
を生成します。 code_verifier
をハッシュ化してcode_challenge
という値を作ります。- Step 2の認証リクエストの際に、この
code_challenge
をOPに送ります。 - Step 5のトークンリクエストの際に、ハッシュ化する前の元の文字列
code_verifier
をOPに送ります。 - OPは、受け取った
code_verifier
を同じ方法でハッシュ化し、それが最初に受け取ったcode_challenge
と一致するかを検証します。
これにより、たとえ認可コードが途中で盗まれても、元のcode_verifier
を知らない攻撃者はトークンを取得することができません。このPKCEの仕組みがあるおかげで、client_secret
を持てないモバイルアプリやSPAでも、安全に認可コードフローを利用できるのです。現在では、サーバーサイドアプリであっても、多層防御の観点からPKCEを併用することが推奨されています。
その他のフロー
- インプリシットフロー (Implicit Flow): 認可コードを介さず、OPから直接ブラウザにIDトークンやアクセストークンを返す、より単純なフローです。かつてはSPAで利用されていましたが、トークンがブラウザのURL履歴に残るなどセキュリティリスクが高いため、現在では非推奨とされています。PKCE付き認可コードフローの使用が強く推奨されます。
- ハイブリッドフロー (Hybrid Flow): 認可コードフローとインプリシットフローを組み合わせたものです。フロントエンドとバックエンドで同時にトークンが必要な、特定の高度なユースケースで利用されます。
関連プロトコル:SAML
OIDCとしばしば比較される技術にSAML (Security Assertion Markup Language) があります。SAMLもOIDCと同様に、異なるドメイン間で認証情報を受け渡し、シングルサインオン(SSO)を実現するためのプロトコルです。
- 主な利用シーン: SAMLは、主に企業内システムやB2Bのクラウドサービス間の連携など、エンタープライズ領域で古くから広く使われています。
- 技術的な違い: SAMLがXMLベースで通信を行うのに対し、OIDCはJSON/RESTベースです。そのため、OIDCはWeb APIやモバイルアプリとの親和性が非常に高く、モダンな開発環境で扱いやすいという特徴があります。
一般的に、コンシューマー向けのWeb/モバイルサービスではOIDCが、エンタープライズ向けのSSOではSAMLが使われることが多い、と覚えておくと良いでしょう。(ただし、近年はエンタープライズ領域でもOIDCの採用が増えています)
まとめ:OIDCは現代の認証のデファクトスタンダード
長い旅路でしたが、OIDCの世界を巡ってきました。最後に、この記事の要点をまとめましょう。
- OIDC (OpenID Connect) は、OAuth 2.0を土台として「認証」の機能を追加した、世界共通のプロトコルです。
- 「認証(あなたは誰?)」と「認可(何ができる?)」の違いを理解することが、OIDCを理解する鍵です。
- OIDCは、RP (サービス提供者)、OP (IDプロバイダー)、そしてユーザーの三者間で、安全に認証情報をやり取りする仕組みを提供します。
- その中心にあるのが、ユーザーの身分証明書である「IDトークン (JWT形式)」です。
- 最も安全で標準的な「PKCE付き認可コードフロー」では、サーバー間の安全な通信(バックチャネル)を利用してトークンを交換することで、高いセキュリティを実現しています。
- OIDCは、ユーザーには利便性と安全性を、開発者には開発コスト削減とセキュリティ強化という大きなメリットをもたらします。
「Googleでログイン」ボタンは、もはや単なる便利な機能ではありません。それは、複雑なインターネットの世界で、私たちのアイデンティティを安全かつ円滑に繋ぎとめる、非常に洗練された技術基盤なのです。
次にあなたがこのボタンをクリックするとき、その裏側で繰り広げられる登場人物たちの見事な連携プレーを、ぜひ思い浮かべてみてください。OIDCへの理解は、あなたがより安全に、そしてより深くインターネットと付き合っていくための、強力な武器となるはずです。