こんにちは!システム開発部の福井です!

この度、JMeter を使用したシナリオ作成で、CSRF保護されたページからのPOSTリクエストを行うにあたり、何度か403エラーで弾かれてしまったため、その解決方法についてご紹介させていただきます!

本記事では、主に
・CSRFトークンの取得
・取得したトークンを使用したPOSTリクエスト
の2点についてご紹介させていただきます!

※ちなみに、個人的な備忘録も兼ねて、覚えておきたい JMeter の設定をブログ末尾に記載いたしました。これから JMeter を使われる方は最後までお読みいただけますと幸いです。

CSRFトークンの取得

では早速、CSRFトークンの取得方法からご説明いたします。
CSRFトークンを取得するには「正規表現抽出」機能を使用します。

■ 「正規表現抽出」機能の追加

正規表現抽出の追加方法ですが、CSRFトークンを発行している画面表示のHTTPリクエストのサンプラーに対して、
『追加』→『後処理』→『正規表現抽出』の設定を行う事で追加する事ができます。
※例えば、ログイン処理のPOSTリクエストがあり、そのリクエストパラメータでCSRFトークンが必要な場合、事前の「ログイン画面表示」のGETリクエストに対して、正規表現抽出を追加する流れとなります。

追加ができたら以下の画面が表示されますので、各項目の設定を行います。

■「正規表現抽出」の設定

今回は例として以下の様に設定を行いました。設定が必須の項目についてご説明させていただきます。

① Field to check

抽出したい値の対象を選択します。今回は、「Body」を選択してください。
※CSRFトークンを抽出するページのGETリクエストのレスポンスボディを利用するため。

② 参照名

抽出した値(今回はCSRFトークン)が入る変数を入力します。後ほど、POST送信する際のCSRFパラメータの値として使用します。任意の文字列を入力してください。

③ 正規表現

CSRFトークンが入るinputタグを入力します。value属性の値を正規表現で書くことで、CSRFトークンの値を取得できます。
※上記画像の入力内容は一例となります。実際に画面表示のレスポンスで取得できるinputタグの形式に合わせて修正してください。inputタグの形式が異なるとCSRFトークンの値が取得できません(id属性の有無や、name属性の入力ミスなど)。特につまづきやすいポイントになるため、可能であれば、実際にデベロッパーツールでhtml内のinputタグをコピーしてvalue属性の値を修正して利用する事をおすすめいたします。

④ テンプレート

抽出した値の「~番目」を使用するかを指定します。特に指定がなければ、最初に取得した値を使うため、「$1$」を入力してください。

正規表現抽出の設定は以上となります。

取得したトークンを使用したPOSTリクエスト

では、次に取得したCSRFトークンをリクエストパラメータに含めてPOST送信する方法をご紹介いたします。

以下にリクエストパラメータの設定例を掲載いたしました。

設定は非常に簡単で、対象となるPOSTリクエストのサンプラーに「${正規表現抽出で設定した参照名}」の形式でパラメータを設定する事で、取得したCSRFトークンを送る事ができます。

あとは状況に応じて、リクエストヘッダや、その他必要なパラメータを設定して完了となります。

おまけ(覚えておきたいJMeterの設定)

冒頭でご紹介させていただきました通り、JMeterの「覚えておきたい設定」を2つご紹介させていただきます。

■ Basic認証

負荷試験を実施する際、Basic認証が必要な場合は「HTTP認証マネージャ」を使用する事でログインする事ができます。
HTTP認証マネージャは「スレッドグループ」、「シンプルコントローラ」、もしくはBasic認証が必要な「最初のHTTPリクエストのサンプラー」のいずれでも追加が可能です。
『追加』→『設定エレメント』→『HTTP認証マネージャ』で追加する事ができます。

HTTP認証マネージャの追加ができましたら、上記画面が表示されますので、「基底URL」「ユーザー名」「パスワード」を入力し、設定は完了となります。

■ HTTPクッキーマネージャ

続いて、シナリオで cookie 保持が必要な場合についてですが、こちらは、「HTTPクッキーマネージャ」を設定する事で cookie情報の利用が可能となります。
HTTPクッキーマネージャも「スレッドグループ」、「シンプルコントローラ」、「サンプラー」のいずれにも追加が可能で、『追加』→『設定エレメント』→『HTTPクッキーマネージャ』で追加する事ができます。

追加できましたら上記画面が表示されますが、HTTPクッキーマネージャは特段、テストに使用したい値がなければ、このまま利用する事ができます。
※「繰り返しごとにクッキーを破棄しますか?」の項目ですが、こちらはチェックを入れる事でループ毎のクッキーを破棄する事ができます。
※HTTPクッキーマネージャ追加後、シナリオを実行し、リクエストボディで Cookie Data が送られている事が確認できたら設定は完了となります。

今回は以上となります!
最後までお読みいただきまして、ありがとうございました!