JWT は署名付きの情報
JWT は JSON Web Token の略です。ざっくり言うと、JSON形式の情報に署名を付けたトークンです。
よくあるJWTは、次のようにドットで3つに分かれています。
xxxxx.yyyyy.zzzzz
左から順に、Header、Payload、Signature です。
| 部分 | 役割 |
|---|---|
| Header | 署名アルゴリズムなど |
| Payload | ユーザーID、有効期限などの claims |
| Signature | 改ざんされていないことを確認する署名 |
Header
Header には、JWTの種類や署名アルゴリズムが入ります。
{
"alg": "HS256",
"typ": "JWT"
}
alg は署名アルゴリズムです。実装では、許可するアルゴリズムを明示して検証することが重要です。
Payload
Payload には、トークンで伝えたい情報が入ります。
{
"sub": "user_001",
"role": "student",
"iat": 1760000000,
"exp": 1760003600
}
よく使われる項目には、次のようなものがあります。
| claim | 意味 |
|---|---|
sub | Subject。ユーザーIDなど |
iss | Issuer。発行者 |
aud | Audience。利用先 |
iat | Issued At。発行時刻 |
exp | Expiration Time。有効期限 |
注意: JWT の Payload は、多くの場合 Base64URL エンコードされているだけです。暗号化ではありません。機密情報をそのまま入れてはいけません。
Signature
Signature は、Header と Payload が改ざんされていないことを確認するための署名です。
サーバは秘密鍵または秘密情報を使って署名します。受け取った側は署名を検証し、改ざんされていないか確認します。
import jwt from "jsonwebtoken";
const token = jwt.sign(
{ sub: "user_001", role: "student" },
process.env.JWT_SECRET,
{ expiresIn: "15m" }
);
検証側は次のように確認します。
const payload = jwt.verify(token, process.env.JWT_SECRET, {
algorithms: ["HS256"],
});
署名が合わなければ、トークンは無効です。
JWT の強み
JWT の大きな強みは、署名検証だけでトークンの正当性を確認できることです。
サーバ側セッションでは、毎回セッションストアを見ます。
session_id -> Redis / DB -> user情報
JWTでは、署名と有効期限を見ます。
JWT -> 署名検証 -> Payloadを信頼
この性質により、複数のAPIサーバやマイクロサービスで認証情報を共有しやすくなります。
JWT の弱み
一方で、JWT は「発行したあとに取り消しにくい」という弱点があります。
署名が正しく、有効期限内であれば、サーバはそのトークンを有効と判断します。ユーザーがログアウトしても、すでに盗まれたJWTが有効期限内なら使われる可能性があります。
これを防ぐには、ブラックリスト、トークンバージョン、短い有効期限などの工夫が必要になります。
| 課題 | 対策 |
|---|---|
| 盗まれたJWTが使われる | 有効期限を短くする |
| ログアウト後も有効 | ブラックリストやセッション管理を使う |
| Payloadが読める | 機密情報を入れない、必要ならJWEを検討 |
| 鍵が漏れる | 鍵管理、ローテーション |
JWT はどこで使うべきか
JWT は便利ですが、どこに置くかが重要です。
近年は、ブラウザにJWTを直接持たせるより、BFFやサーバ側にJWTを閉じ込め、ブラウザには HttpOnly Cookie だけを持たせる設計が増えています。
| 境界 | よくある選択 |
|---|---|
| Browser ↔ BFF | HttpOnly Cookie |
| BFF ↔ API | JWT / OAuth access token |
| Service ↔ Service | JWT / mTLS |
ポイント: JWT が悪いのではありません。ブラウザに高価値なJWTを読める形で置くことが危険なのです。
まとめ
JWT は、Header、Payload、Signature からなる署名付きトークンです。
- Payload は暗号化ではなく、読まれる前提で設計する
- Signature は改ざん検出のためにある
- 署名検証だけで認証できるため、サーバ間で使いやすい
- 盗まれると有効期限まで使われる可能性がある
- ブラウザに置く場合は保存場所を慎重に選ぶ
既存の詳しい解説は JWTの仕組み - トークンベース認証を理解しよう も参照してください。
参考リソース
- 公式ドキュメント - JWT とは何か - 署名付きトークンの仕組み を確認するための一次情報