[Security] Spring Security 기본 로그인 인증 흐름

LeeSeungEun·2023년 9월 23일

Security

목록 보기
4/4

1. Spring Security 기본 로그인 인증 흐름

1. 위에 커스텀 필터에서 인증 대상 객체를 UsernamePasswordAuthenticationToken로 설정했었습니다.
   이 객체는 클라이언트 Request의 ID(Username), PW를 가지고 있습니다.
   이 객체를 AuthenticationManager(ProviderManager)에게 전달합니다.
   
2. ProviderManager가 전달받은 UsernamePasswordAuthenticationToken를 
   ProviderManager의 구현체인 DaoAuthenticationProvider로 전달합니다.
   
3. DaoAuthenticationProvider는 UserDetailsService의 
   loadUserByUsername(String username)을 호출하여 UserDetails 객체를 반환받습니다.
   
   이때, loadUserByUsername의 파라미터인 username은 DaoAuthenticationProvider가
   UsernamePasswordAuthenticationToken에서 username을 꺼내어 설정해줍니다.
   
   따라서, UserDetialsService의 loadUserByUsername(String username)에서
   클라이언트 Request의 username을 통해 DB에서 유저를 찾아 있다면, 
   USER Entity를 반환하고(JPA 사용 시), 그 Entity를 내부적으로 UserDetails 객체로
   만들어서 반환받습니다.
   
4. 반환받은 UserDetails 객체의 password를 꺼내어, 내부의 PasswordEncoder에서
   password가 일치하는지 검증을 수행합니다.
   
5. 비밀번호가 일치한다면, 인증 대상 객체인 UsernamePasswordAuthenticationToken에
   UserDetails 객체와 Authorities를 담아서 반환해줍니다.
   이후에 ProviderManager에서 반환된 UserDetails 객체와 Authorities가 담긴 
   UsernamePasswordAuthenticationToken으로 인증 객체를 생성하여 인증 성공 처리를 합니다.
  • 참고로, 이는 Spring Security의 기본 Form Login 로직이지만, JSON 자체 Login 방식과도 거의 다른게 없다.
  • 1번 과정에서 UsernamePasswordAuthenticationToken에 ID, PW가 저장될 때, 클라이언트의 Request가 form-data가 아닌 application/json으로 들어오기 때문에, JSON 데이터를 받아서 UsernamePasswordAuthenticationToken을 저장한다는 것만 다르고, 나머지 로직들은 모두 동일하다.

0개의 댓글