개발 일지/Spring

[Spring Security] 인증 처리 흐름

미숫가루설탕많이 2023. 3. 16. 16:44

 가장 일반적으로 사용되는 인증 방식인 ID/Password의 인증 처리 흐름은 다음과 같으며, 이러한 과정을 통해 Spring Security는 사용자 인증 및 권한 처리를 수행한다.

 

 Spring Security는 매우 유연한 보안 프레임워크이기 때문에 '아래의 인증 처리 흐름이 모든 상황에 적용되는 것이 아니며' 필요에 따라서 여러 방식을 조합해서 사용할 수 있다.

 

  1. 사용자가 로그인 페이지에 접근하여 ID와 Password를 포함한 request를 Spring Security가 적용된 애플리케이션에 전송한다.
  2. 사용자의 로그인 요청이 Spring Security의 Filter Chain까지 들어오면 UsernamePasswordAuthenticationFilter가 해당 요청을 전달받는다.

  3. UsernamePasswordAuthenticationFilter는 전달받은 ID와 Password를 이용해 UsernamePasswordAuthenticationToken(Authentication 인터페이스를 구현한 구현 클래스) 객체를 생성한다.

  4. 생성된 객체를 AuthenticationManager가 전달받아 인증 처리를 진행한다. 이때, AuthenticationManager는 내부적으로 설정된 ProviderManager 객체에게 인증 처리를 위임한다.

  5. ProviderManager는 등록된 AuthenticationProvider에게 Authentication을 전달하고 AuthenticationProvider는 UserDetailsService를 이용해 UserDetails를 조회한다.

  6. 데이터베이스 등의 저장소에서 조회한 사용자의 크리덴셜(Credential)을 포함한 사용자의 정보를 기반으로 UserDetails를 생성한 후, UserDetails를 다시 AuthenticationProvider에게 전달한다.

  7. AuthenticationProvider는 PasswordEncoder를 이용해 UserDetails에 포함된 암호화된 Password와 인증을 위한 Authentication 안에 포함된 Password가 일치하는지 검증한다.

  8. 검증에 성공하면 UserDetails를 이용해 인증된 Authentication을 생성하여 ProviderManager에게 전달한다.

  9. ProviderMangaer는 인증된 Authentication을 다시 UsernamePasswordAuthenticationFilter에게 전달한다.

  10. 전달받은 UsernamePasswordAuthenticationFilter는 SecurityContextHolder를 이용해 SecurityContext에 인증된 Authentication을 저장한다. 따라서, 인증된 사용자는 이후 요청에서도 SecurityContextHolder를 통해 SecurityContext에 저장된 정보를 사용할 수 있다.

  11. 인증된 사용자가 보호된 자원에 접근하면 FilterChainProxy가 등록된 다양한 Filter들을 순차적으로 호출하여 요청을 처리한다.

  12. 처리 과정에서 사용자가 권한이 없는 자원에 접근하거나 인증이 필요한 자원에 접근하면 AccessDeniedException 또는 AuthenticationException이 발생한다.

  13. ExceptionTranslationFilter는 등록된 AccessDeniedHandle을 통해 권한이 없는 사용자의 요청 처리를 위한 적절한 응답을 생성하거나  AuthenticationEntryPoint를 통해 인증되지 않은 사용자의 요청 처리를 위한 적절한 응답을 생성하여 예외 처리를 진행한다.

  14. 예외 처리가 끝나면 FilterChainProxy는 요청 처리 결과를 클라이언트에게 반환한다.

 

 

 

 

Component

 

 Spring Security는 아래와 같은 컴포넌트들을 조합하여 사용자 인증을 처리한다. 이러한 컴포넌트들은 Spring Security에서 제공하는 기본 구성 요소들이며, 이외에도 다양한 커스터마이징이 가능하다.

 

  • UsernamePasswordAuthenticationFilter
    : 사용자의 로그인 요청을 처리하는 Spring Security Filter이다. 로그인 요청 시 전달된 인증 정보를 이용해 Authentication 객체를 생성한다.

  • AbstractAuthenticationProcessingFilter
    : UsernamePasswordAuthenticationFilter를 비롯한 다양한 인증 처리 필터들의 공통적인 기능을 구현한 추상 클래스이다.

  • UsernamePasswordAuthenticationToken
    : Authentication 인터페이스를 구현한 구현 클래스이다. 사용자의 인증 정보를 저장하는 역할을 한다.

  • Authentication
    : 인증에 대한 정보를 나타내는 인터페이스이다.

  • AuthenticationManager
    : 인증 처리를 총괄하는 역할을 하는 주요 인터페이스이다.

  • ProviderManager
    : AuthenticationManager를 구현한 구현 클래스이다. 여러 개의 인증 제공자를 사용하여 인증을 처리하는 제공자 역할을 한다.

  • AuthenticationProvider
    : ProviderManager가 사용하는 인증 제공자 인터페이스이다. 실제 인증 처리를 담당한다.

  • UserDetails
    : 데이터베이스 등의 저장소에 저장된 사용자의 Username, Password(Credential) 그리고 사용자의 권한 정보를 포함하고 있는 컴포넌트이다.

  • UserDetailsService
    : UserDetails를 조회하는 인터페이스이다.

  • GrantedAuthority
    : 사용자 권한을 나타내는 인터페이스이다. UserDetails에서 사용자 권한 정보를 가져올 때 사용한다.

  • PasswordEncoder
    : 비밀번호를 암호화하는 인터페이스이다.

  • SecurityContext
    : 인증 정보를 저장하는 컨텍스트이다. Spring Security에서 인증된 사용자의 정보를 관리한다.

  • SecurityContextHolder
    : SecurityContext를 제공하는 static 유틸리티 클래스이다. 인증된 사용자의 정보를 ThreadLocal을 이용해 관리하고 제공한다.