- OAuth 2.0アクセストークンのJSON Webトークン(JWT)プロファイルについてメモする。
JWT Access Token Header and Data Structure
ヘッダ
-
alg
:必須。JWTトークンの署名アルゴリズムを指定。
データ構造
- iss,exp,aud,sub,iat,jti(RFC7519参照のこと)などの他、認証情報、アイデンティティ、認可情報などのクレームで構成される。
Requesting a JWT Access Token
- リクエスト
GET /as/authorization.oauth2?response_type=code
&client_id=s6BhdRkqt3
&state=xyz
&scope=openid%20profile%20reademail
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
&resource=https%3A%2F%2Frs.example.com%2F HTTP/1.1
Host: authorization-server.example.com
-
レスポンス
-
ヘッダー
{ "typ":"at+JWT", "alg":"RS256", "kid":"RjEwOwOA" }
-
クレーム
{ "iss": "https://authorization-server.example.com/", "sub": "5ba552d67", "aud": "https://rs.example.com/", "exp": 1639528912, "iat": 1618354090, "jti" : "dbe39bf3a3ba4238a513f51d6e1691c4", "client_id": "s6BhdRkqt3", "scope": "openid profile reademail" }
-
Validating JWT Access Tokens
- 次の流れで検証を行う。
-
alg
で指定されたアルゴリズムを使用して、署名を検証する。-
alg
が指定されていないトークンは拒否する。
-
-
Typ
ヘッダ値がjwt
、at+JWT
またはapplication/at+jwt
であることを確認する。 - (JWTアクセストークンが暗号化されている場合、)指定されたキーとアルゴリズムを使用して復号化する。
- 認可サーバーと暗号化がネゴシエートされていながら、JWTアクセストークンが暗号化されていない場合、そのトークンを拒否する。
- 認可サーバーの発行者識別子が
iss
クレームの値と完全一致していることを確認する。 -
aud
クレームに有効なリソースインジケーターが含まれているかを確認する。 - 現在時刻が
exp
に指定された値よりも前であることを確認する。 - (認可クレーム
scope
などが含まれる場合、)リクエストの文脈情報と組み合わせて、リクエストの許可または拒否されるべきかどうかを確認する。
-
セキュリティに関する考慮事項
- cross-JWT confusion
- 傍受したトークンを、所定の⽬的以外の⽬的で使⽤する攻撃。
-
aud
クレーム値としてユニークな識別子を使用し、個別のリソースに対して同じ発行者によって発行されたアクセストークンを一意に識別する。
- トークンリクエストに複数のリソースインジケータが含まれている場合、認可サーバーはJWTアクセストークンに含まれる各スコープが、
aud
クレームに関連付けられる特定のリソースと関連があることを確認する。