WebSecurity / HttpSecurity 그리고 SecurityFilterChain

정민교·2024년 7월 11일
0

spring security

목록 보기
3/13
post-thumbnail

📒참고

본 Spring Security 시리즈 내용은 인프런 정수원님의 강의 내용을 정리한 시리즈입니다.

상업적 이용 목적의 포스팅 무단 복제 및 사용을 금합니다.

강의 주소: https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0-%EC%99%84%EC%A0%84%EC%A0%95%EB%B3%B5#

📒HttpSecurity

HttpSecurity는 인증/인가와 관련된 모든 설정을 할 수 있기 때문에 spring security 전반에 걸쳐 매우 중요한 클래스다.

HttpSecurityConfiguration에서 HttpSecurity를 생성하고 HttpSecurity는 보안에 필요한 SecurityConfigurer(CsrfConfigurer... 등) 객체들을 LinkedHashMap 타입의 필드로 저장한다.

저장된 SecurityConfigurer 객체들을 초기화 및 기본 설정을 진행하여 Filter들을 생성한다. 그리고 최종적으로 SecurityFilterChain(DefaultSecurityFilterChain) 객체를 생성한다.

빈으로 등록되는 곳은 HttpSecuritybuild 메소드를 호출하는 SecurityFilterChainConfiguration 클래스의 defaultSecurityFilterChain 빈 생성 메소드다.

✔️SecurityFilterChain

SecurityFilterChain은 인터페이스다.

getFiltersmatches라는 메소드 두 개가 선언되어 있다.

boolean matches(HttpServletRequest request)

요청이 현재 SecurityFilterChain에 의해 처리되어야 하는지 여부를 결정한다.

  • SecurityFilterChain 빈은 여러 개가 될 수 있다. 따라서 지금 요청이 현재 SecurityFilterChain에 의해 처리되어야 하는지를 판단해야 한다.

List<Filter> getFilters()

현재 SecurityFilterChain에 포함된 Filter 리스트를 반환한다.

  • 현재 필터 체인에 어떤 필터들이 있는지 확인할 수 있고, 각 필터는 요청 처리 과정에서 특정 작업(인증, 인가, 로깅 등)을 수행한다.

📌간단 개요

DefaultSecurityFilterChainSecurityFilterChain의 구현체로 자동 설정에 의해 생성되는 SecurityFilterChain이다.

SecurifyFilterChain 구현체는 RequestMatcher 타입 필드와, List<Filter> 타입의 필드를 가지고 있다.

현재 요청이 현재 SecurityFilterChainRequestMatcher와 비교하여 매치가 되면 이 요청은 현재 SecurityFilterChain이 보안 처리를 담당한다.

📒WebSecurity

WebSecurityConfiguration 클래스에서 WebSecurity 객체를 생성하고 초기화를 진행한다.

WebSecurityHttpSecurity에서 생성한 SecurityFilterChain 빈을 SecurityBuilder에 저장한다.

WebSecuritybuild 메소드는 FilterChainProxy 객체를 생성하고 FilterChainProxy 객체는 SecurityBuilder에 들어있는 SecurityFilterChain들을 가지게 된다.

📒전반적인 흐름

다시 저번처럼 spring security의 자동 설정에 의한 보안 적용 흐름을 살펴보겠다.

✔️HttpSecurityConfiguration

HttpSecurityConfiguration 클래스에서 HttpSecurity 객체를 생성하고, HttpSecurity는 각 보안 요소를 처리해야 하는 각 SecurityConfigurer들을 생성해서 들고있는다.

그리고 이 HttpSecurity 빈을 등록한다.

✔️SpringBootWebSecurityConfiguration

SpringBootWebSecurityConfiguration 클래스에서는 HttpSecurity 빈을 주입받고, 추가적인 SecurityConfigurer들을 생성한 후 build 메소드를 수행한다.

build 메소드를 수행하면 SecurityFilterChain의 구현체인 DefaultSecurityFilterChain 객체를 생성하게 되고 이 객체를 빈으로 등록하게 된다.

performBuild 메소드

HttpSecuritybuild 메소드는 최종적으로 performBuild 메소드를 호출한다.

performBuild 메소드를 보면 결과적으로 DefaultSecurityFilterChain 객체를 생성하는데, 생성자에 전달하는 인수를 보면 this.requestMatcher가 있다.

여기서 this.requestMatcherAnyRequestMatcher다. 즉, 모든 요청에 대해 이 FilterChain(DefaultSecurityFilterChain)을 통해 보안을 적용하겠다는 의미가 된다.

✔️WebSecurityConfiguration

그럼 이제 WebSecurityHttpSecurity가 생성한 SecurityFilterChain을 어떻게 사용하는지를 알아보겠다.

우선 WebSecurityConfiguration에서 WebSecurity를 생성한다. HttpsSecurity를 주입받아야 하기 때문에 HttpSecurityConfiguration이 먼저 실행된다.

setter 주입을 통해 HttpSecurity가 생성한 DefaultSecurityFilterChain을 주입받아서 this.securityFilterChains 필드에 세팅하고 있다.

여기서 보면 SecurityFilterChain 목록들을 살펴보며

WebSecurity의 securityFilterChainBuilders 필드에 하나씩 추가한다. 근데 지금은 spring security 자동 설정에 의해 생성된 DefaultSecurityFilterChain 하나 밖에 없기 때문에 securityFilterChainBuilders에 하나만 추가된다.

그리고 springSecurityFilterChain 메소드가 실행되어 WebSecuritybuild 메소드가 실행된다.

WebSecurity.build 메소드

build 메소드는 최종적으로 performBuild 메소드를 호출한다. 앞서 살펴본 HttpSecurityperformBuild 메소드가 아닌 WebSecurityperformBuild 메소드다.

performBuild 메소드에서 FilterChainProxy 객체를 생성하며, SecurityFilterChain들을 리스트에 담아 FilterChainProxy 객체를 생성할 때 생성자의 인수로 넘겨준다.

그리고 FilterChainProxy를 return하여 빈을 등록한다.

profile
백엔드 개발자

0개의 댓글