공식 문서를 보고 매우 간추려 요약하였다.
부족한 영어실력으로 틀린부분이 있을 수도 있다.
왼쪽은 서블릿필터, 왼쪽은 Spring 필터 내의 SecurityFilterChain
DelegatingFilterProxy 는 서블릿 필터에 있고 실행되면 알맞은 SecurityFilterChain을 선정하여 실행시켜준다.
이런식으로 url에 따라 적절한 SecurityFilterChain에 매칭시켜준다.
SecurityFilterChain안에는 여러개의 Security Filters들이 들어있다.
꼭 순서를 알아야 할 필요는 없지만 다음과 같은 순서로 실행된다고 한다.
https://docs.spring.io/spring-security/reference/servlet/architecture.html#servlet-security-filters
1. ExceptionTranslationFilter
가 FilterChain.doFilter(request, response)
를 실행시키고,
2. 만약 if (인증이 되지않았거나, AuthenticationException
이 발생)했으면, Start Authentication을 한다.
세부사항은 나중에 Authentication에서 다루겠지만, 간단히 말하면,
- SecurityContextHolder
라는 저장소(정확한 표현아님)가 지워지고
- 캐시하고
- AuthenticationEntryPoint
는 쉽게 말하면, 클라이언트한테 Authentication이 필요하다 이런 응답을 보내는 역할을 한다.
AccessDeniedHandler
에게 보내서 접근을 거부한다.대략적인 개요
try {
filterChain.doFilter(request, response);
} catch (AccessDeniedException | AuthenticationException ex) {
if (!authenticated || ex instanceof AuthenticationException) {
startAuthentication();
} else {
accessDenied();
}
}
이해를 돕기 위해 id/pw 방식의 로그인 과정을 그린 도식도를 가져왔다.
보면 알겠지만, 클라이언트가 /private 로 요청을 보내자 AccessDeniedException
을 발생시켜서 ExceptionTranslationFilter
가 발동되고
위의 과정대로
filterChain.doFilter(request, response)
그리고 인증되지 않은 유저라고 판단되었기 때문에
Authentication 과정을 실행하고
결과적으로 AuthenticationEntryPoint
를 통해 클라이언트에게 로그인 하라는 응답을 보내게 된다.