SpringBoot에서 Controller 인증 에러 트러블 슈팅 ( Error 403, 401 )

song yuheon·2023년 9월 24일
0

Trouble Shooting

목록 보기
15/57
post-thumbnail
post-custom-banner

SpringBoot에서 Controller 인증 에러 트러블 슈팅

Spring Security를 포함한 프로젝트에서 Controller 테스트 중에 403, 401 같은 인증 에러발생

1. 문제 상황

* Spring Security를 포함한 프로젝트에서 Controller 테스트 중에 403, 401 같은 인증 에러발생
* WebMvcTest를 사용하면, 내가 설정한 Spring Security Configuration들을 불러오지 않으므로 필터한 URL이 모두 무시되고 403, 401 에러 발생한다.

2. 해결 방안

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 {
        ...
        }
        ...
    }
    ```

3. Plus

* **CSRF(크로스 사이트 요청 위조)**
서버에서 뷰 생성 시 임의로 생성된 CSRF 토큰을 뷰에 심어 요청시 함께 전달하여 토큰의 유효성을 체크하여 공격을 방지하는 것.
* **@WithMockUser**
인증된 Mock 유저를 생성해주는 어노테이션
* **다른 관련 어노테이션**
    * `@WithAnonymousUser`
    	미인증 사용자
    * `@WithUserDetail`
    	principal 내부값을 직접 사용

profile
backend_Devloper
post-custom-banner

0개의 댓글