//
Search
🌌

Spring Security 테스트

Spring Security 테스트

Spring Security의 테스트에서는 User가 로그인한 상태를 가정하고 테시트해야 하는 경우가 많습니다. 인증을 받지 않은 상태로 테스트를 하면 Spring Security에서 요청 자체를 막기 때문에 테스트가 제대로 동작조차 하지 못합니다.
이런 문제는 프로젝트에 spring-security-test를 사용해서 해결할 수 있습니다.
Spring-security-test를 사용하면 테스트 직전에 Mock User를 인증시켜놓고 테스트를 구동시킬 수 있습니다.
1.
SpringSecurityTest 의존성 추가
testImplementation 'org.springframework.securty:spring-security-test'
Groovy
복사
2.
Test 실행 전 MockMvc에 springSecurity를 설정합니다.

@WithMockUser

Mock(가짜) User를 생성하고 Authentication을 만듭니다.
여기서 User는 org.springframework.security.core.userdetailes.User를 말합니다.
멤버변수는 roles, authorities, username, password, setupBefore
내부에서 UserDetails를 직접 구현해서 Custom User를 만들어 사용하는 경우에는 WithMockUser를 사용하면 문제가 발생할 수 있습니다.
WithMockUser는 org.springframework.security.core.userdetails.User를 만들어 주지만 우리가 필요한 User는 Custom User이기 때문입니다. (class cast 에러가 발생할 수 있습니다.)

@WithUserDetails

WithMockUser와 마찬가지로 Mock(가짜) User를 생성하고 Authentication을 만듭니다.
WithMockUser와 다른점은 가짜 User를 가져올 때 UserDetailsService의 Bean 이름을 넣어줘서
userDetailsService.loadUserByUsername(String username)을 통해 User를 가져옵니다.
멤버변수 value, userDetailsServiceBeanName, setupBefore

@WithAnonymouseUser

WithMockUser와 동일하지만 인증된 유저 대신에 익명유저를 Authentication에서 사용합니다.
익명이기 때문에 멤버변수에 유저와 관련된 값이 없습니다.
멤버변수는 setupBefore

@WithSecurityContext

다른 방식들은 Authentication을 가짜로 만들었다고 한다면
WithSecurityContext는 아예 SecurityContext를 만듭니다.
멤버변수 factory, setupBefore

@with(user())

다른 방식은 어노테이션 기반인 반면에 이 방식은 직접 User를 MockMvc에 주입하는 방법입니다.
WithMockUser와 마찬가지로 유저를 생성해서 Principal에 넣고 Authentication을 생성해줍니다.
org.springframework.security.test.web.servlet.request.user를 사용합니다.