Open1

auth0周りの勉強

mk-nnmk-nn

JWT の仕様書を読む

参考

https://datatracker.ietf.org/doc/html/rfc7519

Introduction

jwt はコンパクトなクレームの表現方式。JWSのペイロードもしくはJWEの平文として使用する。

クレーム...トークンに含まれる情報。属性など
JWS...署名を付けて完全性と認証を保証。中身は見れるが改ざんされていないことの証明となる
JWE...データを暗号化して秘匿性を保証する。

Terminology(用語解説、LLMで要約)

JSON Web Token (JWT)
クレーム集合を表す文字列。
JWS または JWE としてエンコードされ、署名 / MAC / 暗号化が可能。

JWT Claims Set
JWT が運ぶクレームを含む JSON オブジェクト。

Claim
サブジェクト(対象)について主張された情報。
「名前」と「値」のペアで表される。

Claim Name
クレームの名前部分(常に文字列)。

Claim Value
クレームの値部分(任意の JSON 値)。

Nested JWT
JWT が入れ子になっているもの。
例:JWT をさらに JWS のペイロードや JWE の平文として使う場合。

Unsecured JWT
保護なしの JWT(署名や暗号化がされていない)。

Collision-Resistant Name
他の名前と衝突しにくい名前。
例: ドメイン名, OID, UUID。
管理された名前空間を使う場合、利用者は適切な管理を行う必要がある。

StringOrURI
JSON 文字列値。
もし : を含む場合は必ず URI でなければならない。
大文字小文字は区別され、正規化は行わない。

NumericDate
JSON 数値値で、1970-01-01T00:00:00Z UTC(UNIXエポック)からの秒数。
うるう秒は無視。1日は常に 86400 秒。
小数も可。
RFC 3339 の日付・時刻表記と対応。

JSON Web Token (JWT) Overview

JWTはクレーム集合を表すJSONオブジェクト
JWTはJOSEヘッダー+クレームセット(PAYLOAD)+署名が基本。それぞれは.で区切られる

JOSEヘッダーの例

{"typ":"JWT","alg":"HS256"}

クレームセットの例

{
    "iss":"joe",
    "exp":1300819380,
    "http://example.com/is_root":true
}

↑をUTF-8のオクテットをBase64urlエンコードすると↓

 eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9
 .
 eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFt
 cGxlLmNvbS9pc19yb290Ijp0cnVlfQ
 .
 dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk     eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9
 .
 eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFt
 cGxlLmNvbS9pc19yb290Ijp0cnVlfQ
 .
 dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk

JWT Claims

Registered Claim Names

登録されているクレームネーム
衝突を回避できる

iss(発行者): JWTの発行者
sub(件名): JWT の件名 (ユーザー)
aud( audience ): JWT の対象となる受信者
exp(有効期限): JWT の有効期限が切れるまでの時間
nbf(not before time): この時間より前に JWT の処理を​​受け入れてはなりません
iat(発行時刻): JWT が発行された時刻。JWT の古さを判断するために使用できます。
jti(JWT ID): 一意の識別子。JWT の再生を防ぐために使用できます (トークンの使用を 1 回だけ許可します)。

引用
https://zenn.dev/joo_hashi/articles/b31fba5d33f128

Public Claim Names

カスタムで設定できる名前。公開されているので全世界の人が使えるが、衝突のリスクがある。

Private Claim Names

特定のシステム間だけで使用できるカスタムで設定できる名前

JOSE Header

JWT暗号化や署名についての記述
typ...JWTかどうかを明示するためのタイプ指定
cty...ネスト時必須。JWTを値として設定する
Claims...一部のクレームを暗号、復号するかの処理ルール

Unsecured JWTs

署名なしJWT
↓のように指定

{"alg":"none"}

署名部分は空文字列にする
特徴として改ざんに弱い、外部で信頼性を担保する仕組みが必要(httpsなど)
テスト時やセキュリティが不要な場合に使われる(形式だけ合わせたい場合など)

Security Considerations

JWSおよびJWEのセキュリティ上の懸念事項は同様にJWTにも適用される。
暗号を扱うにあたり既存の問題は考慮する必要がある(攻撃手法等)
JWTのクレームを信頼するためにはそれが暗号的に保護されていて検証するための仕組みが整っている必要がある
署名と暗号化の両方を使用する場合、まず署名を行い、そのあとで暗号化を行うべき
→JWTの署名部分が取り除かれてしまう可能性を防ぐことができる。
また一部地域では暗号化済みデータへの署名は法的に無効とみなされる場合がある