-
[Test] @WebMvcTest 에서 403 에러 해결하기개발 지식/Test 2023. 11. 23. 13:11
문제 상황
- 스프링 시큐리티를 적용하기 전에 정상작동하던 테스트 코드가 시큐리티 적용 후 @WebMvcTest 애너테이션을 사용한 컨트롤러 테스트에서 회원 가입 테스트의 응답 상태가 의도한 201이 뜨지 않고 403이 뜨면서 테스트가 깨졌다.
해결 과정
- 이 경우 403 에러가 발생하는 이유는 대부분 CSRF 토큰에 대한 문제라고 한다.
- CSRF(Cross-Site-Request Forgery)란 악의적인 코드를 심어놓은 사이트에서 로그인한 사용자가 클릭하게 하여 사용자의 의지와 무관한 요청을 발생시키는 공격을 의미한다.
- Spring Security에서는 이를 방지하기 위해 "CSRF Token"을 이용해 토큰을 비교한 뒤 일치하는 경우에만 메서드를 정상적으로 실행하게 만든다.
- RESTful한 웹 서비스에서는 대부분 비할성화로 설정하는데 그 이유는 REST API는 대부분 무상태성을 유지하며, JWT와 같은 토큰 방식으로 인증하기 때문에 요청이 세션에 의존하지 않기 때문이다.
- 결국 원인은 요청에 CSRF 토큰이 담겨있지 않아 세션에 저장된 CSRF 값과 비교할 수 없어 403 에러가 발생한 것이다. (근데 아래의 그림에는 요청에 세션 부분에 csrf 토큰이 담겨 있는 것처럼 보이는데 이건 나중에 꼭 알아보기!)
- 아래와 같이 .with(SecurityMockMvcRequestPostProcessors.csrf()를 추가해주면 된다.
- 추가했더니 302가 떴다.
- Redirected URL이 login으로 된 것으로 보아 인증 관련 문제이며 실제로 API 요청에서 인증 정보가 없어 인증을 먼저 진행하라고 리다이렉트되어 302가 발생한 것이었다.
- 이 부분은 @WithMockUser 애너테이션을 추가해주면 해결할 수 있다.
결론
결국 @WebMvcTest 애너테이션을 사용하여 테스트를 진행하는 경우 내가 직접 만든 SecurityConfiguration 즉, 시큐리티 설정 파일이 빈으로 등록이 되지 않고 스프링이 자동 구성한 시큐리티 설정 파일이 등록되기 때문에 위와 같은 상황들이 발생하는 것이다!!
참고 자료
https://sedangdang.tistory.com/303
@WebMvcTest 에서 Spring Security 적용, 401/403 에러 해결하기 - csrf
요약 401 Unauthorized -> @WithMockUser, @WithMockUserDetails 사용 403 Forbidden -> with(csrf()) 추가 @WebMvcTest Annotation that can be used for a Spring MVC test that focuses only on Spring MVC components. Using this annotation will disable full aut
sedangdang.tistory.com
https://wonkang.tistory.com/159
[TroubleShooting] SpringBoot Controller Test - MockMvc 302 Found, 403 Forbidden
개발 환경 Build : Gradle SpringBoot : 2.7.5 Java : 11 OS : Mac 발생 - 403 Forbidden RestDocs를 사용하여 API 문서화 작업을 하려고 Controller에서 테스트 코드를 작성 후 테스트를 진행하였고, 403 Forbidden 에러가 발
wonkang.tistory.com
'개발 지식 > Test' 카테고리의 다른 글
[Test] Interceptor 적용 후 기존 컨트롤러 테스트 깨짐 (0) 2024.01.10 [Test] 스프링 부트에서 TestEntityManager를 이용하여 JPA 테스트 하는 방법 (0) 2023.11.28 [Test] 테스트 코드 디버깅 하기 (2) 2023.11.23