이전 글에서, DelegatingFilterProxy 내에는 Bean이 존재하며 이 bean을 FilterChainProxy라고 한다는 것을 알 수 있엇다. 이번 글에선 Bean 내부에서 실행되는 security filter에 대해 자세히 알아보고자 한다.

SecurityFilterChain 내부 Filter의 순서

공식 문서에 따르면 다음과 같은 순서로 필터가 작동한다. 필터에 대해 자세히 설명하기 전에, 각 필터의 대략적인 역할은 다음과 같다.

  1. CsrfFilter : Csrf에 대한 기본적인 보호기능을 제공한다. Spring Security는 기본적인 CSRF 공격은 알아서 보호 하므로 추가 코드가 필요하지 않지만, 명시적으로 코드를 추가 할 수 있다.

2.UsernamePasswordAuthenticationFilter: 폼 로그인 시 사용된다. username와 password를 확인하고 토큰 및 세션을 생성,관리한다.

3.Basic AuthenticationFilter:헤더에 Authenticate를 추가해 인증을 위해 필요한 파라미터를 요구한다. jwtToken을 헤더에 담아서 사용할 때와 크게 다르지 않다고 생각하면 된다. _http stateless_와 _SecurityContextHolder_에 대한 추가적인 설명이 필요해 보이지만, 다음 글에서 정리하도록 하겠다.

4.AuthorizaionFilter: 페이지에 대한 접근 권한 설정을 담당한다. 이 필터 또한 SecurityContextHolder로 부터 정보를 가져온다.

필터를 추가하는 방법

공식문서에서 제공하는 예시이다. AuthorizaitionFilter가 실행되기 전에 따로 만들어 둔 TenatFilter가 실행 될 수 있도록 한다.

필터의 경우 다음과 같이 구성할 수 있다. 해당 필터의 경우 헤더에 존재하는 id값을 확인하여 가진 권한을 확인해 권한을 가지고 있으면 다음 필터로 넘어가도록 한다.

헤더 값은 어떻게 유지 되는가?

앞선 예시에서 우리는 헤더값을 통해 유저의 로그인 정보를 확인했다. 하지만** http 통신은 stateless 할 텐데 어떻게 헤더 값을 통해 정보를 매번 확인 할 수 있을 까?** 이를 이해하기 위해선 SecurityContextHolder를 알 필요가 있으며, 이를 위해 다음 글에서 SecurityContextHolder와 Authentication에 대해 설명하도록 하겠다.