be_better

[Springboot] Spring Security 필터 동작 본문

Springboot/이론

[Springboot] Spring Security 필터 동작

NiceTry 2023. 12. 6. 23:25

목차

    보안 필터체인 종류 및 순서

    보안필터 체인에서 사용하는 필터에는 여러 종류가 있다.

     

    공식 문서에서 소개하는 필터의 실행 순서

    1. ChannelProcessingFilter
    2. WebAsyncManagerIntergrationFilter
    3. SecurityContextPersistenceFilter
    4. HeaderWriterFilter
    5. CorsFilter
    6. CsrfFilter
    7. LogoutFilter
    8. OAuth2AuthorizationRequestRedirectFilter
    9. Saml2WebSsoAuthenticationRequestFilter
    10. X509AuthenticationFilter
    11. AbstractPreAuthenticationedProcessingFilter
    12. CasAuthenticationFilter
    13. OAuth2LoginAuthenticationFilter
    14. Saml2WebSsoAuthenticationFilter
    15. Saml2WebSsoAuthenticationFilter
    16. UsernamePasswordAuthenticationFilter
    17. OpenIDAuthenticationFilter
    18. DefaultLoginPageGeneratingFilter
    19. DefaultLogoutPageGeneratingFilter
    20. ConcurrentSessionFilter
    21. DigestAuthenticationFilter
    22. BearerTokenAuthenticationFilter
    23. BasicAuthenticationFilter
    24. RequestCacheAwareFilter
    25. SecurityContextHolderAwareRequestFilter
    26. JaasApiIntegrationFilter
    27. RememberMeAuthenticationFilter
    28. AnonymousAuthenticationFilter
    29. SessionManagementFilter
    30. ExceptionTraslationFilter
    31. FilterSecurityInterceptor
    32. SwitchUserFilter

     

    보안 필터체인 설정

    보안 필터체인은 WebSecurityConfigurerAdapter 클래스를 상속받아 설정 가능

     

    필터체인 프록시는 WebSecurityConfigurerAdapter 클래스를 상속받는 클래스를 여러개 생성하면 여러개의 보안 필터체인을 가질 수 있다.

     

    WebSecurityConfigurerAdapter의 @Order 어노테이션으로 필터 순서를 정의할 수 있다.

     

    별다른 설정이 없다면 UsernamePasswordAuthenticationFilter를 통해 인증 처리

     

    UsernamePasswordAuthenticationFilter를 통한 인증 과정

     

    인증 수행 과정

    1. 클라이언트로부터 요청 -> 서블릿 필터에서 SecurityFilterChain 으로 작업 위임, 그중 UsernamePasswordAuthenticationFilter (위 그림에서 AuthenticationFilter에 해당) 에서 인증 처리
    2. AuthenticationFilter는 요청 객체 (HttpServletRequest) 에서 username 과 password 를 추출해서 토큰 생성 후 AuthenticationManager에게 토큰 전달.
    3. AuthenticationManager는 인터페이스, 일반적인 구현체는 ProviderManager
    4. ProviderManager는 인증을 위해 AuthenticationProvider로 토큰 전달
    5. AuthenticationProvider는 토큰의 정보를 UserDetailsService에 전달
    6. UserDetailsService는 전달받은 정보를 통해 데이터베이스에서 일치하는 사용자를 찾아 UserDetails 객체 생성
    7. 생성된 UserDetails 객체는 AuthenticationProvider로 전달, 해당 Provider에서 인증 수행 -> 성공하면 ProviderManager로 권한을 담은 토큰 전달
    8. ProviderManager는 검증된 토큰을 AuthenticationFilter로 전달
    9. AuthenticationFilter는 검증된 토큰을 SecurityContextHolder에 있는 SecurityContext에 저장

    UsernamePasswordAuthenticationFilter는 접근 권한을 확인.

    인증 실패인 경우 로그인 폼이라는 화면을 띄우는 역할 수행

     

    또는 JWT 토큰을 사용해 인증을 수행할 경우

    JWT 관련 필터 생성후 UsernamePasswordAuthenticationFilter 앞에 배치해 먼저 인증 수행하도록 설정

     

    JWT 생성, 설정

     

    [Springboot] 서비스의 인증과 권한 부여 - JWT

    JWT(JSON Web Token) JWT 특징 당사자 간의 정보를 JSON 형태로 안전하게 전송하기 위한 토큰. URL로 이용할 수 있는 문자열로만 구성되어 있으며, 디지털 서명이 적용되어 있어 신뢰 가능. 주로 서버와의

    jnjeaaaat.tistory.com