OAuth2.0
2023-03-24 (金) 22:59:05
OAuth2.0 とは †
- IETF OAuth WG
- RFC 6749
- RFC 6750
OAuth2.0 の仕様 †
ロール †
- リソースオーナー
- リソースの所有者。クライアントのユーザでもある。
- クライアント
- リソースサーバを利用するアプリケーション。
- 事前に認可サーバに登録する必要がある。
- 認可サーバ
- アクセストークンを発行する。
- リソースサーバ
クライアントタイプ †
- コンフィデンシャルクライアント
- クライアントID・クライアントシークレットを安全に扱うことができるクライアント
- サーバサイドのWebアプリ
- パブリッククライアント
- クライアントID・クライアントシークレットを安全に扱うことができないクライアント
- ブラウザ向けのWebアプリ(JavaScript)、ネイティブアプリ
スコープ †
- リソースサーバ上のリソースに対するアクセス権を制御する仕組み。
- スコープはアクセストークンに紐付ける。
トークン †
- アクセストークン
- 認可サーバがクライアントに対して発行する
- スコープ
- アクセス権の詳細を制御するための仕組み
- 有効期限(expires_in)
- 攻撃者に盗まれても短時間で接続できなくなるように、有効期限は短く設定される。
- 以下の2種類のトークンのどちらかを選択できる。
- ベアラートークン
- トークンを持っている人を信用する
- 利用者制限トークン(Sender Constrained Token)
- トークンと利用者が結びついている必要がある
- HoK(Holder of Key) Token
- リフレッシュトークン
- アクセストークンの更新に使うトークン
- アクセスを長期間維持することを実現する為のもの
- 認可サーバに対してのみ使われるため、攻撃者に盗まれるリスクは低い。
- 有効期限
- 一般的にアクセストークンよりも長く設定される。
- 認可コード
- 認可コードグラントにおいて、認可サーバがクライアントに対して発行する
- クライアントIDに紐づけられている
エンドポイント †
- 認可エンドポイント
- 認可サーバが提供するURI
- クライアントからの認可リクエストのアクセス先
- クライアントに認可コードを発行する
- トークンエンドポイント
- 認可サーバが提供するURI
- クライアントからのトークンリクエストのアクセス先(認可コードを含めてアクセスする)
- クライアントから認可コードを受けてアクセストークンを発行する
- リダイレクトエンドポイント
- リダイレクトURI
- クライアントが提供するURI
- 認可サーバが発行する認可コードやアクセストークンの受け渡し先
- 事前に認可サーバに登録する必要がある
- リダイレクト(ステータスコード302)を使って認可サーバからWebブラウザ経由でクライアントにアクセスする(LocationヘッダにリダイレクトエンドポイントのURIとパラメータを指定する)
グラントタイプ †
- 認可コードグラント (Authorization Code Grant)
- 認可コードを発行した後に、認可コードと交換する形でアクセストークンを発行する
- コンフィデンシャルクライアント向け
- PKCEを使うことでパブリッククライアント向けの利用も可能
- インプリシットグラント (Implicit Grant)
- アクセストークンを直接発行する
- パブリッククライアント向け
- リフレッシュトークンの発行が禁止されている
- 非推奨 ※アクセストークン漏洩のリスクがある
- クライアントクレデンシャルグラント (Client Credentials Grant)
- サーバ間で使われる方式
- リソースオーナーパスワードクレデンシャルグラント (Resource Owner Password Credentials Grant)
- ユーザIDとパスワードの受け渡しが必須
OAuth Dance †
- OAuth のシーケンス
セキュリティ上の脅威 †
CSRF †
- 攻撃者のアカウントを使ったCSRF による不正操作
対策 †
- stateを使う
- stateはランダムな文字列
- クライアントが生成し、セッションと紐づけて管理する
フロー †
- クライアント(スマホアプリ等)が認可サーバに送る認可リクエストにstate を追加する
- 認可サーバはstateを保存する
- 認可サーバがクライアントに送る認可レスポンスにstate を追加する
- クライアントは受信したstate を検証する
- 受信したstate と保存していたstate が一致しているか確認する
認可コード横取り攻撃 †
- 「PKCE」参照
Mix-Up攻撃 †
- 複数の認可サーバとやりとりをしているクライアントから認可コードやアクセストークンの搾取を試みる攻撃
対策 †
- iss を使う
OAuth2.0を実装しているWebサービス †
- Google Apps
- Windows Live
関連サイト †
ドキュメント †
- OAuth 2.0 - OpenIDファウンデーション・ジャパン
http://www.openid.or.jp/document/index.html#op-doc-oauth2
- The OAuth 2.0 Authorization Framework(日本語)
https://openid-foundation-japan.github.io/rfc6749.ja.html
- OAuth 2.0 for Native Apps(BCP212 )(RFC8252)
https://www.rfc-editor.org/info/rfc8252
- OAuth 2.0 Security Best Current Practice
https://datatracker.ietf.org/doc/html/draft-ietf-oauth-security-topics
解説 †
- 「OAuth 2.0」の基本動作を知る(2017.09.01)
http://www.atmarkit.co.jp/ait/articles/1708/31/news124.html
- OAuth 2.0 の勉強のために認可サーバーを自作する(2019.10.17)
https://qiita.com/TakahikoKawasaki/items/e508a14ed960347cff11
- IETF OAuth WGの仕様全部見る(2019.10)
https://qiita.com/ritou/items/bbf7ffd001f30ec6facc
関連用語 †
- 認可
- プロテクティッドリソース
- CSRF
- Financial API
- OpenID Connect
- OAuth
- TLS