보통의 게시판은 게시글을 등록하고 수정할 때 작성 폼이 동일하다.
이를 가능하게 하기 위해 기존 등록 템플릿에서 th:action 속성을 삭제해야한다.
이 속성을 삭제하면 CSRF 값이 자동으로 생성되지 않기 때문에 CSRF 값을 설정하기 위한 hidden 형태의 input 엘리먼트를 수동으로 추가해야한다.
💡 CSRF(Cross-SiteRequest Forgery)?
악의적인 웹사이트에서 사용자의 권한을 도용하여 특정 동작을 수행하도록 하는 공격
❓ CSRF 공격을 방지하기 위한 방법
CSRF 토큰을 사용하는 것이다.
CSRF 토큰은 서버가 웹 페이지를 생성할 때 생성되어, 사용자의 세션에 저장되고 웹페이지의 폼에도 삽입된다. 이 토큰은 사용자의 세션과 관련이 있어 사용자가 약의적인 웹사이트로부터의 공격을 방지하는 역할을 한다.
<form th:object="${questionForm}" method="post">
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" />
(... 생략 ...)
</form>
폼 태그의 action 속성 없이 폼을 submit하면 action은 현재 URL을 기준으로 전송된다.
즉, 질문 등록시 브라우저에 표시되는 URL은 /question/creat일 것이기 때문에 /question/create로 POST 요청이 갈것이고, 수정시에는 브라우저에 표시되는 URL이 /question/modify/{id} 형태일 것이기 때문에 그 형태로 POST 요쳥이 전송될것이다.