情報処理技術者試験解説チャンネル

応用情報技術者試験をはじめとする情報処理技術者試験の午後問題では、「過去10年分を確実に理解しているか」が合格ラインを左右するといわれています。当チャンネルでは、その10年分の午後問題を要点だけに絞り、約10分のコンパクトな解説としてまとめました。限られた時間でも効率よく学習を進められる構成です。

OAuth 2.0 と OIDC(OpenID Connect)の違いについてわかりやすく解説します

OAuth 2.0 とは

OAuth 2.0 は、認可(Authorization)のためのプロトコルです。これは、ユーザーが第三者のアプリケーションに自身のリソースへのアクセス権を与えるための仕組みです。

例えば、あるアプリがユーザーの Google Drive に保存されたファイルを読み取る許可を得たい場合、OAuth 2.0 を利用すると、ユーザーが Google に対して明示的に許可を与えることで、そのアプリが Google Drive のデータにアクセスできるようになります。

OAuth 2.0 は、以下の 4 つの主要なロールを持っています。

  1. リソースオーナー(Resource Owner) - 一般的にはユーザーであり、リソースへのアクセス権を持っている。
  2. クライアント(Client) - アクセスを要求するアプリケーション。
  3. 認可サーバー(Authorization Server) - ユーザー認証を行い、適切なアクセストークンを発行する。
  4. リソースサーバー(Resource Server) - クライアントがアクセスしたい API を提供するサーバー。

OAuth 2.0 のフローの一例として「認可コードフロー(Authorization Code Flow)」を見てみましょう。

import requests

# 認可コードを取得(ユーザーがブラウザで認可した後のリダイレクトURLに含まれる)
authorization_code = "example_code"

# アクセストークンを取得
TOKEN_URL = "https://example.com/oauth/token"
CLIENT_ID = "your_client_id"
CLIENT_SECRET = "your_client_secret"
REDIRECT_URI = "https://yourapp.com/callback"

response = requests.post(TOKEN_URL, data={
    "grant_type": "authorization_code",
    "code": authorization_code,
    "redirect_uri": REDIRECT_URI,
    "client_id": CLIENT_ID,
    "client_secret": CLIENT_SECRET
})

token_data = response.json()
access_token = token_data.get("access_token")
print("Access Token:", access_token)

このように、OAuth 2.0 はユーザーの認証(Authentication)ではなく、認可(Authorization) に焦点を当てています。

OIDC(OpenID Connect)とは

OIDC(OpenID Connect)は、OAuth 2.0 を拡張して「認証(Authentication)」の仕組みを提供するプロトコルです。

OAuth 2.0 の問題点の一つとして、取得したアクセストークンが「そのユーザーのもの」であることを保証する仕組みがないことが挙げられます。OIDC では、ID トークン(ID Token)と呼ばれる JSON Web Token(JWT)を利用することで、ユーザーの認証情報をやり取りできるようになっています。

OIDC の基本的なフローは OAuth 2.0 に似ていますが、認可サーバーがアクセストークンと一緒に ID トークンを発行する点が異なります。

以下は、OIDC を用いた ID トークンの取得例です。

import jwt
import requests

# OIDC 認可コードから ID トークンを取得
TOKEN_URL = "https://example.com/oauth/token"
authorization_code = "example_code"

response = requests.post(TOKEN_URL, data={
    "grant_type": "authorization_code",
    "code": authorization_code,
    "redirect_uri": REDIRECT_URI,
    "client_id": CLIENT_ID,
    "client_secret": CLIENT_SECRET,
    "scope": "openid profile email"
})

token_data = response.json()
id_token = token_data.get("id_token")

# ID トークンのデコード(公開鍵を用いて検証するのが推奨)
decoded_token = jwt.decode(id_token, options={"verify_signature": False})
print("User Info:", decoded_token)

ID トークンをデコードすると、以下のような情報が得られます。

{
    "iss": "https://example.com",
    "sub": "1234567890",
    "aud": "your_client_id",
    "exp": 1712345678,
    "iat": 1712341234,
    "email": "user@example.com",
    "name": "John Doe"
}

OIDC を使うことで、「このアクセストークンの持ち主は誰なのか?」を簡単に確認できるようになります。

OAuth 2.0 と OIDC の違い

比較項目 OAuth 2.0 OIDC
主な目的 認可(Authorization) 認証(Authentication)+認可
トークンの種類 アクセストークン(Access Token) アクセストークン + ID トークン(ID Token)
ユーザー情報 アクセストークンのみでは分からない ID トークンを通じて取得可能
用途 API への安全なアクセス管理 ユーザーの認証と情報取得

OAuth 2.0 は「誰がアクセスしているか」を保証しないため、認証にそのまま利用するのは危険です。一方で、OIDC は認証のために設計されているため、安全にユーザーを識別できます。

まとめ

OAuth 2.0 は「認可」に特化したプロトコルであり、認証には向いていません。OIDC は OAuth 2.0 を拡張して「認証」を提供し、安全にユーザー情報を取得できる仕組みを持っています。

そのため、「API にアクセス権を与えるだけなら OAuth 2.0」「ログイン認証が必要なら OIDC」と使い分けるのが一般的です。

実際の開発では、GoogleMicrosoft などの ID プロバイダーが提供する OIDC を利用することで、より安全な認証を実現できます。