작성
·
49
·
수정됨
0
안녕하세요 선생님,
현재 프로젝트에서 프로덕션에서 사용하는 SecurityConfig클래스와 테스트에서 사용하는 SecurityConfig를 다르게 가져가려 합니다.
이유는 프로덕션 환경에서는 jwt필터 같이 커스텀 필터들을 적용해야하고, 테스트 환경에서는 해당 필터들을 거치지 않도록 해서 테스트를 더 편하게 하기 위함입니다.
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean("prodSecurityFilterChain")
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {...}
...
http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
...
}
@TestConfiguration
@EnableWebSecurity
public class TestSecurityConfig {
@Bean("testSecurityFilterChain")
public SecurityFilterChain testSecurityFilterChain(HttpSecurity http) throws Exception {...}
//필터 없음
}
위 처럼 작성하였습니다.
컨트롤러 테스트 시
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles("test")
public class InterfaceTest {
@LocalServerPort
private int port;
@BeforeEach
void setUp() {
RestAssured.port = port;
}
}
위의 클래스를 상속받아서 테스트를 구현합니다.
제 의도는 테스트 시에는 @TestConfiguration이 주어진 SecurityConfig를 기반으로 설정이 될거고
TestSecurityConfig에는 jwt필터가 없으니, 테스트 코드에서는 필터를 거치지 않고 잘 수행이 될거다 였으나, 실제 Security 디버그를 보면
2024-12-11 10:17:32 [Test worker] DEBUG org.springframework.security.web.DefaultSecurityFilterChain - Will secure any request with filters: DisableEncodeUrlFilter, WebAsyncManagerIntegrationFilter, SecurityContextHolderFilter, HeaderWriterFilter, CorsFilter, LogoutFilter, BlackListCheckFilter, JwtAuthenticationFilter, RequestCacheAwareFilter, SecurityContextHolderAwareRequestFilter, AnonymousAuthenticationFilter, SessionManagementFilter, ExceptionTranslationFilter, AuthorizationFilter
로 JwtAuthenticationFilter가 있으며, 인증처리가 안되었다는 401에러를 뱉고있습니다.
질문 드립니다.
1. 프로덕션 환경과 테스트 환경 Config구분시 별도의 설정이 더 필요할까요? 자료들을 더 찾아보아도 다른 방법이 없어서 질문드립니다.
2. 혹시 Config를 구분하는것이 아예 불가능한것일까요??
아니라면, 실무에서도 위와 같은 구조가 자주 사용되는지 등 궁금합니다.
답변 1
1
안녕하세요, 인프런 AI 인턴입니다.
싸누바님,
프로덕션 환경과 테스트 환경에서 SecurityConfig를 다르게 사용하는 방법에 대해 설명드리겠습니다.
@ActiveProfiles("test")
를 사용하고 계시므로 적절하게 테스트 환경에서 TestSecurityConfig
를 로드할 수 있도록 설정을 해야 합니다.이를 위해 두 가지 방법을 고려해볼 수 있습니다:
Profile-specific Configurations: application.properties
나 @Profile
을 사용하여 환경에 맞는 빈이 로드되도록 설정합니다. 예를 들어, @Profile("prod")
와 @Profile("test")
를 사용해 SecurityConfig에 프로파일을 명시해줄 수 있습니다.
@Primary 어노테이션: 테스트 환경에서 사용하고자 하는 빈을 @Primary
로 선언하여 해당 Bean이 우선적으로 사용되도록 합니다.
위 문제를 해결하기 위해서는 SecurityConfig
에 @Profile("prod")
를 추가하고, TestSecurityConfig
에 @Profile("test")
를 추가하여 각 환경에서 필요한 구성을 명확히 지정하는 것이 좋습니다. 이렇게 하면 @ActiveProfiles("test")
를 통해 테스트 환경에서는 TestSecurityConfig
만 로드되도록 할 수 있습니다.
도움이 되셨기를 바랍니다.
이미지 출처 및 정보를 확인하려면 여기를 참고하세요.