Seqcurity는 Spring Security Filter Chain을 통해 보안을 위한 특정 작업을 처리한다.
Spring Security의 컴포넌트로 보는 인증(Authentication) 처리 흐름(로그인 인증 방식)
(1) 사용자가 로그인 폼 들을 이용해 Username과 Password를 포함한 request를 Spring Security가 적용된 애플리케이션에 전송한다.
사용자의 로그인 요청을 전달받은 UsernamePasswordAuthenticationFilter는 Username과 Password를 이용해 (2) 처럼 UsernamePasswordAuthenticationToken을 생성한다.
-> Authentication 인터페이스를 구현한 구현 클래스이며, 여기에서 Authemtication은 아직 인증되지않았다.
인증 되지 않은 Authentication 을 가지고 있는 UsernamePasswordAuthenticationFilter는 (3) 같이 해당 Authentication을 AuthenticationManager에게 전달한다.
AuthenticationManager 인증 처리를 총괄하는 매니저 역할을 하는 인터페이스.
AuthenticationManager를 구현한 구현 클래스가 ProviderManager이다.
(4) 같이 ProviderManager 로부터 Authentication을 전달 받은 AuthenticationProvider은 (5)와 같이 UserDetailsService를 이용해 UserDetails를 조회한다.
UserDetails은 데이터베이스 등의 저장소에 저장된 사용자의 Username과 사용자의 자격을 증명해주는 Credential(크리덴셜)인 Password, 그리고 사용자의 권한 정보를 포함하고 있는 컴포넌트이다. UserDetails를 제공하는 컴포너틑가 UserDetailsService이다.
UserDetailsService는 (5)에서 처럼 DB들의 저장소에서 사용자의 크리덴셜을 포함한 사용자의 정보를 조회한다.
데이터 베이스 등의 저장소에서 조회한 사용자의 크리덴셜을 포함한 사용자의 정보를 기반으로 (7)과 같이 UserDetails를 생성한 후, (8) 생성된 UserDetails를 다시 AuthenticationProvider에게 전달한다.
UserDetails를 전달 받은 AuthenticationProvider은 PasswordEncoder를 이용해 UserDetails에 포함된 암호화된 Password와 인증을 위한 Authentication안에 포함된 Password가 일치하는지 검증한다.
(9)검증에 성공하면 UserDetails를 이용해 인증된 Authentication을 생성한다.
만약 검증에 성공하지 못하면 Exception을 발생시키고 인증 처리를 중단한다.
(10) AuthenticationProvider은 인증된 Authentication을 ProviderManager 에게 전달한다.
이제는 ProviderManager는 (11) 과같이 인증된 AUthentication을 다시 UsernamePasswordAuthenticationFilter에게 전달한다.
인증된 Authentication을 전달 받은 UsernamePasswordAuthenticationFilter은 마지막으로 (12)과 같이 SecurityContextHoler를 이용해 SecurityContext에 인증된 Authentication을 저장한다.