OAuth と OIDC は別の目的
OAuth と OIDC はよく一緒に出てきます。しかし目的が違います。
| 仕組み | 目的 |
|---|---|
| OAuth 2.0 | 権限委譲 |
| OIDC | ログイン認証 |
OAuth は「このアプリに、私のGoogleカレンダーを読む権限を与える」のような仕組みです。
OIDC は「このユーザーは誰か」を確認するログインの仕組みです。
OAuth は権限を渡す
OAuthの中心は、第三者アプリに権限を渡すことです。
たとえば、あるカレンダーアプリがGoogleカレンダーを読みたいとします。
ユーザーはGoogleの画面で「このアプリにカレンダー読み取りを許可しますか」と確認されます。
許可すると、アプリはaccess tokenを受け取ります。このトークンを使って、Google Calendar APIを呼びます。
GET /calendar/v3/users/me/calendarList HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer access_token
このとき重要なのは、「アプリがユーザーのGoogleパスワードを受け取らない」ことです。
OIDC はログインした人を確認する
OIDC は OpenID Connect の略です。OAuth 2.0 の上に、ログイン認証のための仕組みを追加したものです。
OIDCでは、ID Token が登場します。
ID Token には、ログインしたユーザーを表す情報が含まれます。
{
"sub": "google-user-123",
"email": "user@example.com",
"iss": "https://accounts.google.com",
"aud": "client_id"
}
アプリはID Tokenを検証し、「この人はGoogleで認証された user@example.com だ」と判断します。
ポイント: OAuth はAPIを使う権限、OIDC はログインした人の確認です。Googleログインは多くの場合 OIDC を使っています。
access token と ID token の違い
| トークン | 用途 | 受け取る相手 |
|---|---|---|
| access token | APIを呼ぶ | APIサーバ |
| ID token | ログインユーザーを確認する | クライアントアプリ |
| refresh token | access tokenを更新する | OAuthクライアント |
ID Token を外部API呼び出しに使うものではありません。外部APIを呼ぶのは access token です。
BFF 構成での扱い
BFF構成では、OAuth / OIDC のやり取りをBFF側で担当します。
Browser -> BFF -> IdP
Browser <- Cookie <- BFF
BFF -> API with access token
ブラウザには、BFF用の HttpOnly Cookie だけを渡します。外部IdPのaccess tokenやrefresh tokenは、BFF側またはサーバ側ストアで管理します。
これにより、ブラウザのJavaScriptから高価値なトークンを読めない構成にできます。
よくある混乱
Googleログインは OAuth なのか OIDC なのか
ログイン目的ならOIDCです。ただし、OIDCはOAuth 2.0の上に構築されているため、OAuthの用語も出てきます。
access token でログインユーザーを判断してよいか
基本的にはID TokenやUserInfo endpointなど、ログイン認証のための情報を使います。access tokenはAPI利用のためのトークンです。
refresh token をブラウザに置いてよいか
長期的に強い権限を持つため慎重に扱います。BFFやサーバ側ストアで管理する構成が安全側です。
まとめ
OAuth と OIDC は目的が違います。
- OAuth は権限委譲
- OIDC はログイン認証
- access token はAPIを呼ぶためのトークン
- ID token はログインした人を確認するためのトークン
- refresh token はaccess tokenを更新するためのトークン
- BFF構成ではトークンをブラウザに出さずサーバ側で扱う
既存の詳しい解説は OAuth 2.0 / OpenID Connect - 認証・認可の仕組み も参照してください。
参考リソース
- 公式ドキュメント - OAuth と OIDC の違い - ログインと権限委譲を分けて理解する を確認するための一次情報