<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으로 넣어주는 걸 볼 수 있다.
- 이를 위해 HttpSecurity는 after, 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를 상속받아서 등록하면 된다.
'공부 > Spring Security' 카테고리의 다른 글
<Spring Security> 6. Filter 추가 되는 과정 살펴보기 (0) | 2021.11.03 |
---|---|
<Spring Security> 5. FilterChainProxy에 들어가는 Filter들 분석하기 (0) | 2021.10.21 |
<Spring Security> 3. 인증&인가 처리 과정 (0) | 2021.09.05 |
<Spring Security> 2. 아키텍쳐 (0) | 2021.09.04 |
<Spring Security> 1. 기본 설정 (0) | 2021.09.01 |
블로그의 정보
57개월 BackEnd
BFine