AbstractAuthenticationProcessingFilter

SecurityFilterChain 안에는 Spring Security에서 제공하는 여러 필터들이 존재한다.
이때 Authentication을 담당하는 필터가 AbstractAuthenticationProcessingFilter 이다.
전체 동작 과정

1. 사용자가 로그인 정보를 입력하고 인증 요청을 보낸다.
2. AuthenticationFilter가 HttpServletRequest에서 사용자가 보낸 아이디와 패스워드를 인터셉트한다.
3. AuthenticationFilter에게 인증용 객체(UsernamePasswordAuthenticationToken)를 전달받는다.
4. 실제 인증할 AuthenticationProvider에게 Authentication 객체를 다시 전달한다.
5. DB에서 인증 정보를 가져올 UserDetailsService 객체에게 사용자 아이디를 넘겨주고 DB에서 인증에 사영할 사용자의 정보를 UserDeatils 객체로 전달 받는다.
6. AuthenticationProvider는 UserDetails 객체를 전달 받은 이후 실제 사용자 입력정보와 UserDetails 객체를 가지고 인증을 시도한다.
7. 인증이 완료되면 Authentication 객체를 SecurityContextHolder에 담은 후 AuthenticationSuccessHandle를 실행한다. 실패하면 AuthenticationFailureHandler를 실행한다.
1. 사용자의 로그인 시도
HttpRequest 요청이 Filter로 보내지고, 많은 Filter들을 거치게 된다. 이 과정에서 실제 로그인 시도와 관련된 Filter는 AbstractAuthenticationProcessingFilter를 Extends한 Filter이다.
Spring Security에서 기본적으로 제공하는 UsernamePasswordAuthenticationFilter는 AbstractAuthenticationProcessingFilter를 상속하고 있다. = 로그인 처리의 시작점이라고 보면 된다.
AbstractAuthenticationProcessingFilter.class
doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) 함수

-> doFilter 안의 attemptAuthentication에서 실제 로그인이 수행된다.
attemptAuthentication(HttpServletRequest request, HttpServletResponse response) 함수


-> POST 형식으로 username과 password를 파라미터로 받아 UsernamePasswordAuthenticationToken 객체를 생성한다.
-> 이후 이 객체를 통해 아이디와 패스워드 검증로직을 시작한다.
2 ~ 3. AuthenticationManager로 이동
AuthenticationManager는 실제 인증역할을 하는 것이 아닌, 'manager'라는 이름처럼 필터에서 받은 UsernamePasswordAuthenticationToken, CSRF 설정 등을 함께 받아 이 데이터를 기반으로 적절한 AuthenticationProvider를 찾아 실제 인증역할을 수행하게 설정한다.
사실상 AuthenticationManager는 인터페이스이기에 ProviderManager가 AuthenticationManager를 구현해 AuthenticationProvider를 찾는다고 생각하면 된다.
AuthenticationManager.class

ProviderManager.class

-> ProviderManager가 AuthenticationManager 인터페이스를 구현
4. AuthenticationProvider로 위임
AuthenticationManager가 UsernamePasswordAuthenticationFilter에서 사용할 수 있는 AuthenticationPrvoider를 찾아 인증처리를 위임한다.
UsernamePAsswordAuthenticationFilter의 default AuthenticationProvider는 DaoAuthenticationConfigurer이다.
InitializeUserDetailsBeanManagerConfigurer.class

-> 위의 클래스에서 기본적으로 DaoAuthenticationProvider를 등록하고 있는 것을 확인할 수 있다.
-> 그 외에도 PasswordEncoder, UserDeatilsService를 ProviderManager에 등록하고 있다.
DaoAuthenticationProvider.class

-> DaoAuthenticationProvider에는 여러 기능들이 존재하지만, UserDetailsService와 연관있는 retrieveUser 함수만 살펴보면, UserDetailsService의 loadUserByUsername을 실행시키는 것을 확인할 수 있다.
5 ~ 6. UserDetailsService
지금까지 ProviderManager에서 AuthenticationProvider, PasswordEncoder를 설정하는 코드를 확인했다.
실제 DB와 상호작용해 UserDetails 결과값을 반환하는 것은 UserDetailsService에서 이루어진다.
* Spring Security에서 기본적인 User를 제공하지만 실제로는 username, password, authroties를 가지고만은 진행할 수 없으니 User를 extends해 커스텀 후 진행해야 한다.
UserDetailsService.class : 인터페이스

DefaultUserDetailsService.class : 구현

UserDetails.class : 인터페이스

User.class : 구현

이후 과정
나머지 과정들은 위의 과정들이 종료된 이후, 다시 돌아가며 남은 작업들을 처리하는 과정이다.
참고
https://passionfruit200.tistory.com/426
'Spring' 카테고리의 다른 글
| [Spring] Spring Security에 대하여 (0) | 2024.08.20 |
|---|---|
| [Spring] FactoryBean & ApplicationContextAware 인터페이스 (0) | 2024.05.14 |