DaoAuthenticationProvider는 AuthenticationProvider 구현체로, UserDetailsService와 PasswordEncoder를 사용하여 사용자 이름과 비밀번호를 인증합니다.
이 섹션에서는 DaoAuthenticationProvider가 Spring Security 내에서 어떻게 동작하는지 살펴봅니다. 아래의 그림은 AuthenticationManager가 Username & Password 섹션에서 어떻게 동작하는지를 도식화하여 설명합니다.

DaoAuthenticationProvider의 동작 과정을 단계별로 자세히 설명드리겠습니다.
Username과 Password를 읽어오는 섹션의 Authentication Filter는 사용자가 입력한 username과 password를 받아, 이를 포함한 UsernamePasswordAuthenticationToken 객체를 생성합니다. 이 UsernamePasswordAuthenticationToken은 AuthenticationManager로 전달됩니다.
AuthenticationManager는 ProviderManager라는 구현체로 동작하며, 여러 개의 AuthenticationProvider를 가질 수 있습니다. 여기서는 DaoAuthenticationProvider가 설정되어 있어 username과 password를 통해 인증을 수행합니다.
DaoAuthenticationProvider는 UserDetailsService를 통해 UserDetails 객체를 조회합니다.
예시: CustomUserDetailsService 클래스가 있다면, 여기서 loadUserByUsername() 메서드를 통해 데이터베이스에 저장된 사용자의 정보를 가져옵니다.
DaoAuthenticationProvider는 PasswordEncoder를 사용해, 사용자가 입력한 비밀번호와 UserDetails에서 조회된 비밀번호를 비교합니다.
BCryptPasswordEncoder 같은 해시 방식을 자주 사용합니다.인증에 성공하게 되면, 새로운 UsernamePasswordAuthenticationToken 객체가 반환됩니다.
SecurityContextHolder는 인증 상태를 저장하고, 애플리케이션 전반에서 접근할 수 있는 보안 컨텍스트입니다. 이를 통해, 애플리케이션의 나머지 부분은 인증된 사용자의 세부 정보를 사용할 수 있습니다.
이 과정의 흐름을 정리하자면:
1. 사용자 입력 → Filter에서 Username과 Password를 받아서 UsernamePasswordAuthenticationToken을 생성.
2. AuthenticationManager → 전달받은 Token을 ProviderManager가 처리.
3. UserDetailsService → DaoAuthenticationProvider가 사용자 정보를 조회.
4. Password 검증 → PasswordEncoder를 통해 비밀번호를 검증.
5. 성공 후 Context 설정 → 인증 성공 시 SecurityContextHolder에 인증 객체 저장.
이와 같은 과정으로, Spring Security는 안전한 방식으로 사용자를 인증하고, 애플리케이션의 다른 부분에서 사용자가 인증되었음을 확인할 수 있게 합니다.