#localStorageは危ない?
いくつかの記事で見かけましたが、localStorageはXSSが発生すると中身を参照できるので、JWTトークンを保存すべきではない。という記事です。確かにAuth0の記事にも、そのようなことが書かれていますね。まあAuth0の記事は、XSSを含め悪意のあるJavascriptで見れないようにしないといけないという論調でしょうか。
確かに「httpOnly:true」で「secure:true」ならおそらく盗めませんが。
#localStorageはクロスドメインでは参照できないですよね
調べてみると、当たり前ですがlocalStorageは基本クロスドメインでは読めない。(iFrameとPostMessageを利用してい、参照される側のドメインのスクリプトで渡してやれば別ですが)
うーん、問題ないんじゃない?
#XSSされたらJWTトークンなていらないですよね
そもそもXSSでスクリプトが埋め込まれたら、CSRFとかも関係無く好きなリクエストが投げられるのだから、JWTなんか盗まなくっても、自分の口座に現金振り込むリクエストがあればそれでOKですよね。XSSからJWTを守るってなんか本末転倒な気がする。
XSSが実現した時点で認証は突破されているので、どのようなセキュリティーも意味がないと思うんですが。
こう考える私は、おかしいんでしょうか?
#Javascript禁止するのが一番では
XSSがあっても大丈夫というか回避したいのなら、javascriptを禁止してフォームからのPOSTのみの送信にするのが正解では?そうすればXSSはできない。CSRFは成立するので、その対策は必要ですが。問題なのは、サーバー側からクライアントサイドのJavascriptを禁止できないことでしょうか。警告を出してお願いするしかないような。
#それでもjavascriptを使うなら
重要処理のみサーバー側でAjaxからのコールを禁止(リクエストヘッダの「X-Requested-With:XMLHttpRequest」で判断できそう)、なおかつ利用可能な画面からのリクエストかどうかを「Referer」で判断しておけば、危険な処理はそれが実行できる画面が表示されないとできないので、動作させても利用者が気づくかと思います。(Refererの変更ってJavascriptからで切るんでしょうか?出力させないことはできるようですが変更はできなさそうな)それでもページがバックになったときに実行されるとだめですよね。
うーん、XSSされても大丈夫な状態が考えられない。やっぱリ基本はXSSされないようにHTMLへの埋め込みはしっかりサニタイズする事では?
#この記事について
そもそもの発端はSPAの認証を記事にした後に、XSSとCSRFの対策でセキュリティーについて考えてネットを彷徨って見つけた記事が気になったので書いてみました。たたかれることは覚悟で書いてます(へこむとは思いますが)。異論があれば返事はしかねるかもしれませんがどうぞ。(というか打ちのめされて、記事を引っ込めるかもしれませんが)
#ここまで書いて再度調べてみたら同じ意見があった
「おーい磯野ー,Local StorageにJWT保存しようぜ!」で同じこと考えてました。
だよねー。