스프링 시큐리티 공식 문서를 읽고, 라이브러리 코드들을 뜯어보면서 공부했습니다.
인증은 username/password 인증을 기준으로 설명하겠습니다.
username/password를 기준으로 하고, 시큐리티에 다른 설정을 하지 않았을때
(커스텀 AuthenticationManager나 AuthenticationProvider을 설정하지 않음)
인증 필터가 사용자 인증을 수행되는 과정을 설명합니다.
- AuthenticationFilter가 request를 받음
- 받은 request에 있는 username/password를 이용해 UsernamePasswordAuthenticationToken 생성
- Token을 AuthenticationManager에게 보내면서 인증 진행 (대표적인 구현 객체는 ProviderManager)
- ProviderManager는 현재 Token을 인증을 할 수 있는 AuthenticationProvider를 search & 해당 Provider에게 Token 보내면서 인증 진행
- 해당 Provider는 UserDetailsService에게 Token에 있는 username으로 DB 조회 요청
- UserDetailsService는 username를 통해 DB로부터 사용자 정보를 조회한다. & 해당 사용자 정보로 UserDetails 생성
- AuthenticationProvider는 UserDetailsService로부터 받은 UserDetails를 통해 사용자 인증 진행
(DB에 있는 유저 password와 request로 받은 password가 일치하는지)
- 인증 성공하면 해당 사용자 정보 객체(Authentication 객체)를 AuthenticationManager로 반환
- Authentication 객체 AuthenticationFilter로 반환
- AuthenticationFilter가 받은 Authentication 객체를 SecurityContext에 저장하면서 인증 종료
다음 필터로 넘어갑니다.
AuthenticationFilter는 interface가 아니라 인증을 진행하는 필터를 의미합니다.
UsernamePasswordAuthenticationFilter, BasicAuthenticationFilter가 이에 해당합니다.
개인적으로 공부한 내용을 정리한 글입니다.
지적, 피드백 환엽합니다.