Spring Security 작동 순서
1. http로 로그인 요청
2. 로그인 인증 요청이라면 UsernamePasswordAuthenticationFilter(이하 AuthencicationFilter)가 요청을 가로채 전달된
username, password 파라미터를 이용해 UsernamePasswordAuthenticationToken 인증 객체를 만든다.
3. 인증 객체를 인증하기 위한 AuthenticationManager 에 넘기고 인증을 위임한다.
4. AuthenticationManager 를 구현한 ProviderManager는 스프링 시큐리티가 기본적으로 제공하는 AuthenticationProviders에 인증 객체를 전달한다.
5. 인증에 사용되기 적합한 AuthenticationProvider 가 존재하면(여기는 DaoAuthenticationProvider) UserDatailsService 에 인증 객체를 전달한다.
6. UserDetailsService 에서 인증 객체의 정보를 통해 DB에서 일치하는 사용자 정보를 찾고 UserDetails객체를 만든다.
7. AuthenticationProvider는 UserDetails와 UsernamePasswordAuthenticationToken를 비교해 인증에 성공하면 ProviderManager에 권한을 담은 새 UsernamePasswordAuthenticationToken을 만들어 전달한다.
8. ProviderManager는 검증된 인증 객체를 AuthenticationFilter에게 전달한다.
9. AuthenticationFilter는 검증된 인증 객체를 SecurityContextHolder의 SecurityContext에 저장하고 나머지 SecurityFilterChain은 무시하고 SercurityFilterChain을 종료한다.