Spring Security를 포함한 프로젝트에서 Controller 테스트 중에 403, 401 같은 인증 에러발생
* Spring Security를 포함한 프로젝트에서 Controller 테스트 중에 403, 401 같은 인증 에러발생
* WebMvcTest를 사용하면, 내가 설정한 Spring Security Configuration들을 불러오지 않으므로 필터한 URL이 모두 무시되고 403, 401 에러 발생한다.
1. **첫 번째 방법**
`mockMvc`에 `.with(SecurityMockMvcRequestPostProcessors.csrf())` 추가
* 403 에러를 피할 수 있지만, 401 에러 발생. 인증을 하지 않았기 때문임.
2. **두 번째 방법**
클래스에 `@AutoConfigureMockMvc(addFilters = false)` 추가
* 테스트 작성이 가능해짐
* 그러나, SpringSecurity의 `Authentication.getName()` 호출 시 에러 발생
인증된 유저를 조회하면 null값 반환
* 따라서 메서드에서 SpringSecurity 인즉객체를 반환한다면 `@WithMockUser("userName")`를 추가해야 한다.
```java
@WebMvcTest(LoginController.class)
@AutoConfigureMockMvc(addFilters = false)
class UserControllerTest {
...
@Test
@WithMockUser("user1")
void sample() throws Exception {
...
}
...
}
```
* **CSRF(크로스 사이트 요청 위조)**
서버에서 뷰 생성 시 임의로 생성된 CSRF 토큰을 뷰에 심어 요청시 함께 전달하여 토큰의 유효성을 체크하여 공격을 방지하는 것.
* **@WithMockUser**
인증된 Mock 유저를 생성해주는 어노테이션
* **다른 관련 어노테이션**
* `@WithAnonymousUser`
미인증 사용자
* `@WithUserDetail`
principal 내부값을 직접 사용