개발 일지/Spring
[Spring Security] 인증 처리 흐름
미숫가루설탕많이
2023. 3. 16. 16:44
가장 일반적으로 사용되는 인증 방식인 ID/Password의 인증 처리 흐름은 다음과 같으며, 이러한 과정을 통해 Spring Security는 사용자 인증 및 권한 처리를 수행한다.
Spring Security는 매우 유연한 보안 프레임워크이기 때문에 '아래의 인증 처리 흐름이 모든 상황에 적용되는 것이 아니며' 필요에 따라서 여러 방식을 조합해서 사용할 수 있다.
- 사용자가 로그인 페이지에 접근하여 ID와 Password를 포함한 request를 Spring Security가 적용된 애플리케이션에 전송한다.
- 사용자의 로그인 요청이 Spring Security의 Filter Chain까지 들어오면 UsernamePasswordAuthenticationFilter가 해당 요청을 전달받는다.
- UsernamePasswordAuthenticationFilter는 전달받은 ID와 Password를 이용해 UsernamePasswordAuthenticationToken(Authentication 인터페이스를 구현한 구현 클래스) 객체를 생성한다.
- 생성된 객체를 AuthenticationManager가 전달받아 인증 처리를 진행한다. 이때, AuthenticationManager는 내부적으로 설정된 ProviderManager 객체에게 인증 처리를 위임한다.
- ProviderManager는 등록된 AuthenticationProvider에게 Authentication을 전달하고 AuthenticationProvider는 UserDetailsService를 이용해 UserDetails를 조회한다.
- 데이터베이스 등의 저장소에서 조회한 사용자의 크리덴셜(Credential)을 포함한 사용자의 정보를 기반으로 UserDetails를 생성한 후, UserDetails를 다시 AuthenticationProvider에게 전달한다.
- AuthenticationProvider는 PasswordEncoder를 이용해 UserDetails에 포함된 암호화된 Password와 인증을 위한 Authentication 안에 포함된 Password가 일치하는지 검증한다.
- 검증에 성공하면 UserDetails를 이용해 인증된 Authentication을 생성하여 ProviderManager에게 전달한다.
- ProviderMangaer는 인증된 Authentication을 다시 UsernamePasswordAuthenticationFilter에게 전달한다.
- 전달받은 UsernamePasswordAuthenticationFilter는 SecurityContextHolder를 이용해 SecurityContext에 인증된 Authentication을 저장한다. 따라서, 인증된 사용자는 이후 요청에서도 SecurityContextHolder를 통해 SecurityContext에 저장된 정보를 사용할 수 있다.
- 인증된 사용자가 보호된 자원에 접근하면 FilterChainProxy가 등록된 다양한 Filter들을 순차적으로 호출하여 요청을 처리한다.
- 처리 과정에서 사용자가 권한이 없는 자원에 접근하거나 인증이 필요한 자원에 접근하면 AccessDeniedException 또는 AuthenticationException이 발생한다.
- ExceptionTranslationFilter는 등록된 AccessDeniedHandle을 통해 권한이 없는 사용자의 요청 처리를 위한 적절한 응답을 생성하거나 AuthenticationEntryPoint를 통해 인증되지 않은 사용자의 요청 처리를 위한 적절한 응답을 생성하여 예외 처리를 진행한다.
- 예외 처리가 끝나면 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을 이용해 관리하고 제공한다.