SecurityConfig
클래스로 HttpSecurity
에서 Filter를 생성하여 WebSecurity
에 전달한다.WebSecurity
는 FilterChainProxy
객체에 Bean 객체를 생성하여 생성자로 자신이 가지고 있는 Filter 목록을 전달한다.DelegatingFilterProxy
는 springSecurityFilterChain
라는 이름의 Bean을 가진 Bean Class를 찾는데 그게 FilterChainProxy
에게 전달하여 요청을 위임한다.SecurityContextPersistenceFilter
DelegatingFilterProxy
에서 FilterChainProxy
에게 인증 요청 위임SecurityContextPersistanceFilter
에서 loadContext 함수를 호출해 SecurityContext
가 있는지 확인한다.HttpSessionSecurityContextRepository
클래스가 있고, SecurityContext
의 생성, 저장, 조회, 참조를 하는 클래스SecurityContext
를 저장해서 SecurityContextHolder
에 저장한 뒤 다음 필터로 이동한다.LogoutFilter
UsernamePasswordAuthenticationFilter
Authentication
)을 만든다.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 해준다.SecurityContextPersistenceFilter
loadContext
로 Session에서 SecurityContext
를 꺼내온다.SecurityContextHolder
에서 꺼내 온 SecurityContext
를 저장LogoutFilter
, UsernamePasswordAuthenticationFilter
이 과정에선 패스한다.
ConcurrentSessionFilter
isExpired
를 통해 확인RememberMeAuthenticationFilter
현재 사용자가 세션이 만료되었거나 무효화되어 세션 내부의 인증객체가 비어있을 경우 동작한다.
1. 사용자의 요청 정보(header)에 remember-me cookie
값을 확인한다.
2. 없으면 동작하지 않는다.
AnonymousAuthenticationFilter
사용자가 인증시 인증객체도 없고 권한 없이 특정 자원에 접근 시도시 동작한다.
(위 과정에선 인증되어있는 상태이기 때문에 패스한다.)
SessionManagementFilter
Session에 SecurityContext
가 없는 경우나 Session이 없는 동작한다.
(위 과정에선 인증 후 접근이기 때문에 다음 필터로 넘어간다.)
ExceptionTranslationFilter
Try-Catch로 다음 필터 동작을 감싸서 FilterSecurityInterceptor
수행 중 일어나는 예외를 받아 동작한다.
FilterSecurityInterceptor
AccessDecisionVoter
에게 인가 처리를 위임한다.
AuthenticationException
이 발생하여 ExceptionTranslationFilter
에게 전달한다.AccessDeniedException
이 발생하여 ExceptionTranslationFilter
에게 전달한다.SecurityContextPersistenceFilter
첫 번째 인증 사용자의 로직과 동일하게 수행한다.
LogoutFilter
인증 시도이기 때문에 다음 필터로 패스한다.
UsernamePasswordAuthenticationFilter
SecurityContextHolder
안에 인증 객체(Authentication
)가 저장된 SecurityContext
를 저장ConcurrentSession
에서 정책을 확인한다.SessionAuthenticationException
예외를 발생시켜 인증 처리 실패.session.expireNow
로 이전 사용자의 세션을 만료시킨 뒤 자신의 인증객체를 저장한다.이전 사용자 세션 만료 정책일 경우 이후부터는 기존 인증 요청과 동일하게 로직을 수행한다.
ConcurrentSessionFilter
session.isExpired
를 통해 현재 세션이 만료되었는지 확인