본문 바로가기
Springboot Study/Springboot Security

Filter (FilterChain)

by xogns93 2024. 10. 31.

스프링 시큐리티(Spring Security)는 다양한 필터로 구성된 필터 체인을 통해 보안 기능을 구현합니다. 각 필터는 인증(Authentication), 권한 부여(Authorization), 세션 관리 등 특정한 보안 기능을 수행합니다. Spring Security의 필터는 특정 순서에 따라 동작하며, 이로 인해 전체 보안 프로세스가 체계적으로 처리됩니다. 주요 필터와 그 역할을 정리하면 다음과 같습니다:

1. SecurityContextPersistenceFilter

  • 역할: 요청이 들어오면 SecurityContext를 조회하고, 인증 정보를 유지합니다. 요청이 끝나면 SecurityContext를 세션에 저장하여 이후 요청에서도 인증 정보를 사용할 수 있게 합니다.
  • 위치: 보안 체인의 가장 앞 부분에 위치하여, 모든 요청이 들어오고 나갈 때 인증 정보를 관리합니다.
  • 특징: 세션을 사용하여 사용자 인증 상태를 유지하고 관리합니다.

2. UsernamePasswordAuthenticationFilter

  • 역할: 폼 로그인을 처리하는 필터로, 로그인 요청을 처리하고 사용자 이름과 비밀번호를 기반으로 인증을 수행합니다.
  • 위치: 인증 과정의 시작점에 위치하여 기본적으로 /login 경로로 들어오는 요청을 처리합니다.
  • 특징: 폼 기반의 로그인 외에도 다른 인증 방식을 사용할 때 비활성화할 수 있습니다.

3. BasicAuthenticationFilter

  • 역할: HTTP Basic 인증을 처리하는 필터로, HTTP 헤더에 포함된 Authorization 정보를 읽어 인증을 수행합니다.
  • 위치: 폼 인증 대신 기본 인증(Basic Authentication)을 사용할 때 사용됩니다.
  • 특징: API 보안에서 많이 사용되며, 간단한 기본 인증 방식을 통해 사용자 인증을 처리합니다.

4. BearerTokenAuthenticationFilter

  • 역할: JWT와 같은 토큰 기반 인증을 처리하는 필터로, Authorization 헤더에 있는 Bearer 토큰을 읽어 인증을 수행합니다.
  • 위치: OAuth 2.0 또는 JWT 인증 흐름을 사용할 때 주로 활용됩니다.
  • 특징: 토큰을 통해 세션을 사용하지 않는 무상태 인증(stateless authentication)을 구현할 수 있습니다.

5. AnonymousAuthenticationFilter

  • 역할: 인증되지 않은 사용자에게 익명 사용자 권한을 부여하여 리소스에 접근할 수 있게 합니다.
  • 위치: 인증이 완료된 후에 실행되며, 인증되지 않은 사용자가 접근할 때 익명 권한을 설정합니다.
  • 특징: 인증되지 않은 사용자도 특정 리소스에 접근할 수 있게 설정할 때 유용합니다.

6. ExceptionTranslationFilter

  • 역할: 인증 및 인가 과정에서 발생하는 예외를 처리하고, 필요한 경우 로그인 페이지로 리다이렉트하거나 오류 메시지를 반환합니다.
  • 위치: 필터 체인의 중간에 위치하여, 보안 예외 발생 시 이를 처리합니다.
  • 특징: 접근 제한이나 인증 실패 시 발생하는 예외를 표준화하여 처리합니다.

7. FilterSecurityInterceptor

  • 역할: 인가(Authorization) 처리를 담당하는 필터로, 사용자가 접근하려는 URL이나 리소스에 대해 필요한 권한이 있는지 확인합니다.
  • 위치: 필터 체인의 마지막 단계에서 동작하며, 최종적으로 접근 권한을 확인하고 허용 또는 차단합니다.
  • 특징: 접근이 허가되지 않은 경우 예외를 발생시켜 접근을 차단합니다.

8. CsrfFilter

  • 역할: CSRF(Cross-Site Request Forgery) 공격을 방지하기 위한 필터로, CSRF 토큰이 없는 요청을 차단합니다.
  • 위치: 체인에서 인증 필터 이후에 위치하여, 요청마다 CSRF 토큰이 유효한지 확인합니다.
  • 특징: 기본적으로 활성화되어 있으며, 요청마다 CSRF 토큰을 확인하여 보안성을 강화합니다.

9. ConcurrentSessionFilter

  • 역할: 한 사용자가 여러 세션을 유지하지 않도록 제한하고, 중복 로그인 방지를 위해 세션 수를 관리합니다.
  • 위치: 인증이 완료된 후에 위치하며, 세션의 유효성을 검사합니다.
  • 특징: 동시 세션 수 제한을 통해 보안을 강화할 수 있습니다.

10. LogoutFilter

  • 역할: 사용자가 로그아웃을 요청할 때 이를 처리하는 필터로, 세션에서 사용자의 인증 정보를 제거합니다.
  • 위치: 필터 체인의 마지막에 위치하여 로그아웃 요청을 처리하고 보안 컨텍스트를 정리합니다.
  • 특징: 로그아웃 후 세션을 만료시키고 사용자가 더 이상 인증되지 않도록 합니다.

