間違い
このように ただログアウトページへのリンクだけ でした。
<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
<body>
<h1>login-success</h1>
<a th:href="@{/logout}">ログアウト</a>
</body>
</html>
こんな動作になってしまっていました。
- ログアウトのリンクをクリック。
- その後に再度認証が必要なページのURLへ直接行けてしまった。
- セッションが残ったまま = ログアウトできていなかった。
正しくはこう
SpringBootにはクロスサイトリクエストフォージェリー対策が施されているので、hiddenパラーメーターを送ってあげる必要がありました。
formであればそのhiddenパラーメーターが送られるようになります。
hiddenパラーメーターのタグはコーディング不要です。
formタグを使えばフレームワーク側で勝手に追加してくれます。
<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
<body>
<h1>login-success</h1>
<form th:action="@{/logout}" method="POST">
<!-- aタグのリンクだとクロスサイトリクエストフォージェリー対策のhiddenパラメータが送られず、セッション破棄されないので注意 -->
<button type="submit" value="go">ログアウト</button>
</form>
</body>
</html>
この記事やってる時に発見
参考サイトさん
バージョン
Microsoft Windows [Version 10.0.22631.3447]
JAVA 17.0.10
Spring Boot v3.1.11