質問: 現状 -- SpringBoot、thymeleafを使用して、WEBアプリケーションを作成しています。 ログイン画面を実装しているため、Spring Securityを利用しており、 CSRF対策としてトークンを発行しWEB画面に埋め込まれるようにしております。 ``` ``` 上記の状態で、ブラウザ(Chromeを使用)上の異なるタブからWEBアプリケーションした際、 1タブ目のログイン後、2タブ目でログインしようとすると、以下のエラーが発生します。 ``` Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Mon Apr 10 18:45:49 JST 2017 There was an unexpected error (type=Forbidden, status=403). Invalid CSRF Token '9ffc4be1-4a5e-48c3-880b-db6c8e741078' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'. ``` トークンの値が現在のセションに紐づくものでない('9ffc4be1-4a5e-48c3-880b-db6c8e741078'ではない)ため、 エラーが出ているのではないかと思っています。 画面を操作する上で、発行されるトークンの値は以下のようになっています(トークン値が長いのでABC・・・で書いています) ・1タブ目のログイン画面・・・トークン値はA ・2タブ目のログイン画面・・・トークン値はA ・1タブ目のログイン以降の画面・・・トークン値はB ・2タブ目のログインしようとしたときに上記エラーが発生(トークン値がBでないため) 質問 -- 【質問1】 1タブ目のログイン前後でトークンの値が変更するのはなぜですか? セッションが同じであればトークンも同じだと思っていたのですが。。。 【質問2】 2タブ目でもログインできるようにする方法がありますでしょうか? 以上、よろしくお願い致します。
回答: 1タブ目はログインした=つまりサーバへリクエスト~レスポンスしているので、トークンの値は更新されたものがセッション+画面に反映されます。 対して2タブ目は何もしていませんので、トークンの値はそのままですが、セッションの値は他の値(1タブ目の値)になっていますので、2タブ目を操作するとCSRFトークンチェックエラーです。 リクエストパラメータにトークンを埋め込む方法では複数タブに対応できませんので、CookieCsrfTokenRepository を用いてクッキーにトークンを発行する方法であれば実現できるでしょうか。セキュリティ要件次第なところもありますが...。