OAuth2.0 とは†
- IETF OAuth WG
- RFC6749
- RFC6750
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)
OAuth Dance†
セキュリティ上の脅威†
CSRF†
- 攻撃者のアカウントを使ったCSRF による不正操作
- stateを使う
- stateはランダムな文字列
- クライアントが生成し、セッションと紐づけて管理する
フロー†
- クライアント(スマホアプリ等)が認可サーバに送る認可リクエストにstate を追加する
- 認可サーバはstateを保存する
- 認可サーバがクライアントに送る認可レスポンスにstate を追加する
- クライアントは受信したstate を検証する
- 受信したstate と保存していたstate が一致しているか確認する
認可コード横取り攻撃†
OAuth2.0を実装しているWebサービス†
- Facebook
- Google Apps
- Windows Live
関連サイト†
ドキュメント†
関連用語†