Spring Boot セキュリティ関連

Spring Boot上でSpring Securityを利用しリクエスト毎にCSRFトークンを変えてみた

Spring Securityを利用すると、CSRFトークンのチェックが自動で実施されるようになるが、CSRFトークンは、セッション毎に1つの固定トークンを発行する仕組みになっている。

今回は、Spring Securityを利用して、さらにリクエスト毎にCSRFトークンの値を変更するよう修正してみたので、そのサンプルプログラムを共有する。

前提条件

下記記事の実装が完了し、Oracleデータベース上にuser_passテーブルが作成できていること

Spring Boot上でSpring Securityで認証時にDB上のユーザーを利用してみた今回は、Spring Securityを利用してユーザー認証を行う際に、データベースから取得したログインユーザーを利用するように修正して...

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

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

HTMLファイルについては、「<input type=”text” style=”background-color:#FFCCCC” size=”80″ th:name=”${_csrf.parameterName}” th:value=”${_csrf.token}”/>」というタグを、各formタグ毎に追加している。例えば、検索画面のHTMLの内容は以下の通り。



また、リクエスト毎に、CSRFトークンの値を変更するようなフィルタの内容は以下の通り。



さらに、Spring Securityの設定を行うクラスの内容は以下の通りで、configure(HttpSecurity http)メソッド内に、CSRFトークンをリクエスト毎に更新する処理を追加している。また、configure(WebSecurity web)メソッド内に、CSSファイルを読み込む際はSpring Securityのフィルタを通過しないように修正している。

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

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

「サンプルプログラムの作成」に記載したプログラムのうち、HTMLファイルのみを変更した場合の実行結果は以下の通りで、ログイン後はリクエストトークンの値が同じ値になっている。

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

2) ログインすると、CSRFトークンの値が変わっていることが確認できる。この状態で「検索」ボタンを押下
サンプルプログラムの実行結果_2

3) 一覧画面が表示され、CSRFトークンの値が変わっていないことが確認できる。この状態で「データ追加」ボタンを押下
サンプルプログラムの実行結果_3

4) 入力画面が表示され、CSRFトークンの値が変わっていないことが確認できる
サンプルプログラムの実行結果_4

また、「サンプルプログラムの作成」に記載したプログラムを全て変更した場合の実行結果は以下の通りで、ログイン後も、リクエスト毎に違うCSRFトークンが表示されるようになっている。

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

6) ログインすると、CSRFトークンの値が変わっていることが確認できる。この状態で「検索」ボタンを押下
サンプルプログラムの実行結果_6

7) 一覧画面が表示され、CSRFトークンの値が変わっていることが確認できる。この状態で「データ追加」ボタンを押下
サンプルプログラムの実行結果_7

8) 入力画面が表示され、さらにCSRFトークンの値が変わっていることが確認できる
サンプルプログラムの実行結果_8

なお、今回のサンプルプログラムは、複数のウィンドウを開く場合に対応できていない。複数のウィンドウを開く場合に対応するプログラムについては、以下の記事を参照のこと。

Spring Boot上でリクエスト毎にCSRFトークンを変える処理を複数画面を開く場合に対応してみた以前、Spring Securityを利用して、さらにリクエスト毎にCSRFトークンの値を変更するようにしたことがあったが、このプログラ...

要点まとめ

  • Spring SecurityのCSRFトークンは、セッション毎に1つの固定トークンを発行する仕組みになっている。
  • Spring Securityを利用してCSRFトークンをリクエスト毎に変更するようにするには、Spring Securityのフィルタ(CsrfFilter)の後に、リクエスト毎にCSRFトークンの値を変更するようなフィルタを追加すればよい。