에러 혼내주기/Spring

[Spring] Spring security + @WebMvcTest 403에러 발생

TutleKing 2022. 12. 11. 23:22

RestController를 테스트 하고자 @WebMvcTest 어노테이션을 사용하여 테스트를 진행하고자 하였다.

(@WebMvcTest는 @SpringBootTest 보다 ComponentScan 하는 범위가 좁아 더 가볍다고 한다)

 

그러나 로직에는 문제가 없어 보였는데 지속적으로 HTTP Status code 중 403(Forbidden) 오류가 지속적으로 떴다.

 

Spring Security 프로젝트를 의존성 추가를 하여 사용하고 있음을 깨닫고 csrf 필터를 확인해보았지만 disable() 해놓았기 때문에 
문제가 될 것이 없을 것이라 생각했다. 

SecurityConfig 파일 중 csrf 필터 관련 코드

 

그리하여 열심히 구글링 중 "뷰티플 프로그래밍" 이라는 블로그(아래 링크 참고)에서 해당 문제를 동일하게 겪고 난 후의 해결 방법을 공유해주셨다.

 

  1. mockMvc.perform() 구문에 with(csrf()) 추가하기 
    1. csrf()만 추가할 경우 401(Unauthorized) 에러가 발생한다. 고로 아래 2번까지 적용시켜줘야함.
  2. 테스트할 메서드의 @Test 어노테이션 밑에 @WithMockUser 추가하기
@Test
@WithMockUser //추가
void createMember() throws Exception {
    String username = "test";
    String email = "123@123.com";
    String pwd = "1234";
    int id = 1;
    MemberRegisterDto registerDto = new MemberRegisterDto(username, email, 1, "Y");

    String valueAsString = new ObjectMapper().writeValueAsString(registerDto);

    Project project = new Project("test Project", ProjectStatus.ACTIVE);
    project.setId(id);

    MemberInfo memberInfo = new MemberInfo(username, email, pwd);
    memberInfo.setId(id);

    Member member = new Member(project, memberInfo, Member.IS_ADMIN);

    when(projectService.getProject(id)).thenReturn(project);
    when(memberService.getMemberInfo(username)).thenReturn(memberInfo);
    when(memberService.insertMember(any())).thenReturn(member);

    mockMvc.perform(post("/members")
                    .with(csrf())   //추가
                    .contentType(MediaType.APPLICATION_JSON)
                    .content(valueAsString))
            .andDo(print())
            .andExpect(status().isCreated())
            .andExpect(header().string("Location", "/members/" + id));

}

 

원인에 대해서는 더 공부해보겠지만 추측으로는 @WebMvcTest는 Component scan 범위가 좁아서 securityConfig에 내가 따로 정의해놓은  security filter에 대한 셋팅이 적용되지않고 default로 적용된 듯하다. 

 

 

 

 

 

* 참고

https://krksap.tistory.com/2161 

반응형