1. 認可コードグラント
最も一般的で安全な認可フロー。主にサーバーサイドアプリケーション(コンフィデンシャルクライアント)で使用されます。
特徴
- アクセストークンとリフレッシュトークンの両方を取得可能
- フロントエンドには認可コードのみを渡し、アクセストークンはサーバーサイドで管理
- 認可コードは一時的なものであり、不正利用された場合のリスクを最小限に抑制
2. インプリシットグラント
フロントエンドアプリケーション(パブリッククライアント)向けに設計されたフロー。ただし、セキュリティリスクが高いため現在は非推奨です。
特徴
- 認可コードを使用せず、直接アクセストークンを取得
- リダイレクト URL にアクセストークンが露出
- リフレッシュトークンは取得不可
インプリシットグラントの実装例
- 認可リクエスト
GET https://accounts.google.com/o/oauth2/auth
?response_type=token
&client_id=xxx.apps.googleusercontent.com
&state=abcd
&scope=https://www.googleapis.com/auth/calendar.events
&redirect_uri=http://localhost/callback
2. 認可レスポンス
以下の認可レスポンスでは、URL内に直接アクセストークンが含まれているのが分かります。
これによる漏洩が高いセキュリティリスクに繋がります。
GET http://localhost/callback
#access_token=ya29.a0ARW5m75tvsHFVGFS4...
&token_type=Bearer
&expires_in=3599
&scope=https://www.googleapis.com/auth/calendar.events
パブリッククライアントの推奨実装:PKCE
インプリシットグラントに代わる安全な方法として、PKCE を使用した認可コードグラントが推奨されています。
PKCE の仕組み
PKCE は、認可リクエストとトークン取得リクエストの関連性を証明する仕組みを提供します。
主要な要素
-
code_verifier
:クライアントが生成するランダムな文字列 -
code_challenge
:code_verifier から生成された検証用の値 -
code_challenge_method
:変換方法の指定(plain or S256)
実装手順
-
認可リクエスト時
- 通常の認可コードグラントのパラメータに加えて
-
code_challenge
とcode_challenge_method
を追加
-
トークン取得時
- 通常の認可コードグラントのパラメータに加えて
-
code_verifier
を追加
この方法により、パブリッククライアントでも安全に認可コードグラントを利用できます。