티스토리 뷰
안녕하세요. 프로젝트에 스프링 시큐리티를 적용하며 겪었던 문제 상황을 공유합니다.
등록하지 않은 필터가 동작하는 현상
스프링 시큐리티의 FilterChain Bean 을 조작하여 커스텀 필터를 추가할 수 있습니다. 로그인 필터를 구현한 후, API를 테스트할 때마다 로그인하는 것이 귀찮았습니다. 잠시 로그인 필터를 빼놓으려고 주석처리를 했음에도 여전히 필터가 동작하는 이상한 현상이 일어났습니다.
public class TestFilter extends AbstractAuthenticationProcessingFilter {
public TestFilter(String defaultUrl) {
super(defaultUrl);
}
}
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http, AuthenticationManager manager){
// 필터 등록을 주석처리!
// http.addFilterBefore(testFilter(manager), UsernamePasswordAuthenticationFilter.class);
}
@Bean
public TestFilter testFilter(AuthenticationManager authenticationManager) {
TestFilter filter = new TestFilter("/login");
return filter;
}
}
TestFilter
클래스는 스프링 시큐리티의 FilterChain에 추가할 필터입니다. SecurityConfig
클래스는 스프링 시큐리티를 설정하기 위한 클래스입니다. 필터 등록을 주석 처리한 것을 확인 할 수 있습니다. 따라서 필터가 동작하지 않는 결과를 기대할 수 있습니다. 하지만 실행시켜보면 필터는 동작합니다.
원인
testFilter
를 빈으로 등록했기 때문입니다. 스프링 공식문서에 따르면 필터 클래스를 스프링 빈으로 등록시키면 필터로 동작한다고 되어있습니다.
디버깅으로 내부를 들여다봤을 때, 스프링 시큐리티의 FilterChain
에는 등록되지 않았지만, ApplicationFilterChain
의 필터로 TestFilter
가 등록된 것을 확인할 수 있었습니다. 오직 스프링 시큐리티의 필터만으로 동작하길 원한다면 필터를 빈으로 등록하면 안된다는 결론을 얻었습니다.
참고로 DelegatingFilterProxyRegistrationBean
은 스프링 시큐리티의 FilterChain
이 동작할 수 있도록 해주는 필터인데 TestFilter
이전에 등록되어 있는 것을 확인할 수 있습니다. TestFilter
의 순서를 @Order(0)
애노테이션으로 조작해봤지만 TestFilter
의 순서는 그림과 같은 결과였습니다. DelegatingFilterProxyRegistrationBean
까지의 순서는 고정이고, 그 이후의 순서는 @Order
애노테이션에 의해 결정되는 사실을 알 수 있었습니다.
결론
스프링 시큐리티의 필터체인에 적용할 필터는 Bean 으로 등록하지 말자.
'좌충우돌 프로젝트 이야기' 카테고리의 다른 글
롤문철 닷컴 구현기 2탄: 로그인 기능 구현 (JWT vs Session) (0) | 2023.07.02 |
---|---|
CI/CD 파이프라인 구축(2) [Spring Boot, Jenkins, Naver Cloud] - 테스트 커버리지를 강제하는 CI 파이프라인 구축 (1) | 2023.06.17 |
CI/CD 파이프라인 구축(1) [Spring Boot, Jenkins, Naver Cloud] - CI/CD의 개념 (0) | 2023.06.17 |
운영 환경과 개발 환경의 application.yml 을 분리하자 (feat. Jasypt) (0) | 2023.05.18 |
함수형 프로그래밍을 재고 처리 로직에 적용해보기 (0) | 2023.05.02 |
- Total
- Today
- Yesterday
- 디지털 청년 고민 해결단 온라인 멘토링
- java 로그인
- Jenkins
- T 인터뷰
- Spring Application 서버 실행
- CD 파이프라인 구축
- Docker 자동화 배포
- HTTP 완벽 가이드
- application.yml 분리
- NHN 엔터프라이즈
- 동시성 이슈
- application.properties 분리
- 회고
- F-LAB
- 개발자 면접
- NHN 면접
- NHN 엔터프라이즈 면접
- C 인터뷰
- 낙관적락
- GitHub Webhook
- 배열리스트
- 분산락
- 랠릿
- 디지털 청년 고민 해결단
- CI/CD 파이프라인
- 더미데이터 생성
- 데이터베이스 동시성
- 비관적락
- JWT 토큰
- CI/CD
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |