인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

싸누바님의 프로필 이미지
싸누바

작성한 질문수

스프링 시큐리티 완전 정복 [6.x 개정판]

사용자 정의 보안 설정하기

프로덕션 환경과 테스트 환경 Config를 다르게 가져가는 방법

작성

·

47

·

수정됨

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를 다르게 사용하는 방법에 대해 설명드리겠습니다.

  1. 프로덕션과 테스트 환경의 Config 구분을 위해서는, Spring Profile을 활용하여 환경에 따라 다른 설정을 로드하는 방법을 사용할 수 있습니다. 이미 @ActiveProfiles("test")를 사용하고 계시므로 적절하게 테스트 환경에서 TestSecurityConfig를 로드할 수 있도록 설정을 해야 합니다.

이를 위해 두 가지 방법을 고려해볼 수 있습니다:

  • Profile-specific Configurations: application.properties@Profile을 사용하여 환경에 맞는 빈이 로드되도록 설정합니다. 예를 들어, @Profile("prod")@Profile("test")를 사용해 SecurityConfig에 프로파일을 명시해줄 수 있습니다.

  • @Primary 어노테이션: 테스트 환경에서 사용하고자 하는 빈을 @Primary로 선언하여 해당 Bean이 우선적으로 사용되도록 합니다.

  1. Spring Boot에서는 환경에 따라 설정을 다르게 가져가는 것이 가능합니다. 실무에서도 테스트 환경과 프로덕션 환경을 구분하여 각 환경에 맞는 SecurityConfig를 다르게 적용하는 방식이 자주 사용됩니다. 특히 테스트 환경에서는 JWT 필터와 같은 무거운 인증 체계를 생략하여 단위 테스트에 집중할 수 있도록 합니다.

위 문제를 해결하기 위해서는 SecurityConfig@Profile("prod")를 추가하고, TestSecurityConfig@Profile("test")를 추가하여 각 환경에서 필요한 구성을 명확히 지정하는 것이 좋습니다. 이렇게 하면 @ActiveProfiles("test")를 통해 테스트 환경에서는 TestSecurityConfig만 로드되도록 할 수 있습니다.

도움이 되셨기를 바랍니다.

이미지 출처 및 정보를 확인하려면 여기를 참고하세요.

싸누바님의 프로필 이미지
싸누바

작성한 질문수

질문하기