본문 바로가기
개발/SpringBoot

(Java/Kotlin)[Spring Security] - Custom Filter를 제외하는 방법

by Mingvel 2023. 11. 28.

이젠 사용 안하고 싶어 !

 

 

이전 글에서는 Custom Filter를 사용하는 이유와, 등록하고 사용하는 방법에 대해서 알아보았습니다[이전글 보기]

 

(Java/Kotlin)[Spring Security] - Custom Filter를 등록하는 방법 (feat.OncePerRequestFilter)

Spring을 사용하는 환경에서 Custom Filter를 만들어 사용하는 일반적인 목적은 두 가지가 있습니다 (1) Client로부터 요청이 들어올 때, 요청이 Controller에 유입되기 전 사전처리 혹은 후처리를 하고 싶

far-ming.tistory.com

 

이번에는 이미 생성한 Custom Filter를 사용하지 않도록 즉, 제외하는 방법에 대해서 다뤄보겠습니다

 

두 가지 상황을 가정해 보겠습니다

 

1. 생성한 CustomFilter를 완전히 사용하지 않을 경우

2. 특정 상황 혹은 특정 환경(dev/prod) 에서 사용하고 싶지 않을 경우

 


 

먼저 Custom Filter를 완전히 사용하지 않고자 할 경우는 간단합니다.

 

해당 Filter에 @Component와 같은 어노테이션이 붙어있으면 해당 어노테이션을 제거하고

Spring Security FilterChain에 해당 Filter가 등록 되어 있다면 등록을 해제합니다.

// Component 어노테이션으로 Filter를 다루고 있는 경우
//@Component
class ApiKeyFilter(
    // some Service
    // some Repository
) : OncePerRequestFilter() {
    override fun doFilterInternal(
        request: HttpServletRequest,
        response: HttpServletResponse,
        filterChain: FilterChain
    ) {
        // Service Call
        // Repository Call
        logger.info("test log")
        filterChain.doFilter(request, response)
    }
}

 

위 코드와 같이 @Component 어노테이션을 제거하면,

 

Spring Context의 관리를 받던 Filter를 관리 대상에서 제외할 수 있습니다

 

// FilterChain에 등록되어 있는 경우
@Configuration
@EnableWebSecurity
class SecurityConfig {

    @Bean
    fun filterChain(
        http: HttpSecurity,
//        apiKeyFilter: ApiKeyFilter
    ): SecurityFilterChain {
//        http.addFilterBefore(apiKeyFilter, AuthorizationFilter::class.java)

        return http.build()
    }
}

 

위와 같이 FilterChain에서 Filter를 제외하면

 

FilterChain에 포함되어 관리 되던 Filter를 명시적으로 제거할 수 있습니다

 


 

다음은 특정 상황 혹은 특정 환경(dev/prod) 에서 사용하고 싶지 않을 경우 예시입니다

 

기본적으로 Filter는 FilterRegistrationBean 의 영향을 받습니다.

 

Spring Context에서 FilterRegistrationBean은 Filter를 탐색 해 서블릿 컨테이너(Servlet Container)에 등록하는 역할을 합니다

 

따라서 FilterRegistrationBean 를 제어함으로써 원하는 바를 이룰 수 있습니다

 

// FilterRegistrationBean 으로 제어하는 경우
@Profile("dev")
@Configuration
class NotUsingFilterConfig {

    @Bean
    fun apiKeyFilterRegistration(apiKeyFilter: ApiKeyFilter): FilterRegistrationBean<ApiKeyFilter> {
        val registrationBean = FilterRegistrationBean(apiKeyFilter)
        registrationBean.isEnabled = false
        return registrationBean
    }
}

 

위 코드와 같이 제외하고 싶은 Filter의 isEnabled 옵션을 false로 주고 해당 Filter에 대한 FilterRegistrationBean을 Bean으로 등록하면 Spring Context에 의한 제어로부터 Filter 사용을 제거할 수 있고

 

추가적으로 @Profile 어노테이션을 이용하면 특정 환경에 대해서만 제약을 가할 수 있습니다

 

 

반응형

댓글