5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【spring security + POST】あれ?なんで403エラー?

Posted at

最初に

こんにちは、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.html
<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にトークンを付与する
  • 何が原因なのかを切り取る力と調べる力が不足していること

上二つは技術的に知らない事を知れてよかったです。
最後の項目は、これから数々のコードを読んだり実装していく中で
成長させるべき力だと思うので、研鑽を積んでいきたいと思います。

最後に

僕と同じような原因で、詰まってしまっている人の力になれたらと思います。
最後まで、読んでいただきありがとうございます

5
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?