본문 바로가기
Java | spring/Spring Security

필터 기반으로 동작하는 Spring Security & 필터 종류

by 워니 wony 2023. 10. 2.

스프링 시큐리티는 필터 기반으로 동작한다.

하여 스프링 시큐리티를 이해하기 위해서는 필터를 제대로 이해하는 것이 좋다!

 

 

필터(Filter) 란 무엇인가?

  • 필터는 요청과 응답을 걸려서 정제하는 역할
  • 클라이언트로부터 오는 request/response에 대해 최초,최종 단계에 존재
  • 사용되는 용도 : 로깅 용도, 인증, 권한 체크 등
    • ex) 들어온 요청이 DispatcherServlet에 전달되기 전에 헤더를 검사해 인증 토큰 여부, 변조 검사 등을 함
  • 여러개의 필터가 모여서 하나의 체인(chain)을 형성 할 수 있음

출처 : https://docs.spring.io/spring-security/reference/servlet/architecture.html

  • filterchain 사용 코드
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
	// do something before the rest of the application
    chain.doFilter(request, response); // invoke the rest of the application
    // do something after the rest of the application
}

 

 

Spring Security Filter란?

  • 스프링 시큐리티 필터는 다양한 필터들로 나누어져 있으며, 각각 인증, 인가 관련 작업 처리
  • 기본적으로 세팅된 필터 실행 순서가 있으나 필요시에는 사용자 커스텀 필터를 추가하거나, 특정 필터 삭제 가능 

출처 : https://docs.spring.io/spring-security/reference/servlet/architecture.html

 

  • 스프링 시큐리티의 경우 필터 체인은 다중으로 설정할 수 있음
  • URL 패턴별로 원하는 대로 권한을 체크하는 등 별도로 구성이 가능함

출처 : https://docs.spring.io/spring-security/reference/servlet/architecture.html

 

예시) 사용자 필터 추가한 SecurityCofing

package com.won.jwt.config;

import com.won.jwt.config.jwt.JwtAuthenticationFilter;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
import org.springframework.web.filter.CorsFilter;

import static com.won.jwt.code.AuthRole.*;

@Configuration
@EnableWebSecurity(debug = true)
@RequiredArgsConstructor
public class SecurityConfig {

    private final CorsFilter corsFilter;
    
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.csrf().disable();
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .addFilter(corsFilter)
                .formLogin().disable()
                .httpBasic().disable()
                .addFilter(new JwtAuthenticationFilter())
                .authorizeHttpRequests()
                .antMatchers("/api/user/**").hasAnyRole(ADMIN.name(), MANAGER.name(), USER.name())
                .antMatchers("/api/admin/**").hasRole(ADMIN.name())
                .anyRequest().permitAll();

        return http.build();
    }

    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
        return authenticationConfiguration.getAuthenticationManager();
    }
}

위와 같이 시큐리티에 사용자 정의 필터를 추가해서 사용할 수도 있다. 참고할 수 있도록 JWT 설정을 위해 필터를 추가했던 config 코드는 위와 같다.  config 파일 내에서 필요한 부분에 대한 세팅을 하면 사용할 수 있다.

 

 

필요한 경우 아래와 같이 위 코드에 추가해서 필터의 순서를 지정 할 수도 있다.

addFilterBefore 메서드의 경우 특정 필터 전에 전달 한 필터를 추가해 달라는 것이다.

아래와 같이 추가를 하게 되면 스프링 시큐리티 로그에서 아래와 같이 원하는대로 순서가 조절된 것을 볼 수 있다.

...

@Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.addFilterBefore(new CustomFilter(), SecurityContextPersistenceFilter.class);
        http.csrf().disable();
        
....

 

위와 같이 추가하는 경우 스프링 시큐리티 필터 체인은 아래의 순서로 세팅 된다.

 

스프링 시큐리티 관련 로그를 보고 싶은 경우 SecurityConfig 클래스 파일에 (debug = true) 설정을 추가해 주면 된다.

@Configuration
@EnableWebSecurity(debug = true)
public class SecurityConfig {
	...
}

 

 

Spring Security filter 종류

기본 스프링 시큐리티 필터 체인에 등록된 필터들은 아래와 같다

 

  • DisableEncodeUrlFilter
    • 세션 ID가 유출될 수 있으므로 URL에 포함되는 것을 막기 위해 HttpServeletResponse를 사용해 URL 인코딩이 되는 것을 막는 필터
  • WebAsyncManagerIntegrationFilter
    • 비동기 처리 시에도 SecurityContext 접근할 수 있도록 해주는 필터
    • SecurityContext 통합관리
  • SecurityContextPersistenceFilter
    • 사용자 인증에 대한 정보를 담고 있는 SecurityContext 를 가져오거나 저장하는 역할의 필터
  • HeaderWriterFilter
    • 응답 Header에 spring security 관련 Header를 추가해 주는 필터
  • LogoutFilter
    • 설정된 로그아웃 URL로 오는 요청을 확인해 로그아웃 처리하는 필터
  • RequestCacheAwareFilter
    • 로그인 성공 후, 관련 캐시 요청을 확인하고 캐시 요청을 처리하는 필터
    • 예) 로그인 하지 않고 방문했던 페이지 기억 후 로그인 후 해당 페이지로 이동 처리
  • SecurityContextHolderAwareRequestFilter
    • HttpServletRequest 정보를 감싸서 필터 체인 상의 다음 필터들에게 부가 정보 제공하기 위해 사용하는 필터
  • AnonymousAuthenticationFilter
    • 필터 호출 시점까지 인증되지 않는 경우 익명 사용자 전용 객체(AnonymousAuthentication) 만들어서 SecurityContext에 넣어주는 필터
  • SessionManagementFilter
    • 인증된 사용자와 관련된 세션 작업을 진행
    • 유효하지 않은 세션에 대한 처리, 변조 방지 전략 등을 설정하는 작업을 처리하는 필터
  • ExceptionTranslationFilter
    • 요청을 처리하는 중에 발생할 수 있는 예외를 위임 또는 전달하는 필터
  • AuthorizationFilter
    • AuthorizationManager를 사용하여 URL을 통해 사용자의 리소스 접근에 대한 액세스를 제한하는 인증 필터
    • 권한 부여 필터
반응형

댓글