概要
- OAuth は2007年に Twitter で誕生
- 第三者アプリ が安全にユーザー代理で操作する仕組み
- アクセス・トークン が中心的役割
- ユーザー同意 と 認可コードフロー が基本構造
- セキュリティ設計 と用語整理が理解の鍵
OAuth誕生の背景と課題
- 2007年、Twitter でOAuthが誕生
- 第三者アプリ がユーザー代理でツイート投稿を希望
- 当時は ユーザー名・パスワード をアプリに直接入力する方式が主流
- この方法は パスワード漏洩 や 悪用リスク が高い
- APIキー も存在したが、ユーザー単位での制御ができず不十分
OAuthの基本的な仕組み
- OAuth は アクセス・トークン を中心に設計
- アプリはユーザーごとに 固有のトークン を取得
- ユーザーの代理で安全に操作やデータ取得が可能
- 複数の利用パターン があり、理解が難しくなりがち
OAuthフローのユーザー体験例
- YNAB (家計簿アプリ)と Chase Bank の連携例
- YNABからChaseへのリダイレクト
- Chaseでログインとアクセス許可(例:口座選択)
- ChaseからYNABへリダイレクト
- YNABがChaseデータにアクセスできる状態
OAuthフローの裏側
- 最終目標は OAuthクライアント (例:YNAB)が アクセス・トークン を取得すること
- 認可サーバー(例:Chase)はリダイレクト時に 認可コード を付与
- アプリは バックエンドから認可サーバーへPOST し、認可コードと クライアントシークレット を送信
- サーバー間通信で アクセス・トークン を安全に取得
OAuthの用語整理
- リソースオーナー :ユーザー本人
- OAuthクライアント :連携アプリ(例:YNAB)
- 認可サーバー :ログインや認可を担当(例:Chase)
- リソースサーバー :ユーザーデータを管理(認可サーバーと同一の場合あり)
- スコープ :許可する操作やデータ範囲
OAuthの開発者視点
- アプリ登録が必要
- アプリ名、 リダイレクトURI を認可サーバーに登録
- クライアントID (公開用)と クライアントシークレット (秘密)を取得
- OAuthフロー開始時
- クライアントID、リダイレクトURI、レスポンスタイプ(通常は"code")、スコープを付与して認可サーバーへリダイレクト
- 認可サーバーはリクエストを検証し、ユーザーに同意画面を表示
リダイレクトURIとセキュリティ
- リダイレクトURI はアプリ登録時に限定
- 悪意のあるサイトへのリダイレクトを 防止
- モバイルアプリの場合は カスタムスキームURI (例:myapp://foobar)も利用可能
認可コードとトークン交換
- 認可サーバーはリダイレクト時に 認可コード をURLで返却
- アプリは 認可コード と クライアントシークレット を認可サーバーへPOSTし、 アクセス・トークン を取得
- 各ステップでセキュリティ上の考慮が徹底
フロントチャネルとバックチャネル
- OAuthでは フロントチャネル (GET/URLパラメータ)と バックチャネル (POST/暗号化通信)を区別
- クライアントシークレットをフロント側で扱うと 漏洩リスク があるため、通常はバックエンドで交換
- バックエンドがない場合は PKCE(Proof Key for Code Exchange) を利用
- PKCEは クライアントシークレット不要 で、セキュリティを担保
OAuth設計の複雑さの理由
- 度重なるセキュリティ強化 による仕様追加
- ユーザー関与 (同意画面など)によるフロントエンド実装
- フロントチャネルの脆弱性 と バックチャネルの安全性 を両立する工夫
このように、OAuthは 安全性 と ユーザー主体の同意 を両立するために設計された認可フレームワーク。セキュリティの観点から各ステップに多層的な対策が施されている点が特徴です。