728x90

MDN Web Docs : 403 Forbidden

HTTP 403 Forbidden 클라이언트 오류 상태 응답 코드는 서버에 요청이 전달되었지만, 권한 때문에 거절되었다고 한다.
어떤 권한인가 찾아보았다. SpringSecurity를 사용할 경우 기본적으로 CSRF토큰을 사용한다고 한다.

GET요청에서는 별도의 CSRF토큰 인증을 필요로 하지 않지만, POST요청 시에는 CSRF토큰을 필요로 한다.

우선, 스프링 시큐리티의 테스트 지원을 사용하기 위해서 의존성부터 추가하도록한다.

// Spring Security Test
testImplementation 'org.springframework.security:spring-security-test'

CSRF토큰을 사용하는 방법이다.

//request parameter로 csrf토큰 추가
mvc
	.perform(post("/").with(csrf()));

//header에 csrf추가
mvc
	.perform(post("/").with(csrf().asHeader()))

이렇게 CSRF토큰만 추가해 준다면 테스트 시 403 코드는 이제 안녕이라고 할 수 있다. 또한, POST 외 PUT과 DELETE도 동일하게 적용된다. 나의 경우에는 thymeleaf를 사용하고 있으나, javascript에 도움으로 PUT요청과 DELETE요청을 할 수 있도록 수정해 두어서 PutMapping, DeleteMapping을 만들어 두었었다.


해결방법은 간단한 오류였으나, 찾는데 꽤 많은 시간을 소비했다. 처음에는 403 에러가 왜 발생하는지 몰라 403이 뭔지 왜 Forbidden인지 찾아봐야 했다. 403의 의미를 찾은 후에는 어떤 문제인지 확인해야했다. 클라이언트 에러라고 하는데 왜 발생하는지 Springboot나 Security를 같이 검색하면서 찾아야 했다. CSRF가 문제라는 것을 의심하기 시작했을 때, with(csrf())를 코드에 추가하려고 해도 추가가 안되어 이건 또 왜 안되는지 찾아야했다. 테스트를 위한 Security 지원 의존성이 따로 있는 줄은 몰랐으니까. 그래도 이것저것 찾다보니 많은 것을 알게 되었다.

728x90

+ Recent posts