UsernamePasswordAuthenticationFilter
는 Username/Password 기반의 인증 요청을 처리한다.UsernamePasswordAuthenticationToken
생성- 아직 인증되지 않은 Authentication 객체
AuthenticationManager
는 인증 처리를 총괄하는 매니저 역할을 하는 인터페이스.ProviderManager
는 AuthenticationManager를 구현한 구현 클래스UserDetails
는 사용자의 자격을 증명해주는 크리덴셜(Credentials) 과 권한 정보를 가지고 있는 객체.UserDetailsService
가 사용자의 Credential과 권한 정보를 조회해서 UserDetails 를 생성.UserDetailsService
가 AuthenticationProvider에게 UserDetails 를 전달.AuthenticationProvider
는 전달 받은 UserDetails에서 패스워드가 일치하는지 검증.AuthenticationProvider
가 패스워드 검증에 성공하면 인증에 성공한 사용자의 정보(Principal, Credential, GrantedAuthorities)를 포함한 Authentication을 생성.- 인증된 Authentication을 전달 받은 UsernamePasswordAuthenticationFilter는
SecurityContextHolder
를 이용해SecurityContext
에 인증된 Authentication을 저장.SecurityContext
는 다시 HttpSession에 저장되어 사용자의 인증 상태를 유지.
Spring Security의 인증 컴포넌트
1️⃣ UsernamePasswordAuthenticationFilter extends AbstractAuthenticationProcessingFilter
- Username/Password 방식의 인증 처리의 시작점
2️⃣ UsernamePasswordAuthenticationToken
- 사용자의 인증 처리가 되기 전에는 인증되지 않은 Authentication.
- Username과 Password 정보를 포함하고 있다.
- 사용자의 인증 처리가 된 이후에는 인증된 Authentication
- Principal, Authorities를 포함하고 있다.
- Credentials 정보는 민감한 정보이므로 인증 이 후에는 제거된다.
3️⃣ AuthenticationManager
- 인증 처리를 지시하는 매니저 역할을 한다.
- 인증 매니저 계의 총 지배인
4️⃣ ProviderManager
- AuthenticationManager의 구현 클래스
- 인증 매니저 계의 지배인
- 인증이 성공적으로 이루어진 후, Crendentials를 제거한다.
- 인증 끝났으니까 민감한 정보는 가지고 있을 필요가 없음.
- 인증 끝났으니까 민감한 정보는 가지고 있을 필요가 없음.
5️⃣ AuthenticationProvider
- 인증된 사용자인지를 판단하는 역할
- 인증 매니저의 지시를 받는 현장 담당자 역할
6️⃣ UserDetails
- 크리덴셜 저장소에 저장된 크리덴셜 정보를 가지고 있는 객체
- AuthenticationProvider는 UserDetailsService로부터 UserDetails를 전달 받는다.
7️⃣ UserDetailsService
- UserDetails 객체를 생성해서 AuthenticationProvider에게 제공하는 역할을 한다.
8️⃣ SecurityContext와 SecurityContextHolder
- 인증된 Authentication 정보를 저장하는 저장 객체
- SecurityContext는 인증 성공 이 후, HTTP Session에 저장된다.
- HTTP Session은 최종적으로 StandardManager의 상위 클래스인 ManagerBase에서 관리된다.
- ⭐ HTTP Session에 누가 저장 할까?
- 최초 인증에 성공할 경우에는 UsernamePasswordAuthenticationFilter에서 HttpSessionSecurityContextRepository를 이용해 HTTP Session에 저장한다.
- 인증 이 후에 재요청 시에는 SecurityContextPersistenceFilter가 저장한다.
- 인증 이 후 재요청 시의 프로세스는 대략 아래와 같다.
- HTTP 요청
- --> SecurityContextPersistenceFilter가 HTTP Session에서 SecurityContext를 꺼낸 후, SecurityContextHolder에 저장
- -> 이 후, 요청이 끝나는 시점에 SecurityContextPersistenceFilter의 finally 블럭에서
- SecurityContextHolder에 저장된 SecurityContext를 지운 뒤,
- --> HttpSessionSecurityContextRepository를 이용해 HTTP Session에 SecurityContext를 다시 저장한다.
- 인증 이 후 재요청 시의 프로세스는 대략 아래와 같다.
'Java Backend 개발자 되기 > Spring Security' 카테고리의 다른 글
JWT를 이용한 인증(Authentication) 및 자격 검증(Authorization) 프로세스 (4) | 2023.01.19 |
---|---|
JWT 자격 검증 시, SecurityContext는 언제 비워(clear)질까? (8) | 2023.01.19 |
Spring Security에서의 권한 부여 (Authorization) 처리 흐름 (0) | 2023.01.17 |
메시지 암호화에 대한 짧은 이야기 (0) | 2023.01.16 |
HTTPS의 동작 원리와 CA의 역할을 그림으로.. (2) | 2023.01.13 |