unit-test-security-authorization은(는) 무엇을 하나요?
Spring Security 단위 테스트를 위한 패턴을 제공합니다. @PreAuthorize, @Secured, @RolesAllowed와 함께 역할 기반 접근 제어 및 권한 부여 정책을 검증합니다. 보안 설정 및 접근 제어 로직을 테스트할 때 사용하세요.
주요 사항
- JUnit 5 프레임워크를 사용하여 Spring Security 권한 부여 로직을 테스트합니다.
@WithMockUser애너테이션을 사용하여 인증된 사용자를 모킹(Mocking)합니다.@WithAnonymousUser애너테이션을 사용하여 익명 사용자를 모킹합니다.- Security Context를 재정의하거나 직접 조작할 수 있는 유연성을 제공합니다.
- 역할(Role)과 권한(Authority) 기반 테스트를 모두 지원합니다.
- 커스텀 Security Expression도 테스트할 수 있습니다.
사용 사례
- REST API 엔드포인트에 적용된 보안 규칙 검증
- 서비스 레이어의 메서드 수준 보안 테스트
- 역할 및 권한에 따른 접근 제어 정책 확인
- 익명 사용자와 인증된 사용자의 접근 차이 검증
- 커스텀 보안 표현식(예:
@PreAuthorize("hasRole('ADMIN') and #id == authentication.principal.id")) 테스트
예제 코드
@SpringBootTest
@AutoConfigureMockMvc
class SecurityAuthorizationTest {
@Autowired
private MockMvc mockMvc;
@Test
@WithMockUser(roles = "USER")
void testUserAccessToUserEndpoint() throws Exception {
mockMvc.perform(get("/api/user"))
.andExpect(status().isOk());
}
@Test
@WithMockUser(roles = "ADMIN")
void testAdminAccessToAdminEndpoint() throws Exception {
mockMvc.perform(get("/api/admin"))
.andExpect(status().isOk());
}
@Test
@WithAnonymousUser
void testAnonymousAccessToSecuredEndpoint() throws Exception {
mockMvc.perform(get("/api/secured"))
.andExpect(status().isUnauthorized());
}
}
자주 묻는 질문
-
Q: 이 기술은 어떤 Spring Boot 버전과 호환되나요?
-
A: 이 패턴은 Spring Boot 2.x 및 3.x와 호환됩니다. 사용하는 버전에 따라
spring-security-test의존성이 올바르게 설정되어 있는지 확인하세요. -
Q:
@WithMockUser와@WithUserDetails의 차이점은 무엇인가요? -
A:
@WithMockUser는 모의 사용자를 빠르게 생성하는 반면,@WithUserDetails는 실제UserDetailsService를 통해 사용자를 로드합니다. -
Q: 복잡한 보안 표현식을 어떻게 테스트하나요?
-
A: 커스텀 Security Expression Handler를 생성하고
@WithSecurityContext를 사용하여 테스트 컨텍스트를 설정할 수 있습니다.