554 文字
3 分
JWTの中身と運用上の落とし穴
JWT は JSON Web Token の略で、署名済みのユーザー情報を一つの文字列にパッケージングしたものです。サーバーがセッションを保持しなくても認証情報を持ち運べるため、スケールの観点で扱いやすいトークンとして広まりました。
構造
JWT は3つのパートをドットで繋いだ文字列です。
<ヘッダー>.<ペイロード>.<署名>- ヘッダー:アルゴリズム(例:
HS256、RS256)とトークン種別。 - ペイロード:実際に運びたい情報(ユーザーID、ロール、有効期限など)。これを「クレーム」と呼びます。
- 署名:ヘッダーとペイロードを秘密鍵(または公開鍵ペア)で署名したもの。
3つのパートは Base64URL でエンコードされているだけで、暗号化されているわけではない 点に注意が必要です。誰でも中身を読めます。
何が便利か
- サーバーがセッション情報を保持しなくていいので、複数台にスケールしやすい。
- マイクロサービス間でユーザー情報を持ち回すときの共通フォーマットとして使いやすい。
- 公開鍵方式(RS256など)にすれば、検証だけ別サービスに任せる構成が取れる。
実運用での注意点
- 失効が苦手:一度発行すると、有効期限まで生き続けます。ログアウトや「全端末から強制サインアウト」を実現するには、別途ブラックリストやバージョン番号の仕組みが必要です。
- 短い有効期限+リフレッシュトークン が定番の組み合わせ。
- 秘密情報を入れない:ペイロードは読めるので、機微な情報は載せません。
alg: none攻撃:受け取った JWT のヘッダーで指定されたアルゴリズムをそのまま信じると、署名なしのトークンを受け入れてしまう実装ミスにつながります。サーバー側で許容するアルゴリズムを固定するのが鉄則です。- 保存場所:LocalStorage に置くと XSS の的になりやすく、HttpOnly Cookie に置くと CSRF 対策が必要、というトレードオフがあります。
便利さの裏側に運用上の罠が並んでいるので、「セッションの代替」と単純に捉えず、性質の違うトークンだと意識して使うのが安全です。