OAuth 2.0の仕組み完全ガイド|認可フレームワークの基礎・4つのロール・PKCEとOIDCの違い

「Googleアカウントでログイン」「外部アプリにGoogleカレンダーやGitHubリポジトリへのアクセスを許可する」など、現代のWebサービスで当たり前のように使われている仕組み。
その根幹を支えているセキュリティ標準規格が「OAuth 2.0(オーオース 2.0)」です。
OAuth 2.0は、第三者のアプリケーションに自分のユーザーIDやパスワードを教えることなく、安全にデータや機能へのアクセス権限を委譲(認可)するための業界標準フレームワークです。
本記事では、OAuth 2.0の基本概念から4つの構成要素(ロール)、標準的な認可フロー(認可コードグラント+PKCE)、トークン管理、そしてOpenID Connect(OIDC)との違いまで図解を交えて徹底的に解説します。

OAuth 2.0とは?なぜ生まれたのか

OAuth 2.0は、サードパーティアプリケーションに対してリソースへの制限付きアクセスを安全に許可するための認可(Authorization)フレームワーク(RFC 6749)です。

従来手法の致命的な問題点:パスワードアンチパターン

OAuthが登場する以前、外部サービス(例えばスケジュール管理アプリA)に自分のGoogleカレンダーを連携させたい場合、ユーザーはアプリAの画面上にGoogleのユーザー名とパスワードを直接入力して渡すしかありませんでした。

パスワード直接共有に伴う深刻なセキュリティリスク

  • 過剰な権限の付与:カレンダーの閲覧だけを許可したいのに、メール(Gmail)やクラウド(Drive)を含むアカウント全体の完全な制御権をアプリ側に渡してしまう。
  • パスワードの漏洩リスク:外部アプリ側のサーバーに生パスワードが保存され、そこがクラッキングされるとメインアカウントごと乗っ取られる。
  • 権限剥奪の困難さ:特定アプリのアクセスだけを取り消す手段がなく、連携解除のためにはGoogleアカウント自体のパスワードを変更するしかない。

これらの問題を抜本的に解決し、「パスワードを第三者に一切開示せず、期間限定かつ範囲を絞ったアクセストークン(鍵)だけを安全に渡す」仕組みとして規格化されたのがOAuth 2.0です。

従来方式(パスワード共有)とOAuth 2.0(トークン委譲)の比較図解
図解:パスワード直接共有のリスクとOAuth 2.0によるトークン委譲の安全性

OAuth 2.0を構成する4つの役割(Roles)

OAuth 2.0のアーキテクチャを理解する上で最も重要なのが、システムに登場する4つの主要な役割(アクター)です。

役割(Role) 役割の概要 具体例
リソースオーナー
(Resource Owner)
データやリソースの所有者(ユーザー本人)。外部アプリにリソースへのアクセスを許可する主体。 Webブラウザを操作する一般ユーザー
クライアント
(Client)
ユーザーのリソースにアクセスしたいサードパーティアプリケーション。 連携を求めるWebサービス、スマホアプリ、SPA
認可サーバー
(Authorization Server)
リソースオーナーの認証と同意確認を行い、クライアントにアクセストークンを発行するサーバー。 Google Accounts, GitHub Auth サーバー
リソースサーバー
(Resource Server)
保護対象のリソース(ユーザーデータ)を保管し、アクセストークンを検証してAPI応答を返すサーバー。 Google Calendar API, Google Drive API
OAuth 2.0を構成する4つの役割の連携構造図
図解:OAuth 2.0を構成する4つの基本ロールと相互連携の全体像

このように、「ユーザー情報を認証・管理するサーバー(認可サーバー)」と「実際のデータを提供するサーバー(リソースサーバー)」が明確に分離されている点が特徴です。

標準的な認可フロー:認可コードグラント(+ PKCE)

OAuth 2.0にはクライアントの種類に応じて複数のフロー(Grant Types)が用意されていますが、現代のWebアプリケーションやモバイルアプリで事実上の標準となっているのが「認可コードグラント(Authorization Code Grant)」です。

認可コードグラントのステップ

  1. 認可リクエスト:クライアントはブラウザを認可サーバーのログイン・同意画面へとリダイレクトさせます。
  2. ユーザーの認証と同意:ユーザーは認可サーバー上でログインし、「アプリAにカレンダーの閲覧を許可しますか?」という同意画面で許可します。
  3. 認可コードの発行:認可サーバーはブラウザを通じて、一時的な引換券である「認可コード(Authorization Code)」をクライアントのリダイレクトURIに返却します。
  4. アクセストークンの交換:クライアントのバックエンドサーバーが、認可コードとクライアントシークレットを添えて認可サーバーに直接POSTリクエストを送信し、「アクセストークン」を受け取ります。
  5. リソースアクセス:クライアントはアクセストークンをヘッダーに付与してリソースサーバーのAPIを呼び出します。
