서버에 Spring Security를 설치 한 후, API를 요청했을 때 CSRF(Cross-Site Request Forgery) 가 발생하였습니다. 알아본 결과 Spring Security 설치를 하게 되면 CSRF 보호 기능이 활성화되어 서버에서 요청을 처리하기 전에 CSRF 토큰을 확인하므로, 해당 토큰이 포함되지 않아 발생한 이슈입니다.
CSRF란?
CSRF(Cross-Site Request Forgery)는 사용자가 의도하지 않은 요청을 보내게 하여 사용자의 권한을 악용하는 공격입니다. 이를 방지하기 위해 Spring Security에서는 CSRF 토큰을 사용합니다. CSRF 토큰은 서버가 클라이언트에게 발급하고, 클라이언트는 요청 시 이 토큰을 포함하여 보냅니다. 서버는 이 토큰을 검증하여 요청의 유효성을 확인합니다.
오류 내용
Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'
클라이언트에서 CSRF 토큰을 전송하는 것으로 해결하였습니다. 메타 태그에 토큰을 포함 시킬 수 있습니다.
<meta name="_csrf" content="${_csrf.token}">
<meta name="_csrf_header" content="${_csrf.headerName}">
숨겨진 폼 필드에 CSRF 토큰을 포함시켜서 전달 할 수 있습니다.
<%@ taglib prefix="sec" url="http://www.springframework.org/security/tags" %>
<form action="write" method="post" enctype="multipart/form-data">
<sec:csrfInput>
</form>
Spring Security에서 제공하는 <sec:csrfInput> 태그를 사용하여 CSRF 토큰을 폼에 포함시킬 수 있습니다. 이를 통해 CSRF 토큰이 요청과 함께 전송되어 오류를 방지할 수 있습니다