「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-戻る
--[[OAuth 2.0 拡張]]([[OAuth2.0 Proof of Possession]])~
[[Financial API (FAPI)]]([[FAPI1>FAPI Part 1 (Read Only API Security Profile)]]、[[FAPI2>FAPI Part 2 (Read and Write API Security Profile)]])、[[OAuth 2.1]]
--[[UserAgentでOAuth2のTokenを取得するベスト・プラクティス]]
---[[OAuth2.0 mTLS>OAuth 2.0 Mutual TLS Client Authentication and Certificate Bound Access Tokens]](最初の派生)
---[[Token Binding]](廃止の傾向)
---OAuth2.0 DPoP

* 目次 [#gb549535]
#contents

*概要 [#re9c029a]
[[記名式切符>トークン#b38de47f]]作成に関する仕様:TLSに依存せず、アプリケーション・レイヤで処理可能にしたセキュリティ拡張仕様(RFC 9449 として標準化)。~
フロントエンドから使用可能なプラットフォーム上の[[公開鍵・暗号化アルゴリズム>暗号化アルゴリズム#tfda0d72]]を使用する。
-[[記名式切符>トークン#b38de47f]]作成に関する仕様:
--TLSに依存せず、アプリケーション・レイヤで処理可能にしたセキュリティ拡張仕様(RFC 9449 として標準化)。
--フロントエンドから使用可能なプラットフォーム上の[[公開鍵・暗号化アルゴリズム>暗号化アルゴリズム#tfda0d72]]を使用する。

-DPoP = Demonstration of Proof-of-Possession at the Application Layer)
-[[持参人切符から記名式切符>OAuth 2.0 のトークン#i5f79713]]へ切り替えることでよりセキュアにする。
-方法としては、OAuth 2.0 のアクセストークンを特定のクライアント(秘密鍵)に紐づける。
-このため、TokenリクエストとResourceリクエストにおいて、PoP Proof JWTを使用する。
-[[Token Binding]]のやりたかったことをTLSに依存せず実現した後継の位置付け。

**特徴 [#v11ed105]
-SPAなどのPublic Clients全般をターゲットとして仕様が作成されている。
-名前の通り、アプリケーション・レイヤで、[[記名式切符>トークン#b38de47f]]を発行することができる。
-「アプリケーション・レイヤで」とは[[OAuth2.0 mTLS>OAuth 2.0 Mutual TLS Client Authentication and Certificate Bound Access Tokens]]と異なりインフラ・レイヤを必要としないの意味。

※ [[OAuth2.0 mTLS>OAuth 2.0 Mutual TLS Client Authentication and Certificate Bound Access Tokens]] も [[Token Binding]]もTLSに依存した設計となっている。~
※ ただし、後者はブラウザ・サポートによりインフラ構築不要になる予定だったが、実現せずに、廃案と成った。

**課題 [#b1d99909]
秘密鍵を何処に保存すりゃいいのか?などの説明が不足している(明示的な規定を避けている)が、~
一般的な回答としては、エクスポート不可のWeb Crypto API(extractable: false)でインメモリ生成するのが推奨。

*詳細 [#be6f6188]

**クライアントが公開鍵・秘密鍵ペアを生成 [#h2063c44]

***Client generates: [#t8d71865]
-PrivateKey (秘密・保持)
-PublicKey  (DPoP Proof JWTに埋め込む)

***プラットフォーム毎のAPI [#p39d131c]
Web Crypto API(extractable: false)

-ブラウザ:crypto.subtle
-Node.js:webcrypto.subtle
-iOS/Android ネイティブ:Secure Enclave / Android Keystore

**Tokenリクエスト時に DPoP Proof JWT を送信 [#p2f40f59]
クライアントは Authorization Server に以下を送る。

***DPoP HTTPヘッダを入れる。 [#c261504a]
 POST /token HTTP/1.1
 Host: server.example.com
 Content-Type: application/x-www-form-urlencoded
 DPoP: eyJ0eXAiOiJkcG9wK2p3dCIsImFsZyI6IkVTMjU2IiwiandrIjp7ImNydiI6IlAtMjU2Iiwia3R5IjoiRUMiLCJ4IjoiLi4uIiwieSI6Ii4uLiJ9fQ.eyJodG0iOiJQT1NUIiwiaHR1IjoiaHR0cHM6Ly9zZXJ2ZXIuZXhhbXBsZS5jb20vdG9rZW4iLCJpYXQiOjE2MjM0MjA4MDAsImp0aSI6InVuaXF1ZS1pZCJ9.signature
 
 grant_type=authorization_code&code=xxxxx&...

***DPoP Proof JWT の構造: [#u29bee27]
 json// Header
 {
   "typ": "dpop+jwt",
   "alg": "ES256",
   "jwk": {
     "kty": "EC",
     "crv": "P-256",
     "x": "...",
     "y": "..."
   }
 }
 // Payload
 {
   "htm": "POST",                             // HTTPメソッド
   "htu": "https://server.example.com/token", // エンドポイントURL
   "iat": 1623420800,                         // 発行時刻(リプレイ攻撃対策)
   "jti": "unique-id"                         // 一意なID(リプレイ攻撃対策)
 }
 // Signature (秘密鍵で署名)

**Authorization Server がトークンを発行 [#l7fa5e79]
-DPoP Proof JWTの署名を検証
--htm・htu の一致確認で当該処理を目的としているか確認。
--jti・iat を用いてリプレイ攻撃チェックを行う。

-Accessトークンの発行
--公開鍵のハッシュ(cnf.jkt)をAccessトークンに埋め込む
--json
 // アクセストークン(JWT)のペイロードに含まれる
 {
   "sub": "user123",
   "cnf": {
     "jkt": "0ZcO...(公開鍵のSHA-256ハッシュ)"
   }
 }

***Resource Serverへのリクエスト [#b68e159d]
毎回 新しい DPoP Proof JWT を生成
 GET /resource HTTP/1.1
 Authorization: DPoP eyJhbGciOi...   ← Bearer ではなく DPoP スキーム
 DPoP: eyJ0eXAiOiJkcG9wK2p3dCIs...  ← Proof JWT

***Resource Serverが検証 [#e99ec573]
-Accessトークンの cnf.jkt(公開鍵ハッシュ)を取得

-DPoP Proof の署名を検証
--htm・htu の一致確認で当該処理を目的としているか確認。
--jti・iat を用いてリプレイ攻撃チェックを行う。
--DPoP Proof JWT の jwk ハッシュ と cnf.jkt との一致確認(トークンと鍵の紐づけ確認)

*参考 [#re074ec0]
-SPAなClientがトークンを安全に扱えるかもしれない拡張仕様「OAuth2.0 DPoP」とは - r-weblife~
https://ritou.hatenablog.com/entry/2019/04/19/070000

-draft-fett-oauth-dpop-01 - OAuth 2.0 Demonstration of Proof-of-Possession at the Application Layer~
https://tools.ietf.org/html/draft-fett-oauth-dpop

----
Tags: [[:IT国際標準]], [[:認証基盤]], [[:クレームベース認証]], [[:OAuth]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS