
기본적으로 여러개의 filter 객체들이 순차적으로 수행되는 방식이다.
기본적으로는 세션 쿠키 방식의 인증이 이뤄진다.
-> 이 인증이 이뤄지는 필터 : "UsernamePasswordAuthenticationFilter"

이 필터는 attemptAuthentication() 이라는 추상메소드가 존재하는데
이 메소드에서 UsernamePasswordAuthenticationToken 클래스와this.getAuthenticationManager()을 봐야한다.
UsernamePasswordAuthenticationToken
- 추후 인증이 끝나고 SecurityContextHolder.getContext()에 등록될 Authentication 객체이다.**
public UsernamePasswordAuthenticationToken(Object principal, Object credentials) {
super(null);
this.principal = principal;
this.credentials = credentials;
setAuthenticated(false);
}
public UsernamePasswordAuthenticationToken(Object principal, Object credentials,
Collection<? extends GrantedAuthority> authorities) {
super(authorities);
this.principal = principal;
this.credentials = credentials;
super.setAuthenticated(true); // must use super, as we override
}
- 각 생성자는 setAuthenticated(false), setAuthenticated(true)를 실행한다.
- 아직 인증되지 않은 Authentication 객체를 생성한 것이고 추후 인증이 완료되면 인증된 생성자로 Authentication 객체가 생성된다.
AuthenticationManager
- AuthenticationProvider라는 클래스 객체를 관리
- AuthenticationProvider는 실제 인증 로직이 담긴 객체
- authenticate(Authentication authentication)메소드만 정의되어 있다.
- authenticate()을 실행하여 authenticationProvider객체를 통해 인증 완료되면
-> 인증된 Authentication 객체를 반환하는 기능을 한다.
- AuthenticationProvider 구현체는 인증을 진행할 때, 인증 정보를 담은 Authentication 객체를 가지고 인증을 진행한다.
- 내가 사용할 Authentication 객체는 UsernamePasswordAuthenticationToken이다.
- AbstractDetailsAuthenticationProvider 에서 retrieveUser() 메소드가 유저 id와 authentication 객체를가지고 Userdetails 객체를가져온다.
- AbstractDetailsAuthenticationProvider을 상속받은 또다른 클래스인 DaoAuthenticationProvider 클래스에서
- retrieveUser()메소드가 UserDetailService 객체를 통해 로그인 요청한 유저의 UserDetails 객체를 가져온다.
- 그리고 additionalAuthenticationChecks()메소드에서 입력받은 정보와 userDetails의 객체 정보를 비교해 인증을 체크한다. 즉 DB의 데이터와 id, 비밀번호를 입력한 값과 비교하느 곳이라고 할 수 있다.
- 이렇게 맞다고 판별되면 createSuccessAuthentication(principalToReturn, authentication, user)가 반환된다.
- 드디어 인증 된 Authentication 객체를 만드는 것이다.