認可コードグラントとPKCEのシーケンス図
図解:認可コードグラント(+ PKCE)における7つの処理ステップ

なぜ直接トークンを渡さず「認可コード」を経由するのか?

ブラウザのURLバーやリダイレクトURLにアクセストークンを直接流してしまうと、ブラウザ履歴やRefererヘッダー、中間者攻撃によってトークンが漏洩する危険性があります。

そのため、一度使い捨ての「認可コード」だけをブラウザ経由で渡し、実際のアクセストークンは安全なサーバー間通信(バックチャネル)で直接交換することで、高い安全性を確保しています。

モバイルやSPAで必須の「PKCE(ピクシー)」とは?

クライアントシークレットを安全に保持できないモバイルアプリやSPA(Single Page Application)では、認可コード横取り攻撃を防ぐためにPKCE(Proof Key for Code Exchange / RFC 7636)の利用が強く推奨・義務化されています。

PKCEでは、リクエスト開始時に動的なランダム文字列(code_verifier)とそのハッシュ値(code_challenge)を生成します。認可コード交換時に元の値を照合することで、途中で認可コードを盗聴した悪意ある第三者がトークンを不正取得することを完全に防ぎます。

アクセストークン・リフレッシュトークン・スコープ

OAuth 2.0におけるセキュリティ制御の中核を担うのが、トークン設計とスコープです。

トークン種別 有効期限 役割と特徴
アクセストークン
(Access Token)
短時間(例:15分〜数時間) リソースサーバーのAPIを叩くための入場券。万が一盗まれても短時間で無効化されるため被害を最小化できる。
リフレッシュトークン
(Refresh Token)
長時間(数日〜数ヶ月) アクセストークンが期限切れになった際、ユーザーに再度ログイン画面を出さずに新しいアクセストークンを発行するための鍵。

スコープ(Scope)による最小権限の原則

スコープとは、アクセストークンが許可する権限の範囲を細かく定義する文字列です(例:scope=openid profile calendar.readonly)。

「カレンダーの閲覧のみ(Read Only)を許可し、イベントの追加・削除権限は与えない」といった制御を行うことで、最小権限の原則(Least Privilege)を徹底できます。

OAuth 2.0 と OpenID Connect (OIDC) の違い

エンジニアの間で最も混同されやすいテーマが「OAuth 2.0」と「OpenID Connect(OIDC)」の違いです。

比較項目 OAuth 2.0 OpenID Connect (OIDC)
主な目的 認可(Authorization):権限の委譲 認証(Authentication):身元の確認
問いかけ 何のリソースにアクセスしてよいか? このユーザーは誰なのか?(本人確認)
発行される成果物 アクセストークン(不透明な文字列またはJWT) IDトークン(JWT形式の身分証明書)
位置付け 認可フレームワークの基盤レイヤー OAuth 2.0の上に構築されたアイデンティティ層

「ソーシャルログイン(Googleでログイン)」を行いたい場合は、OAuth 2.0そのものではなく、OAuth 2.0を拡張してユーザー属性情報(IDトークン)を取得できるようにしたOpenID Connectを使用するのが正しいアプローチとなります。

OAuth 2.0 実装時の重要セキュリティ対策

OAuth 2.0を自社のシステムやAPIに導入する際は、以下のセキュリティ要件を必ず満たす必要があります。

  • state パラメータによるCSRF対策:認可リクエストにランダムなstate値を埋め込み、コールバック時に検証することで、悪意あるユーザーによるアカウント乗っ取り(ログインCSRF)を防止します。
  • リダイレクトURIの厳格な完全一致検証:ワイルドカードや部分一致を許容せず、事前に登録された正規のリダイレクト先URLのみに認可コードを返却します。
  • 常時HTTPS(TLS)通信の徹底:トークンや認可コードの送受信はすべて暗号化通信路で行います。
  • PKCEの適用:SPAやモバイルアプリはもちろん、サーバーサイドアプリにおいてもPKCEの導入が推奨されています。

まとめ

OAuth 2.0は、現代のWebおよびAPIエコシステムにおいて、安全かつスケーラブルな権限管理を実現するための標準技術です。

  • パスワードを外部アプリに渡さない安全な権限委譲フレームワーク。
  • 4つのロール(オーナー・クライアント・認可サーバー・リソースサーバー)の責務分担が明確。
  • 認可コードグラント+PKCEが最もセキュアで推奨される標準フロー。
  • 認可にはOAuth 2.0、ユーザー認証(ログイン)にはOpenID Connectを適切に使い分ける。

アーキテクチャの役割とトークンのライフサイクルを正しく理解し、堅牢で安全なWebサービス・API連携を構築していきましょう。