JWT

JSON Web Token。 認証認可の情報をJSON形式でやり取りする際に使用できるフォーマットのこと。 デジタル署名を付与することもできる。

JWTの構造

署名が付与されたJWTはドット(.)で区切られた3つの部分に分けることができる。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.4pcPyMD09olPSyXnrXCjTwXyr4BsezdI1AVTmud2fU4

ヘッダ

3つに分けた最初の部分。 タイプとハッシュアルゴリズムの2つの情報を保持するJSONで、改行やスペースを除去した状態にしてからBase64でエンコードされる。 タイプ部分は通常JWT、ハッシュアルゴリズムにはHS256やRS256などが設定される。

エンコード前
{
  "alg": "HS256",
  "typ": "JWT"
}
エンコード後
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

ペイロード

3つに分けた2つ目の部分。 ヘッダと同じようにJSONであり、改行やスペースを除去した状態にしてからBase64でエンコードされる。

エンコード前
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}
エンコード後
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

署名

3つに分けた3つ目の部分。 改ざんを検知することができる。また、秘密鍵で署名されている場合は送信元についても検証できる。 エンコードされたヘッダペイロードヘッダで指名した署名アルゴリズムによって署名する。 以下はHMAC SHA256アルゴリズムで署名する際の例。

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)