① 사용자가 로그인 정보와 함께 인증 요청을 한다. (Http Request)
② AuthenticationFilter가 요청을 가로채고, 가로챈 정보를 통해 usernamePasswordAuthentication의 인증용 객체(Token)를 생성한다.
-> 만약 요청을 가로채지 않는다면, Presentation Layer의 DispatcherServlet로 갈것이다.
③ 생성한 UsernamePasswordToken(인증용 객체(Token))을 AuthenicationManager(인터페이스)의 구현체인 ProviderManager에게 전달한다.
④ AuthenticationManager(≑ProviderManager)는 등록된 AuthenticationProvider를 조회하여 인증을 요구한다.
⑤ 실제 DB에서 사용자 인증정보를 가져오는 UserDetailsService에 사용자 정보(User)를 넘겨준다.
⑥ 넘겨받은 사용자 정보(AuthenticationProvider에서 조회한 결과)를 통해 DB에서 찾은 사용자 정보인 UserDetails 객체를 만든다.
-> UserDetailsService에서 제공하는 메소드를 사용하기 위해서는 UserDetails이라는 인터페이스를 구현해야 한다.
⑦ AuthenticationProvider는 UserDetailsService을 통해 UserDetails(≑사용자정보(User))를 받아서 인증용 객체(사용자 정보)와 비교한다.
⑧ 인증이 완료되면 권한 등의 사용자 정보를 담은 Authentication 객체(인증성공된 객체)를 반환하여 AuthenticationManager(=ProviderManager)에 전달한다.
⑨ 다시 AuthenticationManager(=ProviderManager)은 AuthenticationFilter에 Authentication 객체를전달(반환)한다.
⑩ Authentiication 객체를 SecuriryContextHolder의 SequrityContext에 저장된다.
⁕userDetails
⁕userDetailsService