스터디-Spring

[스프링 시큐리티] AuthenticationManager와 Authentication

일태우 2022. 1. 10. 22:25

스프링 시큐리티에서 인증(Authentication)은 AuthenticationManager가 한다.

Authentication authenticate(Authentication authentication) throws AuthenticationException;
  • 파라미터인 Authentication이 유저가 입력한 id, pw 같은 인증정보를 가지고 있다
  • AuthenticationManager.authenticate를 통해 인증정보가 유효하다면 Principal를 담고있는 Authentication 객체를 리턴한다
  • 계정이 비활성화 되어있다면 - DisabledException
  • 계정이 잠겨있다면 - LockedException
  • 인증정보가 잘못되었다면 - BadCredentialsException

기본적인 구현체는 AuthenticationProvider를 사용한다

인자로 받은 Authentication

  • Principal: twlee (id)
  • Credentials: 123 (pw)

유효한 인증인지 확인 (AuthenticationManager.authenticate)

  • 사용자가 입력한 password가 UserDetailsService를 통해 읽어온 UserDetails 객체에 들어있는 password와 일치하는지 확인
  • 해당 사용자 계정이 잠겨 있진 않은지, 비활성 계정은 아닌지 등 확인
  • AuthenticationManager의 구현체들이 처리
    • AbstractUserDetailsAuthenticationProvider는 UsernamePasswordAuthenticationToken만 처리
    • PreAuthenticatedAuthenticationProvider는 PreAuthenticatedAuthenticationToken만 처리
    • 그래서 Provider들은 boolean supports(Class<?> authentication) 라는 메소드를 추가로 가지고 있다. supports를 Override해서 원하는 Authentication 상속 클래스의 인스턴스인지 확인하게끔 만드는 것이다.

Autentication 객체 반환

  • Principal: UserDetails 타입의 객체 (UserDetailsService에서 반환한 그 객체)
  • Credentials: 123 (인코딩 되어있을 것임)