約3分で読めます
JWT(JSON Web Token)とは?構造・デコード方法・セキュリティの注意点
JWTとは
JWT(JSON Web Token、ジョットと読みます)は、認証や情報のやり取りに使われるコンパクトなトークン形式です。ログイン後に発行され、その後のリクエストで「自分が誰か」を証明するために使われるのが代表的な用途です。
見た目は次のように、ドット(.)で3つの部分に区切られた長い文字列です。
eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoxLCJuYW1lIjoiVGFybyJ9.dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
3つの構造: header.payload.signature
JWTは header.payload.signature の3部構成です。それぞれの役割は次のとおりです。
| 部分 | 内容 | 例 |
|---|---|---|
| Header | 署名アルゴリズムやトークン種別 | {"alg":"HS256","typ":"JWT"} |
| Payload | 実際のデータ(クレーム) | {"user":1,"name":"Taro","exp":...} |
| Signature | 改竄検知のための署名 | アルゴリズムで計算した値 |
HeaderとPayloadは、それぞれJSONをBase64URLでエンコードしただけのものです。つまり、誰でも元のJSONに戻せます。
デコード方法
JWTの中身を確認したいときは、ドットで区切られた最初の2つの部分をBase64URLデコードするだけです。
echo "eyJ1c2VyIjoxLCJuYW1lIjoiVGFybyJ9" | base64 -d
# => {"user":1,"name":"Taro"}
手元で素早く確認するならJWTデコードツールが便利です。トークンを貼り付けるだけで、HeaderとPayloadを整形済みのJSONで表示します。Payloadだけを取り出したいときはBase64エンコード/デコードツールでも確認できます。
セキュリティの注意点
ここが最重要です。JWTは暗号化ではありません。
- HeaderとPayloadはBase64URLエンコードされているだけで、誰でもデコードして中身を読めます
- したがって、Payloadにパスワードやクレジットカード番号などの秘密情報を入れてはいけません
- 署名(Signature)は「改竄されていないか」を検証するためのもので、中身を隠すものではありません
署名検証は必ずサーバーで
JWTの安全性は署名検証に依存します。クライアント側でPayloadを読むのは問題ありませんが、「このトークンが正当か」の判断は必ずサーバー側で署名を検証して行います。秘密鍵を持つサーバーだけが署名を再計算できるため、改竄されたトークンを弾けます。
また、alg に none を許可してしまう実装の脆弱性や、有効期限(exp)の検証漏れにも注意が必要です。
まとめ
- JWTは
header.payload.signatureの3部構成 - HeaderとPayloadはBase64URLエンコードされただけで、誰でも読める
- 暗号化ではないため、Payloadに秘密情報を入れない
- 署名検証は必ずサーバー側で行う
- 中身の確認はJWTデコードツールが手軽