OAuth 2.0認可コードフローの解説
OAuth 2.0認可コードグラントタイプの完全なウォークスルー。クライアント、認可サーバー、リソースサーバーがステップバイステップでどのように連携するかを学びます。
詳細な説明
認可コードフロー
認可コードフローは、最も広く使用されているOAuth 2.0グラントタイプであり、バックエンドサーバーを持つWebアプリケーションにおける安全な認証の基盤です。フロントチャネルリダイレクト(ブラウザ)とバックチャネルトークン交換(サーバー間)を含み、アクセストークンをユーザーのブラウザから遠ざけます。
仕組み
認可リクエスト: クライアントはユーザーのブラウザを認可サーバーの
/authorizeエンドポイントにリダイレクトします。response_type=code、client_id、redirect_uri、scope、ランダムなstateパラメータを含みます。ユーザー認証: 認可サーバーがログインページと同意画面を表示します。ユーザーが認証し、権限を付与します。
認可コード: 認可サーバーがクライアントの
redirect_uriに短命のcodeパラメータと元のstateと共にリダイレクトします。トークン交換: クライアントのバックエンドサーバーが認可コード、
client_id、client_secret、redirect_uriを含むPOSTリクエストを/tokenエンドポイントに送信します。アクセストークン: 認可サーバーがすべてを検証し、アクセストークン(およびオプションでリフレッシュトークン)を返します。
APIアクセス: クライアントはリソースサーバーのAPIを呼び出す際に
Authorization: Bearerヘッダーにアクセストークンを含めます。
なぜトークンを直接ではなくコードを使うのか?
認可コードは仲介者として機能します。トークン交換がバックチャネル(サーバー間)で行われるため、アクセストークンがユーザーのブラウザ、ブラウザ履歴、リファラーヘッダーに公開されることはありません。stateパラメータはCSRF攻撃を防ぎ、コールバックがクライアントが開始したリクエストからのものであることを確認します。
セキュリティに関する考慮事項
- コールバックで必ず
stateを検証する - すべてのエンドポイントでHTTPSを使用する
- 認可コードは使い捨てで短命でなければならない(通常10分)
client_secretはサーバーに安全に保存し、クライアントサイドコードには決して含めない
ユースケース
Google、GitHub、または任意のOAuth 2.0プロバイダーを介してユーザーを認証する必要がある従来のWebアプリケーション(例:Node.js/ExpressやDjangoバックエンド)。サーバーがclient_secretを安全に保存し、舞台裏でトークン交換を処理します。