이 시리즈에 나오는 모든 내용은 인프런 인터넷 강의 - 스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security - 에서 기반된 것입니다. 그리고 여기서 인용되는 PPT 이미지 또한 모두 해당 강의에서 가져왔음을 알립니다.
AuthenticationProvider
는 실제 인증 작업을 실행하는 첫 시작점이다.
AuthenticationProvider
는 인터페이스이며, 이것을 우리 입맛에 맞게 구현하고,
Spring Security 에 적용하는 것이 가능하다.
위 그림은 AuthenticationProvider 의 메소드와 동작방식이다.
AuthenticationProvider 는 요청이 오면 먼저 support
메소드를 통해서
AuthenticationManager 로부터 전달받은 인증객체를 지원하는지(support)를 체크한다.
support 메소드의 결과가 true 이면 authentication(authentication)
메소드가 실행된다.
<-->
요청으로 온 PW 값을 비교한다.간단하게 코드로 보면 아래와 같다.
AuthenticationProvider 구현체 중에서 Form 로그인과 관련된 인증객체를
처리하는 DaoAuthenticationProvider
및 해당 클래스의 추상 클래스인
AbstractUserDetailsAuthenticationProvider
를 중점으로 보겠다.
support 메소드의 내용이다.
UsernamePasswordAuthenticationToken
을 지원하는 것을 알 수 있다.
보면 알겠지만 retrieveUser 라는 메소드를 통해서 사용자 정보를 조회한다.
retrieveUser
메소드의 내용은 위와 같다.
UserDetailsService 라는 객체에게 사용자 정보를 찾아달라고 요청하는 것을
확인할 수 있다. 메소드 명은 loadUserByUsername
인다.
loadUserByUsername
메소드의 내용은 위와 같다.
사용자를 찾지 못하면 예외가 터진다.
반대로 찾게되면 UserDetails 라는 인터페이스를 구현한
User 클래스 인스턴스를 생성하고 반환한다.
최종적으로 Password 검증을 받게된다.
다 성공하면 최종적으로 인증객체를 생성한다.
이 인증객체는 AuthenticationManager 에게 반환될 것이고,
UsernamePasswordAuthenticaitonFilter 에게 연달아서 반환될 것이다.
그리고 해당 필터에서 인증객체를 SecurityConext 에 저장하고,
세션에 저장하는 등의 작업을 하게 될 것이다.