앞서 코드를 통해 Spring Security가 어떤 과정을 통해 자격 증명을 수행하는지 확인해봤는데 이를 보다 간단하게 정리해보았다

1단계
사용자가 처음 보안이 필요한 API에 접근한다
2단계
AuthrizationFilter, AbstractAuthenticationProcessingFilter, DefaultLoginPageGeneratingFilter 등의 Filter가 사용자가 로그인 했는지 여부를 판단하고 로그인 페이지로 redirect 시킨다.
3단계
로그인 페이지에서 사용자가 인증 정보를 입력하고, 해당 요청이 Filter로 전달된다.
4단계
UsernamePasswordAuthenticationFilter와 같은 Filter가 request로부터 username, password를 추출하고 이를 통해 UsernamePasswordAuthenticationToken 객체를 생성한다. UsernamePasswordAuthenticationToken 객체는 Authentication 인터페이스의 구현체이고, 해당 객체는 ProviderManager의 authenticate() 메서드를 호출한다.
5단계
AuthenticationManager의 구현체인 ProviderManager가 모든 AuthenticationProvider를 확인한다. Spring Security에서 default provider는 DaoAuthenticationProvider이므로, ProviderManager가 DaoAuthenticationProvider를 호출한다.
6단계
DaoAuthenticationProvider가 InMemoryUserDetailManager의 loadUserByUsername() 메서드를 호출한다. 이는 메모리로부터 UserDetail을 가져오는 역할을 하고, UserDetail을 가져오면 passwordEncoder를 통해 사용자가 입력한 password와 메모리에 존재하는 password를 비교한 후 인증 과정을 진행한다.
7단계
인증 정보를 Authentication 객체를 ProviderManager로 전달한다.
8단계
ProviderManager는 인증이 성공했는지 여부를 확인한다. 인증이 실패했다면 다른 가능한 AuthenticationProider를 찾아 위 작업을 다시 진행할 것이고, 인증이 성공했다면 Filter에 인증 정보를 전달한다.
9단계
추후 인증을 간단히 진행하기 위해 Authentcation 객체가 Security Context에 저장된다. 최종적으로 사용자에게 response을 전달한다.
아래는 각 컴포넌트 별로 인증 흐름을 나타낸 도식도이다.
