はじめに
OAuthは、GoogleログインやGitHubログインなどでよく使われています。
ただ、「ログイン機能」くらいのイメージで使われることも多く、実際に何をしている仕組みなのかは少し分かりづらいです。
OAuthは認証ではなく、認可のための仕組みです。
この記事では、その違いも含めて整理します。
OAuthは「権限を渡す」仕組み
OAuthをかなり簡単に言うと、
パスワードを渡さずに、限定的なアクセス権だけを渡す仕組み
です。
例えば、
「このアプリにGoogle Driveへのアクセスを許可しますか?」
みたいな画面を見たことがあると思います。
ここで渡されているのはGoogleアカウントのパスワードではなく、「この範囲ならアクセスしていい」という権限です。
OAuthが必要になった理由
OAuthが広まる前は、外部サービスへ直接IDとパスワードを渡すケースもありました。
例えば、
外部アプリ
↓
ユーザーのGoogle ID/PWを入力
↓
外部アプリが全部操作
みたいな形です。
ただ、この方式だと問題がかなり多くなります。
パスワードが漏れればアカウント全体が危険になりますし、どこまでアクセスされているのかも分かりづらくなります。
OAuthでは、代わりに Access Token を使います。
そのため、パスワードそのものを外部アプリへ渡さなくて済みます。
実際にはどう動いているのか
例えば「GitHubでログイン」ボタンを押すと、裏側ではGitHub側の認可画面へ移動します。
ユーザー
↓
自分のWebアプリ
↓
GitHub認可画面
↓
許可
↓
Access Token発行
↓
GitHub APIへアクセス
みたいな流れです。
このとき、GitHub側が
「このアプリへどこまで許可するか」
を管理しています。
Access Tokenとは
OAuthで重要なのが Access Token です。
これは「アクセス権」を表す文字列です。
例えば、
このユーザーのプロフィールだけ読める
みたいな権限を持っています。
つまり、
パスワード = 本人確認
Access Token = 制限付きアクセス権
です。
ここを混同するとOAuthがかなり分かりづらくなります。
OAuthは認証ではない
OAuthはかなり頻繁に「ログイン機能」として説明されます。
ただ、OAuth自体は認証仕様ではありません。
OAuthがやっているのは、
「このアプリへアクセスを許可する」
という認可です。
そのため、
「本当に誰なのか」
まで保証する仕組みは別で必要になります。
OpenID Connect
Googleログインなどで実際によく使われているのは、OAuth単体ではなく OpenID Connect(OIDC)です。
OIDCは、OAuthの上に認証機能を追加した仕様です。
そのため、
OAuth → 認可
OIDC → 認証 + 認可
みたいな関係になります。
なぜOAuth実装は難しいのか
OAuthはかなり広く使われていますが、実装ミスによる脆弱性も多いです。
特に、
- redirect_uri の検証不足
- Token漏洩
- state不備
などは昔から問題になっています。
認可サーバーとの通信が複雑なため、適当に実装するとかなり危険です。
PKCE
最近のOAuthでは、PKCE(Proof Key for Code Exchange)もかなり重要です。
特にSPAやモバイルアプリでは、Authorization Code Flow + PKCE が一般的になっています。
これは、認可コード横取り対策です。
以前のOAuth実装では、Authorization Codeを盗まれるリスクがありました。
PKCEでは、追加検証を入れることでそのリスクを減らしています。
scope
OAuthでは、scopeという概念も重要です。
これは、
どこまでアクセスできるか
を表します。
例えば、
profile
email
read:user
みたいなものです。
scopeを増やすほど取得できる情報も増えます。
そのため、必要最小限にするのが基本です。
OAuthはかなり身近に使われている
OAuthは特別な技術というより、かなり日常的に使われています。
例えば、
- Googleログイン
- GitHubログイン
- Slack連携
- Notion連携
などもOAuthベースです。
最近のWebサービス連携では、ほぼ標準的に使われています。
おわりに
OAuthは「ログイン機能」として見えることが多いですが、実際には認可の仕組みです。
特に、
「パスワードを直接渡さない」
という考え方がかなり重要です。
最近はライブラリ側がかなり隠蔽してくれるので、内部動作を知らなくても使えることは多いです。
ただ、Access Token や scope、認証と認可の違いあたりを理解しておくと、OAuth周りの挙動はかなり追いやすくなります。