
스프링 시큐리티에는 여러개의 filter들이 존재하며 이 필터들은 체인 형식(책임 연쇄 패턴) 으로 연결되어있다.
그리고 필터들은 요청이 들어올때마다 먼저 인터셉트를 하여 특정한 보안 처리를 수행 한다.
ex) UsernamePasswordAuthenticationFilter : HTTP 요청 메시지로부터 username 과 pw 를 추출
사용자의 인증 정보를 나타내며, Spring Security 에서는 인증 프로세스를 통해 생성되어 사용된다.
필터로부터 요청되어지며, 실질적으로 인증 작업을 수행하는 AuthenticationProvider 들을 전부 관리한다. 그리고 자신이 관리하는 AuthenticationProvider 들에게 인증 작업을 위임한다.
실제 인증 로직을 가지고 있는 인터페이스이다.
AuthenticationProvider 들을 도와주는 인터페이스로 Provider들이 인증을 위해 필요로하는 유저정보들을 DB 혹은 저장소로부터 가져와준다.
마찬가지로 Provider 들을 도와주는 인터페이스이고 패스워드는 반드시 암호화되어 저장되기 때문에 이를 다시 복호화 시켜주는 역할을 한다.
한 번 인증이 완료 된 Authentication 을 저장하고 관리하는 곳이다. 만일 이미 인증된 사용자가 다시 요청을 할 경우 검증 할 필요가 없다. (JPA의 영속성 컨텍스트와 비슷)

- 맨 처음 사용자가 보안 페이지(ex. 로그인이 필요한) 에 접근을 시도한다.
AuthorizationFilter,DefaultLoginPageGeneratingFilter들이 인터셉트 되어 사용자가 로그인이 되었는지 안되었는지를 판단하고 만일 안 되었을 경우 로그인 페이지로 redirect 시킨다.사용자가 로그인을 시도하고 다시한번 filter 에 의해 인터셉트된다.
UsernamePasswordAuthenticationFilter가 username 과 pw 를 추출한다음 이를 토대로UsernamePasswordAuthenticationToken을 생성한다. 그리고 토큰이 생성되면ProviderManager를 호출한다.
ProviderManager는 사용 가능한Provider들을 찾는다. 우선 기본적으로는DaoAuthenticationProvider의authenticate()를 호출 하도록 동작한다.
DaoAuthenticationProvider는InMemoryUserDetailsManager의loadUserByUsername()을 호출
하여 메모리에 저장된 유저 정보를 불러온다음 진짜 유저인지 아닌지를 검증한다. 이때 유저정보의 비밀번호는 암호화 되어있기 때문에PasswordEncoder를 통해 복호화 시켜준다.
- 인증 토큰에 검증 결과가 저장이 되어
ProviderManager에게 반환된다.
ProviderManager는 만일 인증이 실패했을 경우, 다음Provider를 호출하고, 성공했으면 그대로 토큰을 필터에게 반환해준다.
- 성공된 토큰은
SecurityContext에 저장되어져 나중에 filter 가 해당 정보를 사용하게된다. 그리고 최종적으로 사용자가 요청한 값을 response 해준다.