필터 체인 흐름

Spring Security는 이들 필터를 체인 형태로 연결하여 순서대로 처리합니다. 각 필터는 특정 조건에서만 동작하며, 인증이 완료되면 체인을 거치지 않고 직접 리소스에 접근할 수 있습니다. 요청이 들어오면 필터 체인을 통과하면서 보안 검사를 수행하고, 필터 체인을 통과한 후에는 인증된 사용자만이 보호된 리소스에 접근할 수 있습니다.

 


 

필터 체인의 구조와 동작 원리

 

  1. 입력된 요청이 필터 체인을 통과
    • 클라이언트로부터 요청이 들어오면, 요청은 Spring Security의 필터 체인을 통해 검사를 시작합니다.
    • 필터 체인은 여러 보안 필터들로 구성되어 있으며, 각 필터는 특정 보안 작업을 수행합니다.
  2. 필터의 순차적 실행
    • 필터 체인 내 필터는 정의된 순서대로 실행됩니다.
    • 예를 들어, SecurityContextPersistenceFilter는 요청의 첫 번째 단계에서 실행되어 기존 SecurityContext(보안 컨텍스트)를 조회하고, UsernamePasswordAuthenticationFilter는 사용자 로그인 시 자격 증명을 검증하는 등 각 필터는 자신의 역할에 맞는 검사를 수행합니다.
  3. 필터 역할과 제어 흐름
    • 필터는 통과 여부를 결정하며, 통과할 경우 다음 필터로 제어가 넘어가고, 그렇지 않을 경우 체인은 종료됩니다.
    • 필터가 인증이나 인가에 실패하면 바로 ExceptionTranslationFilter가 예외를 처리하여 로그인 페이지로 리다이렉트하거나 403 오류 메시지를 반환합니다.
  4. 인증 필터 (Authentication Filter)
    • 필터 체인에서 UsernamePasswordAuthenticationFilter, BasicAuthenticationFilter, BearerTokenAuthenticationFilter 같은 필터들이 주로 인증 작업을 처리합니다.
    • 예를 들어 UsernamePasswordAuthenticationFilter는 사용자 로그인 정보를 기반으로 인증을 수행하며, 인증 성공 시 보안 컨텍스트에 사용자 정보를 저장하여 다른 필터에서도 참조할 수 있도록 합니다.
  5. 인가 필터 (Authorization Filter)
    • FilterSecurityInterceptor와 같은 필터는 인증이 완료된 후 사용자의 권한을 확인하는 필터입니다.
    • 필터 체인의 마지막에 위치하여 사용자가 접근하려는 리소스에 필요한 권한이 있는지를 최종적으로 확인합니다.
  6. 예외 처리와 종료
    • 인증이나 인가가 실패하거나 필터에서 문제가 발생하면 ExceptionTranslationFilter가 예외를 처리합니다.
    • 모든 필터를 통과한 요청만이 애플리케이션의 실제 리소스에 접근할 수 있습니다.

 

필터 체인의 장점

  • 확장 가능성: 스프링 시큐리티의 필터 체인은 유연하게 필터를 추가하거나 순서를 조정할 수 있습니다. 사용자 정의 필터를 만들어 기존 필터 체인에 추가함으로써 특정 보안 요구 사항에 맞출 수 있습니다.
  • 단계적 보안 처리: 필터 체인은 인증, 인가, 예외 처리, 세션 관리 등 다양한 보안 작업을 단계적으로 수행하므로 보안 관리를 체계적으로 수행할 수 있습니다.

 

필터 체인에서 중요한 설정

  • 필터 추가와 위치 지정: addFilterBefore, addFilterAfter, addFilterAt 등의 메서드를 통해 필터 체인의 특정 위치에 필터를 추가할 수 있습니다. 예를 들어, 사용자 정의 필터를 BasicAuthenticationFilter전에 실행되도록 추가할 수 있습니다.
  • HTTP 보안 설정: http.authorizeRequests(), http.formLogin(), http.httpBasic() 등 다양한 설정을 통해 필터 체인의 구체적인 동작을 정의합니다.

 

필터 체인의 예시

다음은 인증과 인가가 처리되는 필터 체인 예시입니다:

  1. SecurityContextPersistenceFilter: 이전 세션의 인증 정보를 복원하여 요청에 사용
  2. UsernamePasswordAuthenticationFilter: 사용자 로그인 요청을 인증
  3. BasicAuthenticationFilter: 기본 인증 방식(Basic Auth) 사용
  4. AnonymousAuthenticationFilter: 인증되지 않은 요청에 대해 익명 사용자 권한 부여
  5. ExceptionTranslationFilter: 예외 발생 시 처리
  6. FilterSecurityInterceptor: 최종적으로 사용자의 리소스 접근 권한 확인

 

스프링 시큐리티는 이 필터 체인을 통해 웹 애플리케이션의 모든 요청을 보호하고 보안 정책을 관리합니다. 따라서, 필터 체인은 Spring Security의 중요한 보안 처리 매커니즘입니다.