Spring Boot セキュリティ関連

Spring Boot上でリクエスト毎にCSRFトークンを変える処理を複数画面を開く場合に対応してみた

以前、Spring Securityを利用して、さらにリクエスト毎にCSRFトークンの値を変更するようにしたことがあったが、このプログラムは、同じアプリケーション内で複数画面を開く場合に対応できていなかった。

今回は、複数画面を開いた場合でも、リクエスト毎にCSRFトークンの値を変更するよう修正してみたので、そのサンプルプログラムを共有する。

前提条件

下記記事の実装が完了していること

Spring Boot上でSpring Securityを利用しリクエスト毎にCSRFトークンを変えてみたSpring Securityを利用すると、CSRFトークンのチェックが自動で実施されるようになるが、CSRFトークンは、セッション毎に...

サンプルプログラムの作成

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上記の赤枠は、前提条件のプログラムから変更したプログラムである。

今回新規で追加したFilterクラスは以下の通りで、リクエストパラメータとして受け取った「windowName」毎に、セッションキーの値を変更できるようにしている。

また、Spring Securityの設定を行うクラスの内容は以下の通りで、configure(HttpSecurity http)メソッド内に、セッションキーの値を変更する処理(UpdSessionCsrfFilter.java)を追加している。

さらに、検索画面の内容は以下の通り。

「新しい画面を開く」ボタンを追加していて、このボタンが押された場合に、windowName=new_window1というパラメータ値を送信できるようにしている。このようにすることで、UpdSessionCsrfFilter.java内で、セッションキーの値が変更されるようになっている。

また、新しく開く画面の内容は以下の通りで、検索画面で追加した「新しい画面を開く」ボタンが押下された場合と同じように、「windowName=new_window1」をパラメータとして渡すようにしてる。

さらに、新しく開く画面から遷移する画面の内容は以下の通り。

また、コントローラクラスに追加する処理は以下の通りで、「新しい画面を開く」ボタンが押下された場合の処理と、新規オープン画面2に遷移する処理を追加している。

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-security-reqtoken-mltwindow/demo

サンプルプログラムの実行結果

実行結果は以下の通りで、複数画面を開く場合も問題なく動作することが確認できる。

1) Spring Bootアプリケーションを起動し、「http://(サーバー名):(ポート番号)/」とアクセスすると、以下のログイン画面が表示されるので、ユーザー名・パスワードを入力し「ログイン」ボタンを押下
サンプルプログラムの実行結果_1

2) 検索画面に遷移するので、「新しい画面を開く」ボタンを押下
サンプルプログラムの実行結果_2

3) 以下のように、以前の画面とは別に「新規オープン画面1」が開くことが確認できるので、「次へ」ボタンを押下
サンプルプログラムの実行結果_3

4) 以下のように、画面遷移することが確認できるので、ここで「index page」タブを押下
サンプルプログラムの実行結果_4

5) 下記画面で「検索」ボタンを押下
サンプルプログラムの実行結果_5

6) 以下のように、一覧画面が正常に表示できることが確認できる
サンプルプログラムの実行結果_6

要点まとめ

  • 複数画面を開いた場合でも、リクエスト毎にCSRFトークンの値を変更できるようにするには、CsrfFilterを実行する前に、セッションキーの値を変更する処理を追加すると共に、リクエストパラメータに、ウィンドウ毎にセッションキーを識別できる情報を渡せばよい。