[spring security] Request method 'POST' not supported 오류

 

 

spring security 적용하고 나서 회원가입이나 로그인등 post 방식으로 controller에게 넘겨줘야 할때가 있다.

하지만 위와 같이 오류가 뜬다 그 이유는 spring security가  csrf 토큰을 원하기때문이라고는 하는데...

자세한 이유는 저도 잘 모릅니다. 아래에서 훝어보시길ㅎ

 

https://cheese10yun.github.io/spring-csrf/

 

Spring Security CSRF 설정 - Yun Blog | 기술 블로그

Spring Security CSRF 설정 - Yun Blog | 기술 블로그

cheese10yun.github.io

본론으로 돌아와서 

 

내가 찾은 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로 토큰값을 보내주어도 된다.