tokenを保存する場所
- localStorage
- cookie
- cookie (http only)
- メモリ内 (変数)
よく言われるのが JWT tokenをlocalStorageに入れるべきではない ということ。
理由としてはJavascriptで簡単に読めてしまうので、XSSがあった場合意図しないスクリプトを動かされてしまい、結果としてtokenが盗まれるというもの。
対応策として cookie (http only) を色んな所で推奨してる。
- https://techracho.bpsinc.jp/hachi8833/2019_10_09/80851
- http://cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions/
- http://cryto.net/~joepie91/blog/2016/06/19/stop-using-jwt-for-sessions-part-2-why-your-solution-doesnt-work/
が、cookie (http only)も実は無意味
localStorage vs Cookies for Auth Token Storage - Why httpOnly Cookies are NOT better!
https://www.youtube.com/watch?v=mBd-SMPp3kI
XSSがある場合、とにかくスクリプトを動かされてしまう。「だけど、cookie (http only)はスクリプトから読めないから問題ないじゃないか!」と思うが、攻撃者が自身のサーバーを作って、fetch
で credentials: "include" をしてしまえば、http only cookieを含めた全部を攻撃者のサーバーに送れちゃうよ、という話。
が、同ドメインな場合のみである
Cookies do not provide isolation by port. If a cookie is readable by
a service running on one port, the cookie is also readable by a
service running on another port of the same server. If a cookie is
writable by a service on one port, the cookie is also writable by a
service running on another port of the same server. For this reason,
servers SHOULD NOT both run mutually distrusting services on
different ports of the same host and use cookies to store security-
sensitive information.
今回このyoutubeではlocalhost
ドメイン内で3000
、8000
ポートを使っていたので、すべてのcookieがcredentials: "include"
でダダ漏れっぽく見えていた。
これをa.domain
からb.domain
へのcredentials: "include"
であった場合は、a.domain
のcookieはb.domain
へ漏れない。