JWTって何の略?
JWTは「JSON Web Token(ジェイソン・ウェブ・トークン)」の略で、読み方は「ジョット」または「ジェイダブリューティー」。ざっくり言うと、「この人は確かに本人ですよ」という情報を、改ざんできない形で1本の文字列に詰め込んだものです。
Webアプリやサービス連携の話をしていると、やたらと出てくる用語です。最初は「なんか長いランダムな文字列でしょ?」と思いがちなんですが、実はランダムではなく、中身をちゃんと読める構造を持っています。
身近な例え:ライブ会場のリストバンド
音楽フェスに行くと、入口でチケットと引き換えにリストバンドを巻いてもらいますよね。あのリストバンドには、こんな性質があります。
- 見れば「一般席なのかVIPなのか」がすぐ分かる(情報が書いてある)
- 特殊な留め具になっていて、外すと壊れる・自作しても見破られる(偽造できない)
- 一度渡したら、スタッフはいちいち本部に電話して「この人チケット買いましたか?」と確認しなくていい(その場で判断できる)
- その日限りで、翌日は使えない(有効期限がある)
JWTはまさにこのリストバンドです。ログインに成功したユーザーにサーバーが1本発行して、以降ユーザーはリクエストのたびにそれを提示する。サーバーは毎回データベースを引かなくても、そのトークン自体を見れば「誰で、何ができる人か」を判断できます。
中身は3つのパーツ
JWTは長い文字列ですが、よく見るとピリオド(.)で3つに区切られています。
どんな署名方式か
ユーザーIDや有効期限
改ざん検知用のハンコ
見た目はこんな感じです。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMiLCJuYW1lIjoiVGFybyJ9.dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
それぞれの役割を整理するとこうなります。
| パーツ | 入っているもの | リストバンドで言うと |
|---|---|---|
| ヘッダー | 署名アルゴリズムの種類、トークンの型 | バンドの素材・規格 |
| ペイロード | ユーザーID、権限、発行時刻、有効期限など | 「VIP」などの印字 |
| 署名 | ヘッダーとペイロードから計算した検証用の値 | 偽造できない特殊な留め具 |
「暗号化」ではないという落とし穴
ここが初心者が一番つまずくところです。JWTのヘッダーとペイロードはBase64というエンコード方式で変換されているだけで、暗号化されていません。つまり、トークンを手に入れた人は誰でも中身を読めます。
「じゃあ意味ないじゃん」と思うかもしれませんが、JWTが守っているのは秘密ではなく「改ざんされていないこと」です。中身を書き換えて「自分は管理者だ」と偽ろうとしても、署名が合わなくなるのでサーバー側にバレます。
逆に言えば、パスワードやクレジットカード番号のような、他人に見られて困る情報をJWTに入れてはいけません。リストバンドの表面に自宅の住所を書くようなものです。
どんな流れで使われるのか
- ユーザーがIDとパスワードでログインする
- サーバーが本人確認をして、署名付きのJWTを発行して返す
- ブラウザやアプリはそれを保存しておく
- 以降のリクエストで、そのJWTを一緒に送る
- サーバーは署名を検証して、問題なければ処理を実行する
ポイントは4と5です。サーバーは「このトークンを発行した記録」をどこかに保存しておかなくても、署名を計算し直すだけで正当性を判定できる。この性質のおかげで、サーバーが何台に増えても同じ鍵さえ共有していれば検証できるので、大規模なサービスと相性がいいわけです。
有効期限が短めな理由
JWTには有効期限を持たせるのが普通で、数分〜数時間といった短めの設定がよく使われます。というのも、いったん発行してしまったJWTはサーバー側に記録が残らない設計だと、「あのトークンを今すぐ無効にしたい」というのが苦手だからです。
リストバンドを配ってしまった後で「あの人のバンドだけ無効にしたい」と言われても、全スタッフに人相を伝えて回るしかないですよね。だから、そもそも寿命を短くしておいて、期限が切れたら別の仕組みで再発行する、という設計がよく取られます。
覚えておきたいこと
JWTは「本人であることを証明する、偽造できない紙切れ」だと思っておけば、まずは十分です。中身は読めるが書き換えられない、そして期限がある。この3点さえ押さえておけば、認証まわりの話についていけるようになります。
このページは役に立ちましたか?