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はランダムな文字列
    • クライアントが生成し、セッションと紐づけて管理する

フロー

  1. クライアント(スマホアプリ等)が認可サーバに送る認可リクエストにstate を追加する
  2. 認可サーバはstateを保存する
  3. 認可サーバがクライアントに送る認可レスポンスにstate を追加する
  4. クライアントは受信したstate を検証する
    1. 受信したstate と保存していたstate が一致しているか確認する

認可コード横取り攻撃

Mix-Up攻撃

  • 複数の認可サーバとやりとりをしているクライアントから認可コードやアクセストークンの搾取を試みる攻撃

対策

  • iss を使う

OAuth2.0を実装しているWebサービス

  • Facebook
  • Google Apps
  • Windows Live

関連サイト

ドキュメント

解説

関連用語