spring security 적용하고 나서 회원가입이나 로그인등 post 방식으로 controller에게 넘겨줘야 할때가 있다.
하지만 위와 같이 오류가 뜬다 그 이유는 spring security가 csrf 토큰을 원하기때문이라고는 하는데...
자세한 이유는 저도 잘 모릅니다. 아래에서 훝어보시길ㅎ
https://cheese10yun.github.io/spring-csrf/
본론으로 돌아와서
내가 찾은 2가지 방법이 있다 +(ajax 사용시)
1. jsp 파일에 추가 하기
<!--나는 JSP를 사용해서
<form>태그 안에 이 한 문장만 넣어주고 평소 코딩하듯이 해도 오류가 말끔히 사라진다.
타임리프나 다른 방법은 모르겠다.
-->
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
2. spring security를 적용하기 위해 다들 WebSecurityConfigurerAdapter를 상속받은 SecurityConfig.java와 같은 설정 파일이 하나씩 있을텐데 아래와 같이 csrf 토큰을 무시해줄 url을 추가 해주시면 됩니다.
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/member/signup").permitAll()
.antMatchers("/member/signin").permitAll()
.antMatchers("/").hasAnyAuthority("ADMIN","USER")
.antMatchers("/admin/**").hasAnyAuthority("ADMIN")
.antMatchers("/**").permitAll()
.anyRequest().authenticated()
.and()
//다른 부분은 무시해주시고 이 부분만 잘 사용 해주시면 됩니다.
.csrf()
.ignoringAntMatchers("/member/signup")
.ignoringAntMatchers("/member/signin")
//
.and()
.formLogin()
.loginPage("/member/signin")
.failureUrl("/member/signin?error") /*로그인 실패시 url*/
.defaultSuccessUrl("/", true) /*로그인 성공시 url*/
.and()
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.deleteCookies("JSESSIONID")
.invalidateHttpSession(true)
.logoutSuccessUrl("/home")
.and()
.exceptionHandling()
.accessDeniedPage("/access-denied");
}
3.ajax 사용시 2번째 형태로 csrf에 url을 추가 해줘도 되지만
$.ajax({
url : "/shop/view/modifyReply",
type : "post",
data : data,
beforeSend : function(xhr)
{ /*데이터를 전송하기 전에 헤더에 csrf값을 설정한다*/
xhr.setRequestHeader("${_csrf.headerName}", "${_csrf.token}");
},
success : function(result){
beforeSend로 토큰값을 보내주어도 된다.