Spring Security 필터의 실행 순서는 요청이 처리되는 중요한 부분으로, 기본적으로 다음과 같은 순서로 실행됩니다. 각 필터는 특정 보안 작업을 수행하며, 요청이 체인을 통과하면서 적절한 작업을 처리합니다.
비동기 요청을 처리하기 위한 필터.
비동기 처리를 위한 SecurityContext를 관리합니다.
요청 시작 시 SecurityContext를 복원하고, 요청 완료 후 이를 저장합니다.
세션이나 다른 저장소를 사용하여 인증 정보를 유지합니다.
HTTP 응답 헤더를 추가하거나 수정합니다.
보안 헤더(CSP, XSS, CORS 등)를 처리합니다.
CSRF(Cross-Site Request Forgery) 공격을 방지하기 위한 필터.
요청의 CSRF 토큰을 검증합니다.
로그아웃 요청을 처리합니다.
세션 무효화, 인증 정보 제거 등 로그아웃 작업을 수행합니다.
OAuth 2.0 인증 요청 리다이렉트를 처리합니다.
사용자가 인증 서버로 이동하도록 리다이렉트합니다.
OpenID Connect(OIDC) 인증 요청 리다이렉트를 처리합니다.
SAML 인증을 처리할 때 사용됩니다.
폼 기반 로그인 인증을 처리합니다.
사용자 이름과 비밀번호를 검증하고, 성공 시 Authentication 객체를 설정합니다.
동시에 로그인 가능한 세션 수를 제한합니다.
최대 세션 수를 초과한 사용자를 로그아웃 처리합니다.
JWT 및 Bearer Token 인증을 처리합니다.
HTTP Basic 인증을 처리합니다.
인증 후 요청 캐시를 복원합니다.
인증되지 않은 요청이 캐시된 후 인증이 성공하면 이전 요청을 복원하여 처리합니다.
요청 객체에 보안 정보를 추가합니다.
SecurityContext에서 인증 정보를 가져와 요청에 바인딩합니다.
인증되지 않은 사용자를 "익명 사용자"로 설정합니다.
AnonymousAuthenticationToken을 생성합니다.
세션 관리와 관련된 보안 작업을 처리합니다.
세션 고정 공격 방지 등을 처리합니다.
인증 및 권한 부여 중 발생한 예외를 처리합니다.
예외가 발생하면 적절한 오류 응답을 반환하거나 로그인 페이지로 리디렉션합니다.
권한 부여를 처리하는 마지막 필터.
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
애플리케이션 실행 시, 콘솔에 필터 체인의 순서와 구성을 출력합니다.
상황에 따라 Bearer 인증이 기본적으로 Basic 인증보다 앞서야 하는 경우도 있습니다. 예를 들어, API 기반 애플리케이션에서 Bearer Token 인증(JWT 등)이 주요 인증 방식이라면, 이를 더 높은 우선순위로 설정해야 할 수 있습니다. 기본 설정을 확인하고 필요하면 우선순위를 조정할 수 있습니다.