概要
- JWT はユーザーログイン維持には不適切
- セッション管理には クッキーセッション が最適
- JWTは 短命トークン 用に設計
- localStorage での認証情報保存は非推奨
- PASETO など他の安全な手段の活用推奨
JWTをセッション管理に使うべきでない理由
- JWT は元々、 短期間(5分以内) のトークン用に設計
- 長期間のユーザーセッション維持には 不向き
- 安全な「ステートレス認証」は 現実的に不可能
- 結局、トークン管理のために 状態管理 (データストア)が必要
- それなら最初から 全データをサーバーに保存 する方が安全
- JWT で単純なセッショントークンを保存するのは 非効率かつ柔軟性に欠ける
- セッションCookie の方が 効率的かつ安全
- JWT仕様 自体が セキュリティ専門家から信頼されていない
- 過去に 偽トークン生成が可能 だった設計ミスも存在
- 詳細な問題点はこちらの記事参照
よくある反論・誤解
-
GoogleでもJWTを使っている?
- Googleは ブラウザ上のユーザーセッション には クッキーセッション を使用
- JWTは SSO(シングルサインオン) など、サーバー間のセッション移譲用途のみ
- GoogleのJWT実装は 独自・高セキュリティ で一般利用者とは別物
-
「ステートレス」の方が優れている?
- 真に安全なステートレス認証には 膨大なリソース が必要
- 実際「完全ステートレス」は 実現不可能
- 詳細はcryto.netの記事参照
-
セッションの設定が分からない?
- ほとんどの Webサーバーフレームワーク は セッション機能標準装備
- Expressなどの Node.jsフレームワーク はモジュール化されているが、 express-session ミドルウェアと storeコネクタ (例:connect-session-knex)で簡単に設定可能
認証情報の保存場所について
- localStorage や sessionStorage での認証情報(特にJWT)保存は 危険
- 参考記事
- XSS攻撃 などのリスクが高まるため非推奨
代替手段・推奨技術
-
短命トークン 用途には PASETO が推奨
- PASETO はセキュリティ設計が優れており、JWTの問題点を解消
- ただし、 セッション管理用途には使わないこと
-
セッション管理の仕組み についてはjoepie91のgistが参考
まとめ
- JWT は セッション管理 には使用しない
- クッキーセッション の利用が 安全かつ簡単
- PASETO や セッションストア など、用途に合った安全な技術選択が重要