文書の過去の版を表示しています。
<markdown> # JWT
JWT(Json Web Token)は、JSONペイロードに対して署名・暗号化を施す方法を定めたプロトコル、またはそのデータ。
* [RFC 7519: JSON Web Token (JWT)](https://www.rfc-editor.org/rfc/rfc7519)
主にOpenIDによる認証情報の送受信に利用されるが、任意のデータの送受信に使うことも可能。
## 構造
``` eyJhbGciOiJFUzI1NiJ9.eyJ0ZW1wZXJ0dXJlIjoyMC4yLCJodW1pbml0eSI6NTQuOCwiZHQiOiIyMDIyLTA0LTIwVDEyOjUwWiJ9.sQl6Wq5Tw9leXQ26gZgy4MwLks_snWt9Ol93h0stC6Q046CbiEpzdKU88Rhw1Y3jlwMf0DgplAJxm4ZtvJa9kg ```
BASE64エンコードされたデータをドットで結合したもの。内容は
``` ヘッダ.ペイロード.署名 ```
となっている。ヘッダ、ペイロードはJSON文字列を、署名はバイナリをBASE64エンコードしたものである。この形式では暗号化されていないのでデータは保護されない。
JWT暗号化の仕様は[RFC7516 JWE](https://www.rfc-editor.org/rfc/rfc7516.html)で定義されている。
## ペイロード
送受信されるデータ本体のこと
### トークン
データはJSONオブジェクトで表現される。JWTの文脈ではこのデータを表現するJSONオブジェクトをトークンと呼ぶ、
### クレーム
JSONのkey value形式で表現される各データをクレームと呼ぶ。
クレームには任意のキーを使用できるが、以下の特別なフィールドが仕様で定義されている。
フィールド名 | 内容 |
— | — |
iss | Issuer、トークン発行者 |
sub | Subject、トークン識別子、認証情報のユーザIDなどが該当 |
aud | Audience、トークンの受け取り手 |
exp | Expiration、有効期限、UNIX時間で指定 |
nbf | Not Before、トークンが有効になる時刻、UNIX時間で指定 |
iat | Issued At、トークンの発行時刻 |
jti | JWT ID、トークンごとに一意なID |
これらの値はいずれも必須ではないがライブラリでサポートされていることが多い。例えばexpを過ぎていたら不正なトークンとしてエラー扱いするといった処理がライブラリ側で行われる。
## ヘッダ
ヘッダはJSON形式で以下の情報を格納する
フィールド名 | 内容 |
— | — |
typ | Type、タイプ、ほとんどの場合`JWT`なので大体省略される |
cty | Content Type、データ形式、これもほぼ`JWT`なので省略されがち |
alg | Algorithm、署名アルゴリズム |
kid | 公開鍵署名の場合、このJWTを署名した公開鍵のID |
## 署名
`ヘッダ.ペイロード` に対する署名データ
* [RFC7515 JSON Web Signature (JWS)](https://www.rfc-editor.org/rfc/rfc7515.html) * [RFC7518 JSON Web Algorithms (JWS)](https://www.rfc-editor.org/rfc/rfc7518.html)
### アルゴリズム
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 | | +--------------+-------------------------------+--------------------+
```
現在、最もよく使われているのは `RS256`、`none`は使うべきではない
</markdow n>