MS_JWTAndOAuth2 - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki
- 戻る(OAuth 2.0 拡張)
- JWTとOAuth2.0
- JWT
- OAuth 2.0 のトークン
- OpenID Connect
移行メモ: 元ページは「セキュリティ上の解題」となっていたので
「課題」に正した。
Bearer Token の JWT 化
-
Access Token として、JWT アサーションを使用すれば、
改ざん、置換、CSRF(XSRF)などを検出できるようになるため、
Implicit グラント種別でもより安全に利用できるようになる。 -
OpenID Connect の ID トークンに同梱されるクレームを
同梱させれば、ほぼ安全になり、認証用途にも利用できるようになる。- Client や Resource Server で token の署名検証が可能になる。
- また、発行者の AuthZ Server(
iss: issuer)と
発行対象の Client(aud: audience = クライアント識別子)を特定できる。 - これにより、トークン置き換え攻撃も防ぐことができる。
-
ポイントは、この Access Token は、ASP.NET Identity などの
特定テクノロジを使用した Resource Server でなくても利用可能であるという点。
補足(最新化): 2 点、現在の理解に合わせて補足する。
1. Implicit は使わない。
「JWT 化すれば Implicit でもより安全」というのは当時の緩和策で、
現在は Implicit グラント自体が廃止である
(OAuth 2.1 / RFC 9700)。
JWT にしてもフラグメントに載る以上、
ブラウザ履歴・Referer・拡張機能からの漏えいは避けられない。
代わりに Authorization Code + PKCE を使う。2. アクセス トークンの JWT 形式は標準化された。
**RFC 9068(JWT Profile for OAuth 2.0 Access Tokens, 2021)**により、
typ: at+jwtや必須クレーム(iss/exp/aud/sub/client_id/
iat/jti)が規定された。
「仕様化されていないので自由」だった状態は解消している。なお、アクセス トークンをクライアントが解析するのは誤りである
(中身の形式は AuthZ Server と Resource Server の間の取り決め)。
クライアントが知りたいのは ID トークンの側である。
-
Access Token のカスタマイズが可能。
-
ただし、(基本的には)Access Token のみがカスタマイズの対象なので、
OpenID Connectに対応させることはできない(ID トークンの追加はできない)。 -
参考
- JSON Web Token in ASP.NET Web API 2 using Owin - Bit of Technology
http://bitoftech.net/2014/10/27/json-web-token-asp-net-web-api-2-jwt-owin-authorization-server/
- JSON Web Token in ASP.NET Web API 2 using Owin - Bit of Technology
この方式は、Entra ID の OAuth でも利用されている模様。
- OAuth 2.0のAccess TokenへのJSON Web Token(JSON Web Signature)の適用 - r-weblife
http://d.hatena.ne.jp/ritou/20140927/1411811648 - モバイルアプリのユーザ認証方法についてまとめてみた - Qiita
http://qiita.com/ledmonster/items/0ee1e757af231aa927b1
-
JWT bearer token authorization グラント種別
- Client Credentials グラント種別の代替フロー
- 強化されたクライアント認証を使用して
access_tokenを取得する。
-
JWT Secured Authorization Request (JAR)
JAR のリクエスト署名もクライアント認証として機能する。
補足: クライアント認証の方式は次のように整理される
(後ろほど強い)。
方式 内容 client_secret_basic/_post共有シークレット。漏えいすると詰む client_secret_jwtシークレットで署名した JWT(HS256) private_key_jwt秘密鍵で署名した JWT(RS256/ES256)。シークレットを送らない(RFC 7523) tls_client_auth/self_signed_tls_client_authmTLS(RFC 8705)。FAPI で要求される 公開クライアント(SPA・モバイル)はシークレットを持てないため、
クライアント認証を行わず PKCE で代替する。
-
JWT Secured Authorization Request (JAR)
- 認可リクエストのパラメタを JWT で送信する機能。
- これにより、許可要求の機密性、完全性が達成される。
-
JWT Secured Authorization Response Mode for OAuth 2.0 (JARM)
- 認可レスポンスを JWT で送信する機能。
- これにより、許可応答の機密性、完全性が達成される。
- JAR(前述)
-
OAuth 2.0 Pushed Authorization Requests (PAR)(RFC 9126)
- ファジーな JAR の、一、ユースケース。
- FAPI Part 2(FAPI Part 2 (Read and Write API Security Profile))で、実質的に PAR が使用されている。
-
OAuth 2.0 Rich Authorization Requests (RAR)(RFC 9396)
複雑な JSON 構造を持つauthorization_detailsリクエストパラメタを追加。
移行メモ(元 Wiki 側のリンク切れ): 元ページは PAR / RAR に
個別ページへのリンクを張っていたが、3 サイトのダンプいずれにも実体が無い
(元 Wiki 側でリンクのみ存在していた)ため、注記に変更し RFC 番号を補った。
-
OpenID Connect for Identity Assurance
claimsリクエストパラメタ値に、複雑な JSON 構造を持つverified_claimsを挿入。
補足(JAR と PAR の違い): 名前が似ているが、目的が違う。
内容 効果 JAR(RFC 9101) パラメタを JWS にまとめて requestに入れる改ざん検知。ただし URL が長くなる PAR(RFC 9126) 認可要求を事前にバックチャネルで送る。ブラウザには request_uriだけを渡すURL が短くなり、ブラウザにパラメタが載らない 両者は併用でき、
PAR で送ったものを JAR で署名するのが FAPI 2.0 の形である。RAR(RFC 9396)は
scopeの限界(文字列 1 つでは
「A 銀行の口座から B へ 1 万円」のような細かい認可を表せない)への回答。
- RFC 9068 - JWT Profile for OAuth 2.0 Access Tokens
https://datatracker.ietf.org/doc/html/rfc9068 - RFC 7523 - JWT Profile for OAuth 2.0 Client Authentication and Authorization Grants
https://datatracker.ietf.org/doc/html/rfc7523
Tags: 移行, IT国際標準, 認証基盤, ASP.NET Identity, OAuth