やりたいこと
長いタイトルの通りです。
Vue.jsのアプリケーションから呼び出すAPIをSpring Bootで作ってまして、
そのAPIの負荷試験を行うことになったと。
JMeterを使用してシナリオを作成するのですが、Spring SecurityのCookieCsrfTokenRepositoryを使用したCSRF対策を使っているので
- CSRFトークンとして
XSRF-TOKENCookieの値を取得して -
POSTを使用したAPIをコールする際のX-XSRF-TOKENヘッダとして設定する
ということをシナリオ中で行う必要が生じたわけです。
試験対象APIのざっくり仕様
イメージだけ、こんな感じです。
| url | HTTPメソッド | 概要 |
|---|---|---|
| /login | POST | ID/Passwordを送信してログインする ログイン成功時に XSRF-TOKENCookieが付与されるCSRFチェック対象外 |
| /orders | POST | 受注登録を行う CSRFチェック対象 |
環境
アプリケーション
- Spring Boot 2.1.4
ツール
- Apache JMeter 5.1.1
- 設定はGUI起動で実施します。
JMeterの設定
XSRF-TOKENの値を取得する
/loginのレスポンスにXSRF-TOKENのCookieが含まれることになるので、それを抽出することになります。
一応、DevToolsで/loginのレスポンスを見てみると、こんな感じです。
設定
/loginの呼び出しはHTTP Requestサンプラーで定義します。(詳細は割愛)
このサンプラーの実行後に、正規表現抽出を使用して、CSRFトークンを取得します。
手順
-
/loginのHTTP Requestサンプラーを選択して右クリック -
ADD→Post Processors→Regular Expression Extractorを選択 - 以下の通り設定する(NameとCommentsは適当です)
- Response Headersから抽出する
- ヘッダからの抽出になるので、先程DevToolsで確認した形式、要は「Set-Cookie:」を含んだ形式で正規表現を書く必要がある
というあたりがポイントでしょうか。
これ以降のシナリオでは、${xsrf_token}を指定することで、抽出した値を変数から解決することができるようになります。
X-XSRF-TOKENヘッダを設定する
/ordersはCSRFチェック対象となるため、コール時にX-XSRF-TOKENヘッダを設定する必要があります。
設定
/ordersの呼び出しはHTTP Requestサンプラーで定義します。(詳細は割愛)
このサンプラーの実行時に、HTTP Header Managerを使用して、X-XSRF-TOKENヘッダを設定します。
手順
-
/ordersのHTTP Requestサンプラーを選択して右クリック -
ADD→Config Element→HTTP Header Managerを選択 - 以下の通り設定する(NameとCommentsは適当、content-typeは今回のAPI固有の仕様で必要なため設定しています)
先程取得した${xsrf_token}を、X-XSRF-TOKENヘッダとして設定しています。
まとめ
以上の設定で、CSRF対策を通過させることができます。
JMeterに不慣れだと、こういうちょっとした応用ってすぐに思いつかなくて
意外と悩むかなと思った(不慣れな私の実体験です)ので書き留めておきました。
参考ページ
以下を参考にさせていただきました。
ありがとうございました。

