質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

2回答

13940閲覧

CSRF対策したページにブラウザの異なるタブからログイン

plue

総合スコア71

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

2クリップ

投稿2017/04/10 09:57

現状

SpringBoot、thymeleafを使用して、WEBアプリケーションを作成しています。
ログイン画面を実装しているため、Spring Securityを利用しており、
CSRF対策としてトークンを発行しWEB画面に埋め込まれるようにしております。

html

1 <!-- CSRF対策用トークン埋め込み --> 2 <input type="hidden" id="crsf_tokn" th:value="${_csrf.token}"></input>

上記の状態で、ブラウザ(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タブ目でもログインできるようにする方法がありますでしょうか?

以上、よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

  • トークンにセッションIDやセッションIDから導出した値を用いる実装のため、ログイン時にセッションIDが振り直されトークンも変化した
  • ログイン操作などセッションIDが振り直される際には既存のトークンが無効化される
  • セッションIDとは無関係にワンタイムトークンが使用される

フレームワークの実装次第なのですが、こういうことが考えられます。「セッションが同じであればトークンは変化しない」というものでもありません。

2タブ目でもログインできるようにする方法がありますでしょうか?

タブが別でもセッションは同一ですので、2タブ目も既にログインしている状態と言えます。これまたフレームワークの実装次第なのですが、ログイン処理を行う前にログイン状態をチェックしてログイン後の画面にリダイレクトする処理が追加できませんか。

投稿2017/04/10 21:55

suzukis

総合スコア1449

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

plue

2017/04/11 00:59

回答いただきありがとうございます。 セッションが同じでもトークンが異なることがあるのですね。 SpringBootにログイン状態をチェックできる機能があるかどうか、調べてみたいと思います。
guest

0

ベストアンサー

1タブ目はログインした=つまりサーバへリクエスト~レスポンスしているので、トークンの値は更新されたものがセッション+画面に反映されます。
対して2タブ目は何もしていませんので、トークンの値はそのままですが、セッションの値は他の値(1タブ目の値)になっていますので、2タブ目を操作するとCSRFトークンチェックエラーです。

リクエストパラメータにトークンを埋め込む方法では複数タブに対応できませんので、CookieCsrfTokenRepository を用いてクッキーにトークンを発行する方法であれば実現できるでしょうか。セキュリティ要件次第なところもありますが…。

https://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html#csrf-cookie

投稿2017/04/11 06:35

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

plue

2017/04/14 06:36

回答いただきありがとうございます。 また、返信が遅くなり申し訳ありません。 いただいた回答を元に、クッキーにトークンを発行する方法で、 画面遷移およびajax通信時にトークンをクッキーにて最新化する処理をすることで実現することができました。(セキュリティ要件はこれから詰めていきます。。。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問