[ 전체 구조 ]

- 사용자가 입력한 form을 통해 로그인 정보가 담긴 Request를 보낸다.
- AuthenticationFilter가 HttpServletRequest에서 사용자가 보낸 아이디와 패스워드를 인터셉트 한다.
- 꺼내온 로그인 정보를 AuthenticationManager(인터페이스) 에게 UsernamePasswordAuthenticationToken(인증용객체)로 만들어서 준다.
- 실제 인증을 할 AuthenticationProvider에게 UsernamePasswordAuthenticationToken를 다시 전달한다.
- 인증 절차가 시작되면 AuthenticationProvider 인터페이스가 실행되고 DB에 있는 이용자의 정보와 화면에서 입력한 로그인 정보를 비교한다.
- AuthenticationProvider(인터페이스) 에서는 authenticate() 메소드를 오버라이딩 하는데 이 메소드의 파라미터인 Authentication으로 화면에서 입력한 로그인 정보를 가져올 수 있다.
- AuthenticationProvider에서 DB에 있는 이용자의 정보를 가져오려면 UserDetailsService(인터페이스)를 사용한다.
- UserDetailsService는 화면에서 입력한 이용자의 이름(username)을 가지고 loadUserByUsername()메소드를 호출하여 DB에 있는 이용자의 정보를 UserDetails 로 가져온다. 이용자가 존재하지 않으면 예외를 던짐
- DB에서 가져온 이용자의 정보와 화면에서 입력한 로그인 정보를 비교하고
일치하면 Authentication 참조를 리턴, 일치하지 않으면 예외를 던짐
- 인증이 완료되면 사용자 정보를 가진 Authentication객체를 SecurityContextHolder에 담은 이후 AuthenticationSuccessHandle를 실행시킨다. 실패시 AuthenticationFailureHandler실행함
- Authentication : 현재 접근 주체 정보를 담는 역할, 인증 요청을 할 때 요청 정보를 담는 역할이다.