[Spring Security] 2. FilterChainProxy

전유림·2024년 2월 14일
0

Spring Security

목록 보기
3/8

FilterChainProxy


Spring Security의 Servlet 지원은 FilterChainProxy 안에 포함되어 있다.

FilterChainProxy는 Spring Security에서 제공하는 특수 필터로서, 다양한 Security Filter 인스턴스를 관리하고 요청에 따라 적절한 SecurityFilterChain을 선택하여 실행한다.

FilterChainProxy는 Spring IoC Container에 등록된 Bean 중 하나로 일반적으로 DelegatingFilterProxy로 래핑된다.

SecurityFilterChain


FilterChainProxy는 여러 개의 SecurityFilterChain을 관리한다. 또한 각 SecurityFilterChain은 다양한 Security Filter들로 구성된다.

SecurityFilterChain에서 기본적으로 제공하는 Security Filter 외에도 사용자 정의 필터를 추가하여 기존 필터의 전/후에 추가적인 로직을 수행할 수 있다.

클라이언트의 요청이 들어오면 FilterChainProxy는 Request URL과 매핑되는 SecurityFilterChain을 선택한다. 이후 해당 SecurityFilterChain에 포함된 Security Filter들을 순차적으로 실행하여 보안 작업을 수행한다.

마지막 Security Filter까지 Authentication 및 Authorization 예외가 발생하지 않으면 해당 요청은 보안 검사를 통과했다는 의미이고 Dispatcher Servlet으로 전달된다.

SecurityFilterChain 만들기

@Configuration
public class SecurityConfiguration {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(authorize -> authorize
                .requestMatchers("/api/**").permitAll()
                .anyRequest().authenticated()
            );
        return http.build();
    }
}

SecurityConfiguration 클래스에서 filterChain 메서드를 통해 정의된 SecurityFilterChain은 하나의 Spring Security 보안 구성을 나타내며, Spring Application 실행 시 Spring IoC Container에 빈으로 등록된다.

해당 SecurityFilterChain은 /api/** 경로에 대한 요청을 처리하며, 해당 경로의 모든 요청은 인증이 필요하지 않다. 그 외의 모든 요청은 인증이 필요하다.

참고

원래는 WebSecurityConfigurerAdapter 클래스를 상속하고, configure 메서드를 @Override하여 구성을 설정하였으나, Spring Security 5.7.0-M2 부터 해당 클래스가 deprecated 되었으며, 아래 말고 위와 같이 컴포넌트 기반 설정을 사용하도록 변경해야 한다.

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/api/**").permitAll() 
                .anyRequest().authenticated()
        ;
    }
}

0개의 댓글