OAuth2
OAuth2とは?
- サードパーティアプリに限定的なアクセス権限を与える認可フレームワーク
- 最新版は2.0でRFCで標準化されている
認証
- ユーザが誰であるのかを証明すること
認可
- ユーザができる権限を管理すること
OAuthがない世界
想定リスク
- ID/Password漏洩リスク
- 過剰な権限が与えられるリスク
- 権限管理のリスク
OAuthがある世界
OAuthの特徴
- ID/Passwordは第三者に教えない
- 必要な権限のみ与えられる
- 簡単に権限を剥奪できる
主要なコンポーネント
リソースオーナー
- リソースの所有者
- クライアントに対して権限を委譲する
リソースサーバー
- データ提供するサーバー
- Web APIを提供し、クライアントにデータを提供する
クライアント
- リソースオーナーから権限委譲を得てリソースサーバにアクセスするアプリ
- バックエンドアプリ、スマホアプリなど様々
認可サーバー
- アクセストークンをクライアントに発行するサーバー
- リソースオーナーの認証と認可が必要
OAuth2の仕組み
アクセストークン
- ユーザーが特定の情報やサービスにアクセスする許可証のようなもの
認可グラントタイプ
- アクセストークンとリフレッシュトークの両方を取得するために用いられ、コンフィデンシャルクライアントに最適化されている
スコープ
- クライアントが認可サーバー要求するアクセストークンの権限範囲を通知するもの
認可コード
- クライアントアプリケーションがアクセストークンを取得するための、一時的で使い捨てのパスワードのようなもの
クライアントの種類
コンフィデンシャル(Confidential)
- クレデンシャル情報を安全に保持することができるクライアント
パブリック(Public)
- クレデンシャル情報を安全に保持することができないクライアント
インプリシットグラント
- パブリッククライアントで使われるグラントタイプ
- 認可コードは使わず、リダイレクトを通じて直接アクセストークンを受け渡す
認可コードグラント
- アクセストークンとリフレッシュトークの両方を取得するために用いられ、コンフィデンシャルクライアントに最適化されている
- パブリッククライアントでも『認可コードグラント』は利用可能だが、PKCEを併用することが推奨される
リフレッシュトークン
- 新しいアクセストークンを取得するために使用されるトークン
- 発行は任意で、オプションであり、認可サーバーの判断に委ねられる
OpenID Connect(OIDC)
OpenID Connectとは?
- インターネット上でユーザーのログインと認証をシンプルにする仕組み
- OAuth2.0の拡張仕様であり、OpenID Foundationによって作成されている
OAuth2とOpenID Connectの違い
| OAuth2.0 | OpenIDConnect | |
|---|---|---|
| 目的 | 認可 | 認証 |
| トークンタイプ | アクセストークン | IDトークン アクセストークン |
| ユーザ認証 | No | Yes |
| 主な用途 | サードパーティの ユーザデータアクセス権の委譲 |
シングルサインオン(SSO) ユーザログイン |
| その他 | - | OAuth2.0と同時に実施可能 |
| OAuth2.0 | OpenIDConnect |
|---|---|
| リソースオーナー | エンドユーザー |
| クライアント | リライングパーティー |
| 認可サーバー | OpenIDプロバイダー |
| リソースサーバー | UserInfoエンドポイント |
アクセストークンとIDトークンの違い
- アクセストークン: 手に入れたら誰でも使える鍵
- IDトークン: 誰であるかを特定できる身分証明書
| アクセストークン | IDトークン | |
|---|---|---|
| 目的 | リソースへのアクセスを許可 | ユーザーのアイデンティティを提供 |
| 発行元 | 認可サーバー | OpenIDプロバイダ |
| 使用先 | リソースサーバー | リライングパーティー |
| 形式 | 特に決まりなし | Json Web Token(JWT) |
| 検証 | リソースサーバーが実施 | リライングパーティーが実施 |
| クライアントとの紐付け | なし | あり(aud項目) |
非対称暗号方式
- 『暗号化用の鍵』と『復号化用の鍵』を分けて使う暗号方式
- 公開鍵(Public Key)と秘密鍵(Private Key)の二つの鍵が使われる
- 公開鍵暗号とも呼ばれる
脆弱性対策
クライアント開発時最低限気を付けるポイント
- 専用ライブラリを使う
- 認可コードフローを使う
- アクセストークンの期限は短くする
- スコープは絞る
- OAuthを使って認証を行わない
| 防御する攻撃 | 検証者 | 対象 | |
|---|---|---|---|
| state | CSRF | クライアント (リクライングパーティ) |
OAuth2 OIDC 全てのフロー |
| PKCE | CSRF 認可コードインジェクション |
認可サーバー (IDプロバイダー) |
OAuth2 OIDC |
| nonce | 認可コードインジェクション | リクライングパーティ | OIDC 認可コードインジェクション |
| at_hash | アクセストークンインジェクション | リライングパーティ | OIDC |
CSRF(クロスサイトリクエストフォージェリ)
- 攻撃者がユーザーに偽の認可レスポンスを送らせ、結果としてユーザーのデータや認証情報を取得することを狙う
アクセストークンインジェクション
- 攻撃者は盗んだアクセストークンを自分のアクセストークンとして注入することにより、他人のリソースにアクセスする攻撃