![[Spring-Security] 사용자 인증 처리 flow](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdNVHe4%2FbtsG1w4WmNa%2Fjvz5tN5h1HZELKe1QTHO8K%2Fimg.png)
Security Filters
역할
- 요청된 정보를 가지고 UsernamePasswordAuthenticationToken 생성
- 생성된 Token을 AuthenticationManager로 전달
- 인증이 완료된 Authentication 객체를 Security Context에 저장
사용자가 username, password를 입력 후 로그인을 시도하면 Security Filter가 입력 정보를 가로챕니다.
가로챈 username과 password는 UsernamePasswordAuthenticationToken에 저장됩니다.
Authentication Manager
역할
- 여러 개의 구현체인 Authentication Providers를 가진다.
- 사용자 인증을 처리할 수 있는 provider를 찾아 인증 처리를 위임한다.
Security Filter로부터 UsernamePasswordAuthenticationToken를 전달받고, 인증에 대한 책임을 위임받습니다.
AuthenitcationManager의 구현체로 ProviderManager가 있는데, 사용자 인증을 처리할 수 있는 providers를 저장하고 있습니다.
AuthenticationProviders
역할
- 실질적인 사용자의 인증 절차가 이루어진다.
List형태로 관리되는 AuthenticationProviders에는 다양한 형태의 사용자 인증을 처리할 수 있는 provider를 저장하고 있습니다.
Username과 Password 형태의 인증은 DaoAuthenticationProvider가 처리합니다.
DaoAuthenticationProvider는 UserDetailsService 및 PasswordEncoder를 사용하여 인증을 수행합니다. UserDetailsService는 loadUserByUsername()을 호출하여 데이터베이스로부터 사용자의 정보를 UserDetails 형태로 가져옵니다. 이때, UserDetails가 조회되지 않으면 예외가 발생합니다.
UserDetails에 저장된 사용자의 password와 DaoAuthenticationProvider의 PasswordEncoder를 통해 비밀번호가 일치하는지 확인합니다. 일치하다면 Authentication 객체를 생성하여 Security Context로 반환합니다.
Security Context
인증이 완료된 Authentication 객체는 Security Context에 보관됩니다. Context에 보관된 인증 정보는 이후에 재인증을 요구하지 않습니다.