[Spring Security] 4. SecurityFilterChain 내부 구조

조성우·2024년 7월 31일

Spring Security

목록 보기
7/16
post-thumbnail

SecurityFilterChain은 스프링 시큐리티의 보안, 인증/인가와 같은 주요 로직을 담당한다.

하나의 SecurityFilterChain 내부에 N개의 필터를 구성하여 각각의 필터가 하나의 로직 (로그인, 로그아웃, 인가 등) 수행의 시작점이 된다.


SecurityFilterChain에 등록된 필터 확인


  • @EnableWebecurity debug 모드 설정

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

애플리케이션을 실행 후, 웹 브라우저에서 아무 경로로 요청을 보내면 터미널을 통과하는 SecurityFilterChain의 필터 목록이 출력된다.



스프링 시큐리티가 제공하는 필터 개요


  • DisableEncodeUrlFilter
    : URL로 간주되지 않는 부분을 포함하지 않도록 설정 (URL 파라미터에 세션 ID가 인코딩되어 유출되는 것을 방지)
  • WebAsyncManagerIntegrationFilter
    : 비동기로 처리되는 작업에 대해 알맞은 시큐리티 컨텍스트(세션)을 적용
  • SecurityContextHolderFilter
    : 접근한 유저에 대해 시큐리티 컨텍스트 관리
  • HeaderWriterFilter
    : 사용자 브라우저의 보안을 위한 응답 헤더 추가 (X-Frame-Options, X-XSS-Protection and X-Content-Type-Options)
  • CorsFilter
    : CORS 설정 필터 (CorsConfigurationSource에 설정한 값에 따라 필터단에서 응답 헤더를 설정)
  • CsrfFilter
    : CSRF 방어 필터
  • LogoutFilter
    : 로그아웃 요청 처리 시작점 GET : “/logout”
  • UsernamePasswordAuthenticationFilter
    : username/password 기반 로그인 처리 시작점 POST : “/login”
  • DefaultLoginPageGeneratingFilter
    : 기본 로그인 페이지 생성 GET : “/login”
  • DefaultLogoutPageGeneratingFilter
    : 기본 로그아웃 페이지 생성 GET : “/logout”
  • BasicAuthenticationFilter
    : http basic 기반 로그인 처리 시작점
  • RequestCacheAwareFilter
    : 이전 요청 정보가 존재하면 처리 후 현재 요청 판단
  • SecurityContextHolderAwareRequestFilter
    : ServletRequest에 서블릿 API 보안을 구현
  • AnonymousAuthenticationFilter
    : 최초 접속으로 인증 정보가 없고, 인증을 하지 않았을 경우 세션에 익명 사용자 설정
  • ExceptionTranslationFilter
    : 인증 및 접근 예외에 대한 처리
  • AuthorizationFilter
    : 경로 및 권한별 인가 (구. filterSecurityIntercepter)


SecurityFilterChain 필터 활성화 및 비활성화


  • CORS 필터 설정
http
        .cors((cors) -> cors.disable());
  • CSRF 필터 설정
http
        .csrf((csrf) -> csrf.disable());
  • UsernamePasswordAuthenticationFilter 활성화/비활성화
// 활성화
http
        .formLogin(withDefaults());

// 비활성화
http
        .formLogin((login) -> login.disable());
  • 로그인/로그아웃 페이지 필터 활성/비활성
// formLogin 메소드 설정시 기본적으로 활성화

// 커스텀 시 기본 필터 비활성화
http
        .formLogin((login) -> login.loginPage("/login").permitAll());
  • BasicAuthenticationFilter 활성 비활성
// 활성화
http
        .httpBasic(Customizer.withDefaults());
        
// 비활성화
http
        .httpBasic((basic) -> basic.disable());
  • SecurityFilterChain에 커스텀 필터 등록
// 특정 필터 이전
http
        .addFilterBefore(추가할필터, 기존필터.class);

// 특정 필터 위치
http
        .addFilterAt(추가할필터, 기존필터.class);

// 특정 필터 이후
http
        .addFilterAfter(추가할필터, 기존필터.class);

0개의 댓글