스프링 시큐리티 : 필터 적용 순서

이진욱·2024년 12월 12일

이론

목록 보기
10/24

Spring Security 필터의 실행 순서는 요청이 처리되는 중요한 부분으로, 기본적으로 다음과 같은 순서로 실행됩니다. 각 필터는 특정 보안 작업을 수행하며, 요청이 체인을 통과하면서 적절한 작업을 처리합니다.

Spring Security 기본 필터 순서

  • WebAsyncManagerIntegrationFilter

비동기 요청을 처리하기 위한 필터.
비동기 처리를 위한 SecurityContext를 관리합니다.

  • SecurityContextPersistenceFilter

요청 시작 시 SecurityContext를 복원하고, 요청 완료 후 이를 저장합니다.
세션이나 다른 저장소를 사용하여 인증 정보를 유지합니다.

  • HeaderWriterFilter

HTTP 응답 헤더를 추가하거나 수정합니다.
보안 헤더(CSP, XSS, CORS 등)를 처리합니다.

  • CsrfFilter

CSRF(Cross-Site Request Forgery) 공격을 방지하기 위한 필터.
요청의 CSRF 토큰을 검증합니다.

  • LogoutFilter

로그아웃 요청을 처리합니다.
세션 무효화, 인증 정보 제거 등 로그아웃 작업을 수행합니다.

  • OAuth2AuthorizationRequestRedirectFilter

OAuth 2.0 인증 요청 리다이렉트를 처리합니다.
사용자가 인증 서버로 이동하도록 리다이렉트합니다.

  • OidcAuthorizationRequestRedirectFilter

OpenID Connect(OIDC) 인증 요청 리다이렉트를 처리합니다.

  • SamAuthenticationFilter (Optional)

SAML 인증을 처리할 때 사용됩니다.

  • UsernamePasswordAuthenticationFilter

폼 기반 로그인 인증을 처리합니다.
사용자 이름과 비밀번호를 검증하고, 성공 시 Authentication 객체를 설정합니다.

  • ConcurrentSessionFilter

동시에 로그인 가능한 세션 수를 제한합니다.
최대 세션 수를 초과한 사용자를 로그아웃 처리합니다.

  • BearerTokenAuthenticationFilter

JWT 및 Bearer Token 인증을 처리합니다.

  • BasicAuthenticationFilter

HTTP Basic 인증을 처리합니다.

  • RequestCacheAwareFilter

인증 후 요청 캐시를 복원합니다.
인증되지 않은 요청이 캐시된 후 인증이 성공하면 이전 요청을 복원하여 처리합니다.

  • SecurityContextHolderAwareRequestFilter

요청 객체에 보안 정보를 추가합니다.
SecurityContext에서 인증 정보를 가져와 요청에 바인딩합니다.

  • AnonymousAuthenticationFilter

인증되지 않은 사용자를 "익명 사용자"로 설정합니다.
AnonymousAuthenticationToken을 생성합니다.

  • SessionManagementFilter

세션 관리와 관련된 보안 작업을 처리합니다.
세션 고정 공격 방지 등을 처리합니다.

  • ExceptionTranslationFilter

인증 및 권한 부여 중 발생한 예외를 처리합니다.
예외가 발생하면 적절한 오류 응답을 반환하거나 로그인 페이지로 리디렉션합니다.

  • FilterSecurityInterceptor

권한 부여를 처리하는 마지막 필터.
URL 기반으로 접근 권한을 확인하며, 접근이 허용되지 않으면 예외를 발생시킵니다.

필터 순서 조정

Spring Security는 HttpSecurity를 통해 필터의 순서를 조정할 수 있습니다. 예를 들어, 커스텀 필터를 특정 필터 앞이나 뒤에 추가하려면 다음과 같이 설정합니다:

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        .addFilterBefore(new CustomFilter(), UsernamePasswordAuthenticationFilter.class) // 특정 필터 앞에 추가
        .addFilterAfter(new AnotherCustomFilter(), SecurityContextPersistenceFilter.class) // 특정 필터 뒤에 추가
        .addFilterAt(new SpecialFilter(), BasicAuthenticationFilter.class); // 특정 위치에 추가
    return http.build();
}

필터 순서 확인 방법

Spring Security의 디버깅 설정으로 현재 필터 체인의 구성과 순서를 확인할 수 있습니다. Spring Boot를 사용할 경우, 다음과 같이 로깅 설정을 추가합니다

logging.level.org.springframework.security.web.FilterChainProxy=DEBUG

애플리케이션 실행 시, 콘솔에 필터 체인의 순서와 구성을 출력합니다.

중요 필터 순서 요약

  • 인증 관련 필터: UsernamePasswordAuthenticationFilter → BasicAuthenticationFilter → BearerTokenAuthenticationFilter.

    상황에 따라 Bearer 인증이 기본적으로 Basic 인증보다 앞서야 하는 경우도 있습니다. 예를 들어, API 기반 애플리케이션에서 Bearer Token 인증(JWT 등)이 주요 인증 방식이라면, 이를 더 높은 우선순위로 설정해야 할 수 있습니다. 기본 설정을 확인하고 필요하면 우선순위를 조정할 수 있습니다.

  • 권한 부여 및 예외 처리: ExceptionTranslationFilter → FilterSecurityInterceptor.
    필터 순서를 명확히 이해하고, 커스텀 필터를 적절히 추가하거나 조정하면 원하는 보안 정책을 효율적으로 구현할 수 있습니다.
profile
열심히 하는 신입 개발자

0개의 댓글