++Table of Contents
1. Spring Security 기본 구조 및 웹 요청 처리 흐름
2. 인증 처리 흐름
3. 인증 컴포넌트
사용자가 어떠한 리소스에 접근하기 원할때:
사용자가 Credential(Password)와 함께 보낸 인증 요청을 Spring Security Filter중 하나인, 인증관리자 역할을 하는 AbstractAuthenticationProcessingFilter를 상속하는 필터가 잡아 크리텐셜 저장소에서 사용자의 크리덴셜을 조회, 비교 검증을 수행한다. 유효한 크리덴셜이라면 접근 결정 관리자가 사용자의 Authoritiy를 검증하고 접근의 허용여부를 결정한다.
- 자바는 클라이언트에서 엔드포인트에 요청이 도달하기 전에 중간에서 요청을 가로채 특정 처리를 할 수 있게 하는 적절한 포인트인 Servelet Filter를 제공한다. 이때 하나이상의 필터들을 연결해 Filter Chain을 구성할 수 있다.
- Spring Security는 DelegatingFilterProxy와 FilterChainProxy 클래스를 이용해 느슨하게 Servelet Filter들의 중간에 연결되어 보안 관련 기능을 수행한다.
- UsernamePasswordAuthenticationFilter
(AbstractAuthenticationProcessingFilter상속):
- AbstractAuthenticationProcessingFilter:
- UsernamePasswordAuthenticationToken
- Authentication
Principal은 사용자를 식별하는 고유 정보
일반적으로 Username/Password 기반 인증에서는 Username이 Principal이 되며, 다른 인증 방식에서는 UserDetails가 Principal이 된다.
사용자 인증에 필요한 Password를 의미하며 인증이 이루어지고 난 직후, ProviderManager가 해당 Credentials를 삭제
AuthenticationProvider에 의해 부여된 사용자의 접근 권한 목록.
일반적으로 GrantedAuthority 인터페이스의 구현 클래스는 SimpleGrantedAuthority이다.
- AuthenticationManager
- ProviderManager
- AuthenticationProvider
AuthenticationProvider는 AuthenticationManager로부터 인증 처리를 위임받아 실질적인 인증 수행을 담당하는 컴포넌트
Username/Password 기반의 인증 처리는 DaoAuthenticationProvider가 담당하고 있으며, DaoAuthenticationProvider는 UserDetailsService로부터 전달받은 UserDetails를 이용해 인증을 처리
- UserDetails
- UserDetailsService
UserDetails를 로드(load)하는 핵심 인터페이스
loadUserByUsername(String username)을 통해 사용자의 정보를 로드하여 AuthenticationProvider에 인증정보를 UserDetails로 전달
- SecurityContext & SecurityContextHolder