DaoAuthenticationProvider

김상욱·2024년 12월 7일

DaoAuthenticationProvider는 AuthenticationProvider 구현체로, UserDetailsServicePasswordEncoder를 사용하여 사용자 이름과 비밀번호를 인증합니다.

이 섹션에서는 DaoAuthenticationProviderSpring Security 내에서 어떻게 동작하는지 살펴봅니다. 아래의 그림은 AuthenticationManagerUsername & Password 섹션에서 어떻게 동작하는지를 도식화하여 설명합니다.



DaoAuthenticationProvider의 동작 과정을 단계별로 자세히 설명드리겠습니다.

1. Authentication Filter

Username과 Password를 읽어오는 섹션Authentication Filter는 사용자가 입력한 usernamepassword를 받아, 이를 포함한 UsernamePasswordAuthenticationToken 객체를 생성합니다. 이 UsernamePasswordAuthenticationTokenAuthenticationManager로 전달됩니다.

  • UsernamePasswordAuthenticationToken은 Spring Security에서 인증 과정의 핵심 역할을 하는 객체로, usernamepassword를 저장하고 전달하는 용도로 사용됩니다.

2. ProviderManager의 구성

AuthenticationManagerProviderManager라는 구현체로 동작하며, 여러 개의 AuthenticationProvider를 가질 수 있습니다. 여기서는 DaoAuthenticationProvider가 설정되어 있어 usernamepassword를 통해 인증을 수행합니다.

  • ProviderManager는 설정된 AuthenticationProvider 리스트 중에서 DaoAuthenticationProvider를 사용해 인증을 시도합니다. 이는 다수의 인증 방식을 지원할 수 있도록 하기 위함입니다.

3. UserDetails 조회

DaoAuthenticationProviderUserDetailsService를 통해 UserDetails 객체를 조회합니다.

  • UserDetailsService는 사용자의 username을 기반으로 사용자 정보를 데이터베이스에서 불러오는 역할을 합니다.
  • 반환된 UserDetails 객체는 username, password, 권한 정보를 포함하고 있습니다.

예시: CustomUserDetailsService 클래스가 있다면, 여기서 loadUserByUsername() 메서드를 통해 데이터베이스에 저장된 사용자의 정보를 가져옵니다.

4. Password 검증

DaoAuthenticationProviderPasswordEncoder를 사용해, 사용자가 입력한 비밀번호와 UserDetails에서 조회된 비밀번호를 비교합니다.

  • PasswordEncoder는 일반적으로 비밀번호를 해시하고, 이를 검증할 수 있는 메커니즘을 제공합니다. Spring Security에서는 BCryptPasswordEncoder 같은 해시 방식을 자주 사용합니다.
  • PasswordEncoder는 입력된 비밀번호를 해시한 뒤, UserDetails에서 불러온 해시된 비밀번호와 비교합니다. 만약 두 비밀번호가 일치하면, 인증이 성공한 것으로 간주됩니다.

5. 인증 성공 시 처리

인증에 성공하게 되면, 새로운 UsernamePasswordAuthenticationToken 객체가 반환됩니다.

  • 이 새로운 UsernamePasswordAuthenticationToken 객체에는 인증된 UserDetailsprincipal로 설정됩니다.
  • 이 인증 객체는 SecurityContextHolder에 저장되며, 이를 통해 이후의 요청에서 해당 사용자가 인증되었음을 유지할 수 있습니다.

SecurityContextHolder는 인증 상태를 저장하고, 애플리케이션 전반에서 접근할 수 있는 보안 컨텍스트입니다. 이를 통해, 애플리케이션의 나머지 부분은 인증된 사용자의 세부 정보를 사용할 수 있습니다.


이 과정의 흐름을 정리하자면:
1. 사용자 입력 → Filter에서 Username과 Password를 받아서 UsernamePasswordAuthenticationToken을 생성.
2. AuthenticationManager → 전달받은 Token을 ProviderManager가 처리.
3. UserDetailsServiceDaoAuthenticationProvider가 사용자 정보를 조회.
4. Password 검증PasswordEncoder를 통해 비밀번호를 검증.
5. 성공 후 Context 설정 → 인증 성공 시 SecurityContextHolder에 인증 객체 저장.

이와 같은 과정으로, Spring Security는 안전한 방식으로 사용자를 인증하고, 애플리케이션의 다른 부분에서 사용자가 인증되었음을 확인할 수 있게 합니다.

0개의 댓글