You will be fine

<Spring Security> 4. Custom 필터 추가해보기

by BFine
반응형

가. Add Filter 

 a. 필터를 추가해보자

  -   커스텀한 보안 필터를 추가 하고 싶은 경우가 있을 수 있다. 간단하게 추가해보자 

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.addFilter(new TestFilter());
    }
}

public class TestFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, //생략) ServletException {
        System.out.println("## 테스트 필터");
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

  -  여기서 주의할점은 Filter를 구현해서 Bean으로 만들면 안되고 인스턴스(new) 형태로 추가 해야한다.

     => Bean으로 만들경우 자동으로 Servlet 필터로 추가됨, 

  -  저렇게만 하면 될것 같은 기분이 들지만 실행해보면 오류가 발생한다.
     =>  does not have a registered order and cannot be added without a specified order. 

  -  로그에 친절하게 설명해주는데 보면 알 수 있듯이 Security 필터는 순서에 의존하고 있다는 것을 알 수 있다.

  -  순서는 HttpSecurity가 필드로 가지고있고 dependency가 없는 클래스도 String으로 넣어주는 걸 볼 수 있다.

  -  이를 위해 HttpSecurityafter, before, at으로 order에 대한 부분을 지정할 수 있도록 해준다.

  -  TestFilter를 맨 처음으로 실행하도록 .addFilterBefore을 사용하고 http 요청을 해보았다.  

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
       http.addFilterBefore(new TestFilter(), ChannelProcessingFilter.class);
    }
}

public class TestFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, //생략) ServletException {
        System.out.println("## 테스트 필터");
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

  - 에러는 사라졌는데 TestFilter가 두번 실행 되었다.. 

 

나. Security Filter가 두번 실행되는 이유 알아보기 

 a. 왜 두번 실행될까?

  -  이유를 알아보기 위해 call stack을 따라가다 보면 StandardHostValve를 찾을 수 있다.

  -  TestFilter는 각각 BreakPoint에 실행되어 총 두번 실행되고 있었다.

  -  162번째 줄을 보면 유추할 수 있듯이 내부를 확인해보면 에러를 핸들링 하는 부분이다

      => 즉 에러가 발생하면 한번 더 securityFilterChainBean이 실행되어 TestFilter가 두번 실행된것!

  -  즉 Controller가 없기 때문에 404 오류가 발생했고 이 에러 핸들링 때문에 두번 실행되었다..

      => 이부분은 Security 뿐만이 아닌 Spring Boot의 처리 방식이었다.

  -  두번 실행시 문제가 되는 필터는 OncePerRequestFilter를 상속받아서 등록하면 된다.

반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기