「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を構成する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 |

このように、「ユーザー情報を認証・管理するサーバー(認可サーバー)」と「実際のデータを提供するサーバー(リソースサーバー)」が明確に分離されている点が特徴です。
標準的な認可フロー:認可コードグラント(+ PKCE)
OAuth 2.0にはクライアントの種類に応じて複数のフロー(Grant Types)が用意されていますが、現代のWebアプリケーションやモバイルアプリで事実上の標準となっているのが「認可コードグラント(Authorization Code Grant)」です。
認可コードグラントのステップ
- 認可リクエスト:クライアントはブラウザを認可サーバーのログイン・同意画面へとリダイレクトさせます。
- ユーザーの認証と同意:ユーザーは認可サーバー上でログインし、「アプリAにカレンダーの閲覧を許可しますか?」という同意画面で許可します。
- 認可コードの発行:認可サーバーはブラウザを通じて、一時的な引換券である「認可コード(Authorization Code)」をクライアントのリダイレクトURIに返却します。
- アクセストークンの交換:クライアントのバックエンドサーバーが、認可コードとクライアントシークレットを添えて認可サーバーに直接POSTリクエストを送信し、「アクセストークン」を受け取ります。
- リソースアクセス:クライアントはアクセストークンをヘッダーに付与してリソースサーバーのAPIを呼び出します。

なぜ直接トークンを渡さず「認可コード」を経由するのか?
ブラウザの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連携を構築していきましょう。
