最初に
こんにちは、1年目の新米エンジニアのミツクマです🐻
今日は、業務の中で詰まった内容と解決方法を書いていこうと思います。
それでは、よろしくお願い致します。
あれ?なんでエラー?
ブラウザからPOSTで送信しようといたところ
エラーが出ていました。見てみると
message=Request method 'GET' not supported
403 forbidden....?(宇宙猫の顔)
認証が必要な実装した覚えはないし、なんでGET...?となっていました。
先に結論
なんらかの手段でトークンを取得して、http headerにトークンを設定してあげないといけない。
解決のためにあれこれ調べる
単純にエラー文で調べてみても
403エラー 原因で調べても
- パーミッションのミス
- 送信するディレクトリのミス
- インデックスページの確認
...など自身の悩みの原因とは違う結果が出てきました。
色々調べ方を変えて、spring securityのページに行きつきました。
SpringSecurityは厳重なCSRF対策を行っており、有効化されている場合にPOSTやPUTと言ったリクエストメソッドに対してトークンを要求するため。設定しないで、送信すると問答無用で403を返します。
CSRFとは
クロスサイトリクエストフォージェリの略称で
Webアプリケーションに存在する脆弱性、もしくはその脆弱性を利用した攻撃方法のことです。
こ、こ、これだ!!!
ということで、formをこの様に変更しました。
<form method="POST" class="hoge">
<input
type="hidden"
th:name="${_csrf.parameterName}"
th:value="${_csrf.token}"
/>
以下省略
formにトークンを設定することで無事動いてくれました。
これ以外にも方法はある
業務で使用するファイルのため採用しませんでしたが、WebSecurtyConfigureに特定のページだけcsrfチェックを除外する方法などもあります。
その場合は、WebSecurityConfigurerAdapterを継承しているファイルで
http.csrf().ingnoringAntMatchers(...antPatterns)
このように設定することで、特定のページのcsrfチェックを除外することができます。
まとめ
この経験を通して覚えたことは
- CORSを考える
- spring securityを実装している場合は、formにトークンを付与する
- 何が原因なのかを切り取る力と調べる力が不足していること
上二つは技術的に知らない事を知れてよかったです。
最後の項目は、これから数々のコードを読んだり実装していく中で
成長させるべき力だと思うので、研鑽を積んでいきたいと思います。
最後に
僕と同じような原因で、詰まってしまっている人の力になれたらと思います。
最後まで、読んでいただきありがとうございます