## What — 「誰が・いつまで・何をしていいか」を運ぶ文字列
JWT(JSON Web Token・読みは「ジョット」)は、**「誰が・いつまで・何をしていいか」を1本の文字列に詰めて運ぶ書式**。ピリオドで3つに割れる。
```
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJpbXV0YXJvIn0.dBjftJeZ4CVP
└─── ヘッダ ───┘ └─── ペイロード ───┘ └─ 署名 ─┘
```
| 部品 | 中身 | 役割 |
| --- | --- | --- |
| ヘッダ | `{"alg":"HS256"}` | 署名の方式 |
| ペイロード | `{"sub":"imutaro","exp":1755500000}` | 本体。誰か・期限・権限 |
| 署名 | サーバーの秘密鍵で計算した値 | 偽造検知 |
ペイロードは暗号化されておらず、デコードすれば誰でも読める。それでも偽造できないのは、1文字でも書き換えると署名の計算が合わなくなるから。守っているのは機密性ではなく**改ざん検知**。
## どこで使われているか — ログインの裏側
[[Bearer]] で運ばれてくる文字列の中身が、たいてい JWT。出会う場面は3つ。
- **Web アプリのログイン** — ログイン成功時にサーバーが発行し、以降のリクエストに毎回載って往復する
- **「◯◯でログイン」** — [[OAuth2]] で発行されるアクセストークンの書式が JWT のことが多い
- **サービス同士の認証** — Cloud Run のサービス間呼び出しなど、人間不在で機械が身分を示す場面
この書式が選ばれる理由は、**署名の検証だけで本人確認が完結する**から。サーバーが何台に増えても、ログイン中の台帳を全台で共有しなくていい。
## この知識をいつ使うか — 401 のデバッグ
401 が返ったら、トークンをデコーダ(jwt.io 等)に貼って `exp`(期限)を見る。期限切れならトークンを取り直すだけで直る。中身が読める書式だからこそできる切り分け。
落とし穴:
- **発行後に取り消せない** — 台帳を引かないことの裏返しで、ログアウトしてもトークンは期限まで有効。期限が数分〜数時間と短いのはこの弱点への対処
- **ペイロードに秘密情報を入れない** — 誰でも読めるので、入れていいのはユーザーID・期限・権限の範囲まで
## 関連
- [[API]] — API まわりの地図
- [[Bearer]] — この文字列を運ぶ渡し方
- [[OAuth2]] — この文字列を発行してもらう手続き
- [[認証トークンの3層]] — OAuth2・Bearer・JWT の関係の全体図