🧑💻 트러블슈팅: Spring Security 도입 중 JwtFilter Bean 등록 오류 해결
문제 상황
Spring Security를 도입하고 JWT 인증 필터(JwtFilter)를 적용하는 과정에서
애플리케이션이 정상적으로 실행되지 않는 문제가 발생했다.
에러 로그
The bean 'jwtFilter' could not be registered. A bean with that name has already been defined.
원인 분석
문제의 핵심은 JwtFilter Bean이 중복 등록되거나, 반대로 등록되지 않는 상태였다.
프로젝트 구조를 확인하면서 다음과 같은 문제를 발견했다.
1. FilterConfig에서 JwtFilter를 등록하고 있음
@Bean
public FilterRegistrationBean<JwtFilter> jwtFilter() {
FilterRegistrationBean<JwtFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new JwtFilter(jwtUtil));
return registrationBean;
}
이 경우 스프링 컨테이너에 등록되는 타입은
JwtFilter가 아니라 FilterRegistrationBean<JwtFilter>이다.
2. SecurityConfig에서는 JwtFilter를 직접 주입받으려 함
private final JwtFilter jwtFilter;
하지만 실제로는 JwtFilter Bean이 존재하지 않기 때문에
Bean을 찾지 못하는 문제가 발생한다.
3. 중복 등록 문제까지 발생
이를 해결하기 위해 SecurityConfig에 다음과 같이 Bean을 추가했지만,
@Bean
public JwtFilter jwtFilter() {
return new JwtFilter(jwtUtil);
}
이미 FilterConfig에서 등록된 상태였기 때문에
이번에는 Bean 중복 등록 오류가 발생했다.
문제의 본질
이 문제는 Spring Security Filter와 Servlet Filter를 동시에 사용하면서 발생한 충돌이다.
- FilterRegistrationBean → Servlet Filter
- addFilterBefore() → Spring Security Filter
같은 필터를 서로 다른 방식으로 두 번 등록하려고 하면서 문제가 발생했다.
해결 방법
접근 방식
FilterConfig는 유지하면서,
SecurityConfig에서는 FilterRegistrationBean을 활용하여 필터를 가져오는 방식으로 해결했다.
수정 코드
@RequiredArgsConstructor
@Configuration
@EnableMethodSecurity
public class SecurityConfig {
private final FilterRegistrationBean<JwtFilter> jwtFilterRegistrationBean;
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
JwtFilter jwtFilter = jwtFilterRegistrationBean.getFilter();
http
.csrf(csrf -> csrf.disable())
.sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.formLogin(form -> form.disable())
.httpBasic(basic -> basic.disable())
.authorizeHttpRequests(auth -> auth
.requestMatchers("/auth/**").permitAll()
.requestMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
)
.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class);
return http.build();
}
}
결과
- JwtFilter Bean 주입 문제 해결
- 애플리케이션 정상 실행
- Spring Security + JWT 인증 정상 동작
추가 고려사항
현재 구조에서는 필터가 두 번 실행될 가능성이 존재한다.
그 이유는 다음과 같다.
- FilterRegistrationBean → Servlet Filter 등록
- addFilterBefore() → Security Filter 등록
같은 필터가 두 체인에 모두 포함되면서 중복 실행될 수 있다.
정리
Spring Security를 도입하면서 단순히 필터를 추가하는 것을 넘어,
Servlet Filter와 Security Filter Chain의 동작 방식 차이를 이해하는 것이 중요하다는 것을 알게 되었다.
특히 다음 요소들이 중요하다.
- Bean 등록 방식
- 필터 실행 흐름
- 필터 체인 구조
이 부분을 명확히 이해하지 않으면, 예상하지 못한 충돌이 발생할 수 있다.
'Spring 2기 과제' 카테고리의 다른 글
| 포인트 기반 커피 주문 결제 시스템 (도메인 설계) (0) | 2026.03.27 |
|---|---|
| [Spring 2기 과제] CH5 배고팡 프로젝트 + KPT 회고 (0) | 2026.03.25 |
| [Spring 2기 과제] CH4 결제 시스템 프로젝트 + KPT 회고 (0) | 2026.02.20 |
| [Spring 2기 과제] CH4 결제 시스템 프로젝트 + 트러블슈팅 (0) | 2026.02.20 |
| [Spring 2기 과제] CH4 클라우드_아키텍쳐 과제 + S3Template 빈 생성 트러블슈팅 (1) | 2026.02.03 |