개인블로그를 개발할 때 로그인 회원가입 기능이 있기 전, 게시물 CRUD만 가능할 때는 폼의 액션을 사용할 때
<form action="/post/create">
<input type="text">
</form>
이런 식으로 사용해도 정상적으로 폼이 작동했다.
하지만 로그인 회원가입 기능을 수행하기 위해 빌드에 스프링 시큐리티를 추가하고 나니 403 에러가 뜨면서 기능이 제대로 작동하지 않았다.
이는 스프링 시큐리티는 기본적으로 CSRF 토큰을 필요로 하기 때문이었다.
CSRF 토큰은 웹 애플리케이션에서 발생할 수 있는 보안 취약성을 방어하기 위한 메커니즘 중 하나이다. 이를 통해 악의적인 사용자가 인증된 사용자의 권한으로 웹 애플리케이션에 대해 요청을 위조하는 것을 방지할 수 있다.
그래서 스프링 시큐리티를 사용할 때 CSRF 토큰을 포함하지 않고 액션을 사용하려고 하면 스프링 시큐리티가 유효하지 않은 요청을 간주하고 요청을 차단한 것이다.
만약 CSRF 토큰을 사용하지 않는다면 악의적은 웹 사이트를 만들어 사용자 동의 없이 다른 웹사이트에 로그인 된 유저의 동의 없이 요청을 생성하고 모든 쿠키 및 인증 정보를 전송할 수 있다.
그런데 폼의 액션 앞에 th를 붙여
<form th:action="@{/post/create}">
<input type="text">
</form>
처럼 사용했을 때 403에러가 뜨던 문제가 해결 되었는데 그 이유는 스프링 시큐리티에서 타임리프와 함께 사용할 때 자동으로 CSRF 토큰을 생성하여 폼에 포함시키기 때문이다. 그래서 개발자가 따로 CSRF 토큰을 생성해 폼에 추가할 필요가 없었다.
타임리프의 'th:action' 속성은 그저 폼의 액션을 동적으로 설정하는데 사용되고 스프링 시큐리티가 이를 감지하여 CSRF 토큰을 적절하게 처리한다.