

SecurityConfig 클래스로 HttpSecurity에서 Filter를 생성하여 WebSecurity에 전달한다.WebSecurity는 FilterChainProxy 객체에 Bean 객체를 생성하여 생성자로 자신이 가지고 있는 Filter 목록을 전달한다.DelegatingFilterProxy는 springSecurityFilterChain라는 이름의 Bean을 가진 Bean Class를 찾는데 그게 FilterChainProxy 에게 전달하여 요청을 위임한다.SecurityContextPersistenceFilterDelegatingFilterProxy에서 FilterChainProxy에게 인증 요청 위임SecurityContextPersistanceFilter에서 loadContext 함수를 호출해 SecurityContext가 있는지 확인한다.HttpSessionSecurityContextRepository 클래스가 있고, SecurityContext의 생성, 저장, 조회, 참조를 하는 클래스SecurityContext를 저장해서 SecurityContextHolder에 저장한 뒤 다음 필터로 이동한다.LogoutFilterUsernamePasswordAuthenticationFilterAuthentication)을 만든다.AuthenticationManager 에게 인증 처리 위임AuthenticationManager는 AuthenticationProvider에게 실제 인증 처리를 위임한다.AuthenticationProvider는 UserDetailsService를 활용해서 아이디와 패스워드를 검증한다.SecurityContextHolder안에 SecurityContext에 인증에 성공한 인증 객체(Authentication)를 생성 및 저장한다.SecurityContext는 SecurityContextPersistenceFilter에서 만들어진 SecurityContext를 참조한 것이다.SessionManagementFilter 안의 3가지 과정이다.ConcurrentSession에서 동시적 세션 체크를 하는데, 두 가지 전략이 있다. 하지만, 이 상황에선 첫 로그인이기에 패스한다.session.expireNow로 이전 사용자의 세션을 만료시킨다.SessionAuthenticationException 예외를 발생시켜 인증을 차단한다.SessionFixation (세션 고정 보호)에서 인증에 성공한 시점에서 새롭게 쿠키를 발급한다.SessionInfo를 만들어 저장한다.SecurityContextPersistenceFilter가 최종적으로 Session에 인증 객체(Authentication)를 담은 SecurityContext를 저장한다.SecurityContext를 Clear 해준다.SecurityContextPersistenceFilterloadContext로 Session에서 SecurityContext를 꺼내온다.SecurityContextHolder에서 꺼내 온 SecurityContext를 저장LogoutFilter, UsernamePasswordAuthenticationFilter이 과정에선 패스한다.
ConcurrentSessionFilterisExpired를 통해 확인RememberMeAuthenticationFilter현재 사용자가 세션이 만료되었거나 무효화되어 세션 내부의 인증객체가 비어있을 경우 동작한다.
1. 사용자의 요청 정보(header)에 remember-me cookie값을 확인한다.
2. 없으면 동작하지 않는다.
AnonymousAuthenticationFilter사용자가 인증시 인증객체도 없고 권한 없이 특정 자원에 접근 시도시 동작한다.
(위 과정에선 인증되어있는 상태이기 때문에 패스한다.)
SessionManagementFilterSession에 SecurityContext가 없는 경우나 Session이 없는 동작한다.
(위 과정에선 인증 후 접근이기 때문에 다음 필터로 넘어간다.)
ExceptionTranslationFilterTry-Catch로 다음 필터 동작을 감싸서 FilterSecurityInterceptor 수행 중 일어나는 예외를 받아 동작한다.
FilterSecurityInterceptorAccessDecisionVoter에게 인가 처리를 위임한다.
AuthenticationException이 발생하여 ExceptionTranslationFilter에게 전달한다.AccessDeniedException이 발생하여 ExceptionTranslationFilter에게 전달한다.SecurityContextPersistenceFilter첫 번째 인증 사용자의 로직과 동일하게 수행한다.
LogoutFilter인증 시도이기 때문에 다음 필터로 패스한다.
UsernamePasswordAuthenticationFilterSecurityContextHolder안에 인증 객체(Authentication)가 저장된 SecurityContext를 저장ConcurrentSession에서 정책을 확인한다.SessionAuthenticationException 예외를 발생시켜 인증 처리 실패.session.expireNow로 이전 사용자의 세션을 만료시킨 뒤 자신의 인증객체를 저장한다.이전 사용자 세션 만료 정책일 경우 이후부터는 기존 인증 요청과 동일하게 로직을 수행한다.
ConcurrentSessionFiltersession.isExpired를 통해 현재 세션이 만료되었는지 확인