やりたいこと
長いタイトルの通りです。
Vue.jsのアプリケーションから呼び出すAPIをSpring Bootで作ってまして、
そのAPIの負荷試験を行うことになったと。
JMeterを使用してシナリオを作成するのですが、Spring SecurityのCookieCsrfTokenRepository
を使用したCSRF対策を使っているので
- CSRFトークンとして
XSRF-TOKEN
Cookieの値を取得して -
POST
を使用したAPIをコールする際のX-XSRF-TOKEN
ヘッダとして設定する
ということをシナリオ中で行う必要が生じたわけです。
試験対象APIのざっくり仕様
イメージだけ、こんな感じです。
url | HTTPメソッド | 概要 |
---|---|---|
/login | POST | ID/Passwordを送信してログインする ログイン成功時に XSRF-TOKEN Cookieが付与される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に不慣れだと、こういうちょっとした応用ってすぐに思いつかなくて
意外と悩むかなと思った(不慣れな私の実体験です)ので書き留めておきました。
参考ページ
以下を参考にさせていただきました。
ありがとうございました。