두 필터 모두 웹 애플리케이션에서 요청과 응답을 가로채고 처리하는 데 사용되지만, 목적과 사용 방식에 따라 중요한 차이점이 있다.
1. Servlet Filter
Servlet 필터는 Java Servlet API의 일부이며, 웹 애플리케이션의 모든 요청과 응답을 전역적으로 처리하는 데 사용된다. Servlet 필터는 클라이언트가 서버에 요청을 보내고, 서버가 응답을 반환하기 전에 요청과 응답을 가로채어 처리할 수 있다.
특징:
- 요청 및 응답 수정: 요청이나 응답의 헤더를 수정하거나, 데이터를 추가 및 제거할 수 있다.
- 공통 로직 처리: 인증, 로깅, 인코딩 처리, 캐싱 같은 공통 작업을 수행한다.
- 체이닝 가능: 여러 필터가 체이닝될 수 있으며, 필터 간의 순서가 중요할 수 있다.
- 애플리케이션의 모든 요청에 적용: 특정 경로에만 필터를 적용할 수 있지만, 보통 모든 서블릿에 대해 동작한다.
사용 예시:
Servlet 필터는 web.xml 또는 애너테이션으로 설정된다. 예를 들어, 요청 로깅 필터를 작성할 수 있다.
@WebFilter("/api/*")
public class LoggingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("Request received");
chain.doFilter(request, response);
System.out.println("Response sent");
}
}
2. Spring Security 필터
Spring Security 필터는 Spring Security에서 제공하는 특화된 필터로, 웹 애플리케이션의 보안을 처리하는 데 중점을 둔다. 이는 Spring Security의 필터 체인을 통해 동작하며, 주로 인증 및 권한 부여(Authorization)를 처리한다. Spring Security의 필터는 기존 Servlet 필터와 동일한 개념을 사용하지만, Spring Security의 보안 메커니즘을 중심으로 작동하는 고도로 구성된 시스템이다.
특징:
- 보안 관련 작업: Spring Security 필터는 인증(Authentication), 권한(Authorization), 세션 관리, CSRF 보호, 로그인 및 로그아웃 처리 등을 담당한다.
- 필터 체인 기반: 여러 개의 보안 필터들이 필터 체인으로 구성되어 있으며, 각 필터는 보안과 관련된 특정 작업을 처리한다. Spring Security는 기본적으로 10개 이상의 필터를 포함하는 강력한 보안 필터 체인을 제공한다.
- 주문형 필터: Spring Security 필터는 특정 보안 목적에 따라 자동으로 또는 프로그래밍 방식으로 추가/삭제할 수 있다. 예를 들어, UsernamePasswordAuthenticationFilter는 로그인 처리를 담당하고, SecurityContextPersistenceFilter는 사용자의 보안 컨텍스트를 유지한다.
- 클래스 수준의 애너테이션과 설정: Spring Security 필터는 @EnableWebSecurity 애너테이션이나 Java 설정으로 관리된다.
사용 예시:
Spring Security에서 필터를 설정하는 가장 일반적인 방법은 WebSecurityConfigurerAdapter를 상속받는 클래스를 통해 보안 설정을 정의하는 것이다.
Spring Security의 설정을 더 유연하고 명시적으로 만들기 위해 Spring Security 5.7부터는 WebSecurityConfigurerAdapter가 더 이상 사용되지 않음
SercurityFilterChain과 @Bean 메서드를 사용하는 방식으로 대체되었다.
- 기존(더이상 사용X)
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user").password("{noop}password").roles("USER");
}
}
-변경 후
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authorize -> authorize
.anyRequest().authenticated()
)
.formLogin(withDefaults());
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
3. 차이점 요약
특징 | Servlet 필터 | Spring Security 필터 |
목적 | 요청/응답 처리, 로깅, 인코딩, 캐싱, 공통 작업 | 인증(Authentication), 권한(Authorization), 보안 설정 |
기반 | Java Servlet API | Spring Security |
적용 범위 | 모든 요청에 대해 전역적으로 동작 가능 | 보안과 관련된 요청 처리에 중점, 인증 및 권한 부여 필터 체인 |
설정 방법 | web.xml 또는 애너테이션 (@WebFilter) | Java 설정 (@EnableWebSecurity), 필터 체인 구성 |
체이닝 | 필터 간의 순서를 설정할 수 있으며 여러 필터 적용 가능 | Spring Security 필터 체인을 통해 순서가 정해짐 |
사용 용도 | 비즈니스 로직 전/후의 공통 처리 | 보안과 관련된 인증 및 권한 부여 |
4. Spring Security와 Servlet 필터의 관계
Spring Security는 Servlet 필터 기반으로 동작하는데, Spring Security 자체가 필터로 등록되어 전체 보안 로직을 제어한다. 즉, Spring Security 필터는 실제로 Servlet 필터이며, 요청을 가로채서 보안 관련 작업을 수행한다. 따라서 Spring Security 필터는 Servlet 필터의 확장이라고 볼 수 있다.
- Spring Security의 필터 체인은 일반 Servlet 필터와 함께 사용될 수 있으며, Spring Security 필터는 다른 필터들보다 우선적으로 보안과 관련된 처리를 수행한다.
- 예를 들어, Spring Security 필터 체인이 먼저 인증을 처리한 후, 그 다음에 다른 비보안 관련 필터들이 요청을 처리할 수 있다.
5. 결론
- Servlet 필터는 전반적인 요청과 응답의 가로채기 및 처리를 목적으로 사용되며, 주로 공통 로직, 로깅, 캐싱 등을 처리한다.
- Spring Security 필터는 보안에 중점을 둔 필터 체인으로, 인증 및 권한 부여를 담당한다. Spring Security는 여러 보안 필터를 체인 방식으로 관리하여 보안 로직을 자동화하고 체계적으로 구성한다.
두 필터는 모두 웹 애플리케이션에서 중요한 역할을 하지만, Spring Security 필터는 보안에 특화된 역할을 담당하며, Servlet 필터는 전반적인 요청 처리에 사용된다.