JWT
JWT(Json Web Token)は、URLセーフなデータ転送プロトコル、またはそのデータ。
主にOpenIDによる認証情報、OAuth2のアクセストークンの送受信に利用されるが、任意のデータの送受信に使うことも可能である
JWTのデータ
トークン
JWTはJSON形式で表現されるデータである。JWTの文脈でJSONオブジェクトをトークンと呼ぶ、
クレーム
トークンの各データをクレームと呼ぶ。
クレームには任意のキーを使用できるが、以下の特別なフィールドが仕様で定義されている。
フィールド名 | 内容 |
---|---|
iss | Issuer、トークン発行者 |
sub | Subject、トークン識別子、認証情報のユーザIDなどが該当 |
aud | Audience、トークンの受け取り手 |
exp | Expiration、有効期限、UNIX時間で指定 |
nbf | Not Before、トークンが有効になる時刻、UNIX時間で指定 |
iat | Issued At、トークンの発行時刻 |
jti | JWT ID、トークンごとに一意なID |
これらの値はいずれも必須ではないがライブラリでサポートされていることが多い。例えばexpを過ぎていたら不正なトークンとしてエラー扱いするといった処理がライブラリ側で行われる。
JOSE
Javascript Object Signing and Encryption の略。JWTの署名、暗号化を行う仕組みである
JWS
JWS(JSON Web Signiture)はJWTデータに署名を追加する仕組み、または、そのデータ形式。一般的にJWTと呼ばれた場合これを指すことが多い。
以下のJWSはCompact形式と呼ばれるフォーマットである。これ以外のフォーマットはあまり使われない。
eyJhbGciOiJFUzI1NiJ9.eyJ0ZW1wZXJ0dXJlIjoyMC4yLCJodW1pbml0eSI6NTQuOCwiZHQiOiIyMDIyLTA0LTIwVDEyOjUwWiJ9.sQl6Wq5Tw9leXQ26gZgy4MwLks_snWt9Ol93h0stC6Q046CbiEpzdKU88Rhw1Y3jlwMf0DgplAJxm4ZtvJa9kg
BASE64エンコードされたデータをドットで結合したもので以下のような構造になっている
ヘッダ.ペイロード.署名
ペイロード
JWTのデータ本体
ヘッダ
JOSE Headerと呼ばれる。ヘッダはJSON形式で以下の情報を格納する
フィールド名 | 内容 |
---|---|
typ | Type、タイプ、ほとんどの場合JWT なので大体省略される |
cty | Content Type、データ形式、これもほぼJWT なので省略されがち |
alg | Algorithm、署名アルゴリズム |
kid | 公開鍵署名の場合、このJWTを署名した公開鍵のID |
署名
HMAC、RSA署名、ECDSA署名が利用可能。
+--------------+-------------------------------+--------------------+ | "alg" Param | Digital Signature or MAC | Implementation | | Value | Algorithm | Requirements | +--------------+-------------------------------+--------------------+ | HS256 | HMAC using SHA-256 | Required | | HS384 | HMAC using SHA-384 | Optional | | HS512 | HMAC using SHA-512 | Optional | | RS256 | RSASSA-PKCS1-v1_5 using | Recommended | | | SHA-256 | | | RS384 | RSASSA-PKCS1-v1_5 using | Optional | | | SHA-384 | | | RS512 | RSASSA-PKCS1-v1_5 using | Optional | | | SHA-512 | | | ES256 | ECDSA using P-256 and SHA-256 | Recommended+ | | ES384 | ECDSA using P-384 and SHA-384 | Optional | | ES512 | ECDSA using P-521 and SHA-512 | Optional | | PS256 | RSASSA-PSS using SHA-256 and | Optional | | | MGF1 with SHA-256 | | | PS384 | RSASSA-PSS using SHA-384 and | Optional | | | MGF1 with SHA-384 | | | PS512 | RSASSA-PSS using SHA-512 and | Optional | | | MGF1 with SHA-512 | | | none | No digital signature or MAC | Optional | | | performed | | +--------------+-------------------------------+--------------------+
none
は署名なし。現在、最もよく使われているのは RS256
、HMACは受け手と利用者が同じ場合に使うと良い(cookieの値に署名をつけたい場合など)
JWE
JWT暗号化の仕様はRFC7516 JWEで定義されている。