JWT(JSON Web Token・読みは「ジョット」)は、「誰が・いつまで・何をしていいか」を1本の文字列に詰めて運ぶ書式。ピリオドで3つに割れる。
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJpbXV0YXJvIn0.dBjftJeZ4CVP
└─── ヘッダ ───┘ └─── ペイロード ───┘ └─ 署名 ─┘
| 部品 | 中身 | 役割 |
|---|---|---|
| ヘッダ | {"alg":"HS256"} | 署名の方式 |
| ペイロード | {"sub":"imutaro","exp":1755500000} | 本体。誰か・期限・権限 |
| 署名 | サーバーの秘密鍵で計算した値 | 偽造検知 |
ペイロードは暗号化されておらず、デコードすれば誰でも読める。それでも偽造できないのは、1文字でも書き換えると署名の計算が合わなくなるから。守っているのは機密性ではなく改ざん検知。
Bearer で運ばれてくる文字列の中身が、たいてい JWT。出会う場面は3つ。
この書式が選ばれる理由は、署名の検証だけで本人確認が完結するから。サーバーが何台に増えても、ログイン中の台帳を全台で共有しなくていい。
401 が返ったら、トークンをデコーダ(jwt.io 等)に貼って exp(期限)を見る。期限切れならトークンを取り直すだけで直る。中身が読める書式だからこそできる切り分け。
落とし穴: