セッションはサーバーに状態を持ち、JWT はトークン自体に情報と署名を持つ。失効のしやすさが大きな違い。
ログインしたユーザーを、次のリクエストでどう見分けるかの方法には、大きく2つあります。
- セッション:サーバーが「このセッション ID はユーザー 42」と保存し、ブラウザには ID だけを Cookie で渡す。
- JWT(JSON Web Token):ユーザー ID や期限をトークンの中に入れて署名する。サーバーは署名を確かめるだけで、保存先を引かなくてよい。中身は Base64 で、暗号化はされていない(誰でも読める)。
| 項目 | セッション | JWT |
|---|---|---|
| 状態の置き場所 | サーバー(DB・Redis) | トークンの中 |
| 失効(ログアウト・強制停止) | サーバーで消せばすぐ効く | 期限まで有効。すぐ止めるには拒否リストなど結局サーバーの状態が要る |
| スケール | 保存先を全サーバーで共有する(Redis など) | 保存先が要らず、別サービスでも鍵があれば確かめられる |
| 大きさ | ID だけで小さい | 情報を入れるほど大きく、毎回送られる |
| 向いているもの | 普通の Web サイト(同じドメインのブラウザ) | サービス間の認証、短い期限のアクセストークン、OAuth |
面接ではこう答える
ログインしたユーザーを見分ける方法には、セッションと JWT があります。セッションはサーバーがセッション ID とユーザーの対応を保存し、ブラウザには ID だけを Cookie で渡す方法で、サーバーで消せばすぐに失効できます。JWT はユーザー ID や期限をトークンに入れて署名する方法で、保存先を引かずに確かめられますが、期限まで失効させにくいです。同じドメインの普通の Web アプリなら、まずセッションで十分なことが多いです。
Webとの関わりログインの方式を選ぶときと、面接で最もよく聞かれる認証の質問への答えです。