0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OAuthとは何か

0
Posted at

はじめに

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周りの挙動はかなり追いやすくなります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?