순서 흐름
🟢 1) User가 로그인 폼 등을 통해 로그인 요청을 한다.
🟢 2) DelegatingFilterProxy로부터 위임을 받은 SecurityFilterChain 까지 들어오면 인증 처리가 시작된다.
🟢 3) UsernamePasswordAuthenticationFilter가 해당 요청을 전달 받는다.
🟢 4) UsernamePasswordAuthenticationFilter는 ID, Password를 이용해 (2)과 같이 토큰을 생성한다.
UsernamePasswordAuthenticationToken은 Authentication 인터페이스를 구현한 구현 클래스이고
아직 인증이 되지 않은 Authentication이다.
🟢 5) UsernamePasswordAuthenticationFilter가 Authentication (인증안됨) 을 가지고 (3) Authentication Manager에게 전달한다.
ProviderManager가 인증을 처리 할 누군가를 찾고 맡긴다.
🟢 6) ProviderManager가 Authentication (인증안됨) 을 AuthenticationProvider에게 인증하기 위해 전달한다.
🟢 7) AuthenticationProvider는 (5)처럼 UserDetailsService를 이용해 UserDetails를 조회한다.
UserDetails는 DB 등의 저장소에 저장된 사용자의 Username과 크리덴셜인 Password, 사용자의 권한 정보를 포함하고 있는 컴포넌트 이다.
UserDetailsService는 UserDetails를 제공하는 컴포넌트이다. (5)에서 처럼 DB 등의 저장소에서 사용자의 크리덴셜을 포함한 사용자의 정보를 조회하고 AuthenticationProvider에게 전달한다.
🟢 8) 사용자의 정보(username,password)를 가지고 UserDetails를 생성하고, 생성된 UserDetails를 다시 (8)번처럼 AuthenticationProvider에게 전달한다.
🟢 9) AuthenticationProvider는 PasswordEncoder를 이용해 UserDetails(인증됨) 에 포함된 Password와
인증을 위한 Authentication (인증안됨) 안의 Password가 일치하는지 검증한다
검증 성공시 UserDetails(인증됨) 를 이용해 (9)처럼 인증된 Authentication 을 생성한다.
실패 시 예외 발생
🟢 10) AuthenticationProvider는 인증된 Authentication 을 (10)번 처럼 ProviderManager에게 전달한다.
🟢 11) (11)번처럼 인증된 Authentication 을 UsernamePasswordAuthenticationFilter에게 전달한다.
🟢 12) 인증된 Authentication 을 받은 UsernamePasswordAuthenticationFilter는 (12)번처럼
SecurityContextHolder를 이용해 SecurityContext에 인증된 Authentication 을 저장한다.