JWTをセッション管理に使っていいだのよくないだのいう話
結論
リスクを理解して使えば良い
よく言われるリスク
セッションを即時無効化できない
リソースサーバーはAuthサーバーにいちいち問い合わせないので、Authサーバーで無効にしてもトークンの有効期限の範囲内でセッションは続く
トークンにその辺の情報も含まれているので
そのためアクセストークンの有効期間短くしてリフレッシュトークンを使う
これは対策であって反論ではないかな
即時無効化できないのは事実
どの程度のリスクと捉えるか
アクセストークンが盗まれてる時点でアレなので、検知してから無効化できるまでの時間を数時間〜数十分程度早められる(もしくは遅くなる)ことをどれほど意味があると考えるか
Firebaseでは1時間で切れるようだ
リフレッシュトークンの期限が切れる条件も載っている
パスワードを変えたりしても最大1時間は前のセッションが有効ということだな
と思ったんだけど、無効化できると書いてあるような気がする
有効期間はどれくらい短くしても現実的に問題ないのだろうか
Web Storageに保存することによるXSSのリスク
CookieならHttpOnlyつければブラウザしかアクセスできなくなる
それでもXSS対策としてはほとんど意味がない(と言われてる気がするけど本当だろうかzakuni.icon)
https://postd.cc/web-storage-the-lesser-evil-for-session-tokens/
https://www.gnucitizen.org/blog/why-httponly-wont-protect-you/
あとなんかCSRF周りの話もある?
CSRFでXSSを起こしたりとか
多分この辺は、CookieとWebStorageを比較する別の話なのだと思う
ちなみにSessionStorageはページセッションの間持続するストレージであって、サーバー側のセッションを入れるためのものではない
誤解を生む名前になってる気がする
そもそもJWTやJOSEの仕様に問題があるという主張
セッション管理とか以前に
https://postd.cc/jwt-json-web-tokens-is-bad-standard-that-everyone-should-avoid/
セッションIDでなく、セッションデータそのものの情報をJWTで返して使わせるのにはリスクがある(?)
セッションIDでも盗まれたらセッションハイジャックされるのは変わらないはずだな……?
Authサーバーへの問い合わせが挟まることで無効化できるようになったりするということか
JWTにはそもそも電子署名が含まれているはずで、この場合セッションデータと呼んでいるものはなんだろうか
アクセス権とかの情報かな
どの話をしてるのかによってリスクも変わる
Stateless JWT
JWTそのものはステートレス
Statefull JWT
JWTとCookieの組み合わせとか
http://cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions/
ちゃんと中身(とリスク)を理解して使いましょう、というセキュリテイの基本的な話のようだ
セキュリティはリスクの高低の話であって、0か1かではない
それメリットになってないよって話と明らかなデメリットだよって話が混ざってるとわかりにくい
セッションに関するリスクということで、こんな感じだろうか
セッションハイジャックのやり易さ
された場合にどれぐらい被害が広がるか
検出できるかどうか
これらについても、違うテーマについて話すと噛み合わない
攻撃そのものをどう防げるか
攻撃が成功してしまった場合にどう対処できるか
あと、検知できるか
完璧に防げないからダメ、みたいなのはナンセンス
未知の脆弱性について語ることはできないので
どうだから意識しなくても防げるかとか、こうだから脆弱性を生みやすいとかならわかる
なので被害をどう最小限にできるか、という話も当然含まれて然るべき