[SpringSecurity] 전체적인 아키텍쳐 구조

유알·2022년 12월 20일
0

[SpringSecurity]

목록 보기
4/15
post-thumbnail

공식 문서를 보고 매우 간추려 요약하였다.
부족한 영어실력으로 틀린부분이 있을 수도 있다.

사전 지식

  • 서블릿 필터와 스프링 필터는 서로 다른 필터이다.

DelegatingFilterProxy


왼쪽은 서블릿필터, 왼쪽은 Spring 필터 내의 SecurityFilterChain
DelegatingFilterProxy 는 서블릿 필터에 있고 실행되면 알맞은 SecurityFilterChain을 선정하여 실행시켜준다.

이런식으로 url에 따라 적절한 SecurityFilterChain에 매칭시켜준다.

SecurityFilterChain

SecurityFilterChain안에는 여러개의 Security Filters들이 들어있다.
꼭 순서를 알아야 할 필요는 없지만 다음과 같은 순서로 실행된다고 한다.
https://docs.spring.io/spring-security/reference/servlet/architecture.html#servlet-security-filters

SecurityException


1. ExceptionTranslationFilterFilterChain.doFilter(request, response)를 실행시키고,
2. 만약 if (인증이 되지않았거나, AuthenticationException 이 발생)했으면, Start Authentication을 한다.
세부사항은 나중에 Authentication에서 다루겠지만, 간단히 말하면,
- SecurityContextHolder라는 저장소(정확한 표현아님)가 지워지고
- 캐시하고
- AuthenticationEntryPoint는 쉽게 말하면, 클라이언트한테 Authentication이 필요하다 이런 응답을 보내는 역할을 한다.

  1. 그게 아니라면(else) 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를 통해 클라이언트에게 로그인 하라는 응답을 보내게 된다.

profile
더 좋은 구조를 고민하는 개발자 입니다

0개의 댓글