OAuthとは
OAuth(Open Authorization)
認可プロトコルで、オンライン認可の業界基準。
最新バージョンは2.0
ユーザーが自分のアカウントパスワードを共有せずに、
サードパーティのアプリケーションに自分のデータ(X、Googleなど)へアクセスできるよう設計された基準
具体的にはソーシャルログイン(ID,PWが不要でログインできる)などに使われている
引用元
https://auth0.com/jp/intro-to-iam/what-is-oauth-2
OAuthを利用するメリット
- ユーザビリティの向上:
ユーザーは新たにユーザー名やパスワードを覚える必要なく、既存のソーシャルメディアアカウントを使用してサービスにログインができ、ユーザー体験が向上する。 - 登録の簡素化:
新規ユーザーは、ソーシャルメディアアカウントを使用して簡単に登録できる。これにより、登録プロセスが簡素化され、ユーザーの離脱率低下に貢献。 - セキュリティの強化:
パスワードを直接管理する必要がなくなるため、パスワードリセットやパスワード盗難のリスクが減少します。また、ソーシャルメディアプロバイダーは通常、セキュリティ対策(例えば二段階認証)を提供しています。
認証と認可の違い
-
認証(Authentication)
ユーザーが誰かを証明すること
例:ログイン -
認可(Authorization)
ユーザーができる権限を管理すること
例:非公開ファイルへのアクセス
OAuthの仕組み
構成
-
リソースオーナー(ユーザー)
リソースの持ち主で、アクセスを許可する -
クライアント(アプリ、バックエンドAPIなど)
リソースオーナーに代わり、リソースへアクセスを要求する -
認可サーバー(X API、Google APIなど)
リソースオーナーを認証し、クライアントにアクセストークンを発行する
OAuth2.0において最も重要な役割を果たす
このサーバーは、クライアントからのアクセストークンのリクエストを受信し、認証が成功してリソースオーナーから合意を得たら、アクセストークンを発行します。
認可サーバーは、2つのエンドポイントを公開します。
・認可エンドポイント:インタラクティブな認証とユーザーの合意を取り扱います。
・トークンエンドポイント:マシンtoマシンに関与します。
- リソースサーバー(X、Googleなど)
リソースを管理する
*認可サーバーとリソースサーバーは同一のシステムで統合されてるケースも多い
認可グラントタイプ
クライアントがアクセストークンを取得する方法
・認可コードグラント(こちらが一般的)
・認可コード+PKCE(フロントエンドはこっち)
・インプリシットグラント(フロントエンド向けだが、非推奨)
認可コード
認可サーバーに認可リクエストをして、成功するとアクセストークンを発行するための認可コードを発行してくれる。クライアントはそれを使ってアクセストークンを取得する
認可コードはアクセストークンの引換チケットのようなもの。
ただ、なぜアクセストークンを直接返さないのか?の理由は盗難リスクに備えて、そういう設計になっている。
実際に認可コードはセキュリティを高めるために以下のように設計されている
・有効期間が短い
・1回しか使えない
*インプリシットグラントだと、認可コードなしに直接アクセストークンが付与される
アクセストークン
クライアントがリソースサーバーへリクエストするために必要
リフレッシュトークン
アクセストークンは期限があり、基本的に短いので期限が切れたら新しいアクセストークンを取得するのに使用されるトークン
アクセストークンと一緒に発行されるが、リソースへのアクセスには使わない、あくまで更新の為に使う
アクセストークンの期限:数時間くらい
リフレッシュトークンの期限:数ヶ月とか無期限
*アクセストークンの期限が短くしてあるのは悪用を防ぐため
認可フロー
改めて認可のフローをまとめると、
- 認可リクエスト (Authorization Request)
クライアントがユーザー(リソースオーナー)を認可サーバーにリダイレクトし、認可コードを要求します。 このリクエストには、クライアントID、リダイレクトURI、レスポンスタイプ(code)、および要求されるスコープが含まれます。 - 認可コード (Authorization Code)
ユーザーが認可サーバーで認証し、アクセスを承認すると、認可サーバーはクライアントのリダイレクトURIに認可コードを送信します。 - トークンリクエスト (Token Request)
クライアントは、認可コードを使用して認可サーバーからアクセストークンを要求します。 このリクエストには、クライアントID、クライアントシークレット、認可コード、リダイレクトURI、およびグラントタイプ(authorization_code)が含まれます。 - アクセストークン (Access Token)
認可サーバーはリクエストを検証し、正当であればアクセストークンを発行し、クライアントに返します。 - リソースリクエスト (Resource Request)
クライアントは、取得したアクセストークンを使用してリソースサーバーに保護リソースへのアクセスを要求します。 - 保護リソース (Protected Resource)
リソースサーバーはアクセストークンを検証し、正当であれば要求された保護リソースをクライアントアプリケーションに返します。