JWTトークンはLocalStorageではなくHTTP OnlyでSecureなCookieに保存しよう
もう結論はタイトルに全部入れ込んだので、これから話す内容はすべてタイトルの通りです。
JWTトークンをどこにどうやって保存しようか悩み、色々調べた結果HTTP OnlyでSecureなCookieが一番セキュリティ的に安全という結論に至りました。
LocalStorageと通常のCookieは絶対ダメではないがちょっと怖い
LocalStorageや通常のCookieはJavaScriptにより取得したりセットしたりと操作することができます。
自分のJWTトークンが自分のブラウザ上に保存されているだけなので一見安全のように見えるのですが、もしシステムにXSS(クロスサイトスクリプティング)脆弱性があると、知らない間に悪意のある第三者にトークンが抜き取られてしまい、なりすましが発生する可能性があります。
自分のシステムはXSS対策しているから大丈夫だー!という方もいらっしゃるかもしれませんが、基本的に機密情報はJavaScriptで取得できるところに保管しないのが一番安全です。攻撃者がいつ新しい脆弱性を発見して攻撃してくるか分かりません。
トークンはHTTP OnlyでSecureなCookieが安心
Http OnlyをTrueにするということは、JavaScriptのようなフロントエンド側ではCookieの値を取得したり作成したりはできません。サーバーサイド側でしか操作できないので、XSS脆弱性が仮にあったとしてもCookieの値は取得できません。
また、Secure属性をTrueにするということは、httpsの場合でしかCookieの値は送信されないので中間者攻撃を受けることがなくなります。
httpでリクエストを送るとリクエスト内容が容易に見られてしまうので気をつけてください。
今回は私がJWTトークンの保管場所を調べた結果「Http Only」で「Secure属性がTrue」の状態でCookieをセットするのが良いという結論になりました。
が、JWTトークンだけではなく、いろんなトークンのような機密情報にも同じことが言えるので参考にしてみてください!
Discussion