개발 일지/Spring

[Spring Security] WebMvcTest 에서 401/403 에러 해결하기

미숫가루설탕많이 2023. 5. 13. 21:11

  slice 테스트로 controller의 post 테스트 로직을 작성하고 실행했더니 401 Unauthorized 에러가 발생했다.

 

  test 로직에서도 post 요청을 할 때 권한을 같이 넘겨줘야 한다는 것 같은데, WebMvcTest가 컨트롤러 테스트할 때 스프링 시큐리티가 자동으로 구성하는 Configuration 파일들을 불러와서 그렇다고 한다.

 

  해당 문제는 다음과 같이 임의의 UserDetails를 만들어서 해결할 수 있다.

@WithMockUser
@Test
public void postCvTest() throws Exception {

}

 

또는 다음과 같이 excludeFilters를 활용해서 해당 Configurer를 회피하는 방법도 있다.

@WebMvcTest(value = CvController.class, excludeFilters = {
        @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = WebMvcConfigurer.class)
})
@MockBean(JpaMetamodelMappingContext.class)
@AutoConfigureRestDocs
public class CvControllerTest {

}

 

 

 

@WihMockUser을 적용해주고 나니 이번에는 403 에러가 발생했다..

403 error

 

 해당 에러는 Security 설정을 할 때 csrf().disable()을 적용하지 않았을 때 나던 에러였다. csrf 공격을 막기 위해 csrf 토큰 값을 비교해서 일치하는 경우에만 메서드를 처리하도록 하는 것이다.

 

 검색해보니 ResultActions를 정의할 때 .with(csrf())를 적용하면 파라미터로 csrf 토큰값을 같이 넘겨준다고 한다.

// when
ResultActions postActions =
        mockMvc.perform(
                post("/cv")
                .with(csrf())
                .accept(MediaType.APPLICATION_JSON)
                .contentType(MediaType.APPLICATION_JSON)
                .content(content)
        );

 

 

테스트 통과!