AuthenticationProvider
인증 프로세스에서 사용자가 제공한 인증 정보(ex. password) 가 유효한지 안 한지 검증하는 객체이다.
AuthenticationManager 에 의해 위에 언급한 기능들을 수행하도록 기능을 위임 받는다.AuthenticationManager 가 적절한 provider 들을 골라서 위임한다.Authentication 객체를 AuthenticationManager 에게 반환한다.
authenticate()
AuthenticationManager 로 부터 Authentication 객체를 전달 받아 인증을 수행한다.
supports()
인증을 수행할 수 있는 조건인지를 검사한다.
1)
AuthenticationManager가 인증을 수행하기 위해 적절한AuthenticationProvider를 선택한뒤 호출한다.2)
AuthenticationManager로 부터Authentication객체를 전달 받은AuthenticationProvider는 인증을 수행하기 시작한다.3) 대표적으로 사용자 유무, 비밀번호 검증, 보안 강화 처리 등을 수행하게 된다.
(사용자정보를 DB로부터 가져오기 위해UserDetailsService를 사용한다. )4) 인증이 성공적으로 완료되었으면
Authentication객체를 반환한다. 이때 해당 객체에는 사용자의 신원 정보와 인증된 자격 증명이 포함된다.※ 실패시
AuthenticationException예외를 발생시킨다.
스프링 시큐리티가 기본으로 제공하며 대표적인 AutheticationProvider 구현체이다.
PasswordEncoder 와 UserDetailsService 를 사용한다. AbstractUserDetailsAuthenticationProvider 를 상속 받는다.
SpringSecurity 공식 가이드 문서에서 제공하는 DaoAuthenticationProvider 흐름도인데 앞에서 살펴본 AuthenticationProvider 의 흐름도와 거의 동일한 것을 확인할 수 있다.
retrieveUser()사용자가 제출한 인증 정보를 검증하기 위해 DB에 저장된 사용자 정보를 불러오는 메서드이다. 여기서 UserDetailsService 의 loadByUsername() 호출하여 UserDetails 를 불러온다.
additionalAuthenticationChecks()사용자가 제출한 비밀번호와 DB에서 조회해온 비밀번호를 서로 비교하는 메서드이다.
엇 그건 authenticate() 에서 처리해야하는거 아니야?
라고 생각할 수 있는데 사실 additionalAuthenticationChecks() 이 authenticate() 안에서 처리 된다.
위에서 살짝 언급했듯이 DaoAuthenticationProvider 는 AbstractUserDetailsAuthenticationProvider 를 상속 받고 있는데, 부모 측 에서 authenticate() 가 어느정도 정의 되어 있으며 자식 프로바이더는 이 authenticate() 안에 호출 되는 템플릿 메서드(추상메서드이다) additionalAuthenticationChecks() 를 구현하고있다.
DaoAuthenticationProvider

AbstractUserDetailsAuthenticationProvider

주석과 위 흐름도를 같이 보면서 코드를 읽으면 이해하기 쉬울 것이다.
본 포스트는
스프링 시큐리티 완전 정복 6.x 개정판 ,
스프링시큐리티6 공식 가이드 를 보고 정리했습니다.