본문 바로가기
기술 단어장/Backend

[SpringBoot] Security 6.x 구성 알아보기

by MFDO 2024. 8. 13.

 

 

 

Spring Security가 6 버전으로 변경되며

어떤 변경점이 있는지 알아보는 김에

전체적인 초기화 구성에 대해서 정리하고 넘어가는 시간을 가졌다.

 

기존 Servlet을 활용한 처리 개념이 있다면

이해에 많은 도움이 될 것이다.

 

 

Servlet Applications의 Architecture 관련 설명

 

Architecture :: Spring Security

The Security Filters are inserted into the FilterChainProxy with the SecurityFilterChain API. Those filters can be used for a number of different purposes, like authentication, authorization, exploit protection, and more. The filters are executed in a spec

docs.spring.io

 

 


 

| Security 구성

 - SecurityBuilde

  > 역할 : 웹 보안 구성 빈 객체 및 설정 클래스들을 생성

  > 종류 : WebSecurity, HttpSecurity

 

 - SecurityConfigurer

  > 역할 : http 요청 관련 보안 처리 필터 생성, 초기화 설정

  > 목적 : 인증/인가/초기화 작업 진행

 

 - 연계 작업 및 구성

  > Security Builder는 Security Configurer를 참조함

 

 * 동작원리 

 


 

 

|  Security Builder & Configurer

 1) AutoConfiguration에서 build()를 통해 빌더 클래스 생성

 2) SecurityBuilder가 설정클래스 즉 SecurityConfigurer 생성

 3) SecurityConfigurer에는 init, configure 메서드가 존재함

  > 이 둘은 매개변수로 Builder 클래스를 받음

  > 이 과정으로 초기화 및 필터 생성이 진행됨

 

 

 

|   HttpSecurity

 - 생성 및 초기화 : HttpSecurityConfiguration에서 이루어짐

 - 역할

  > 보안에 필요한 각 설정 클래스 및 필터 생성

  > 최종적으로 SecurityFilterChain Bean 생성

 

 - 생성 과정

 1) HttpSecurityConfiguration가 초기화 시 실행됨

 2) HttpSecurityConfiguration는 HttpSecurity Bean을 생성함

 2-1) HttpSecurity 내부에서 여러 설정 클래스 들을 생성

   > CsrfConfigurer, LogoutConfigurer ...

 2-2) 이후 build()가 호출이 되면

   > 각 클래스 내부에 존재하는 init(), configurer()이 호출되며

   > 각 객체에 관련된 객체 및 필터들이 생성됨

 3) 이 필터들이 SecurityFilterChain라는 빈이 생성되며 저장

 

 


 

 

|   SecurityFilterChain

  - SecurityFilterChain : 인터페이스

  > List<Filter> getFilters()

  > boolean matches(HttpServletRequest)

이곳에서 matches는 현 요청이 SecurityFilterChain에 의해 처리되어야 하는지 여부를 결정한다.
true인 경우에만 해당 필터 체인을 이용한다는 의미를 가진다.

이를 통해 특정 요청에 대한 적절한 보안 필터링을 적용한다.

 

 - DefaultSecurityFilterChain

  > List<Filter> getFilters()

  > String toString()

  > RequestMatcher getRequestMatcher()

  > boolean matches(HttpServletRequest)

getFilters는 현재 SecurityFilterChain에 포함된 Filter 객체 리스트를 반환한다. 이를 통해 어떤 필터가 현 필터 체인에 포함되는지 알 수 있으며, 각 필터는 요청 처리 과정에서 특정 작업*을 수행함.
 
* 작업? : 인증, 권한 부여, 로깅 등

 

 


 

 

|    WebSecurity

 

 - 생성 및 초기화 : HttpSecurityConfiguration에서 이루어짐

 - 역할

  > HttpSecurity에서 생성한 SecurityFilterChain빈을 SecurityBuilder에 저장

  > build 이후 SecurityBuilder에서 SecurityFilterChain을 꺼냄

  > 꺼내진 FilterChain을 FilterChainProxy 생성자에게 전달

 

 


 

 

|  HttpSecurity와 WebSecurity의 연관 관계

 

 - WebSecurity 역할

 : 전반적인 필터 체인 관리를 담당하며, 특정 경로를 필터링에서 제외

 

 - HttpSecurity 역할

 : 각 요청 경로에 맞는 보안 필터를 구성하여 SecurityFilterChain 구성

 

 - SecurityFilterChain

 : FilterChainProxy에 의해 관리되며, 들어오는 HTTP 요청이 올바른
  필터 체인으로 처리되도록 함

 

 - WebSecurity 설정이 우선적으로 적용된 후,

 - HttpSecurity가 구성한 필터들이 SecurityFilterChain을 통해 실행됨

 

 

 


 

 

 

|   Filter

 - SevletFilter

   > 역할 : 클라이언트 요청 및 서버 응답 가공/검사 시의 구성 요소

   > 동작 시점 : 클라이언트 요청이의 서블릿 도달 이전, 응답 반환 시

   > 생성/실행/종료 지점 : Sevlet Container(WAS)

 

 - init/destroy는 생성 종료 시 한 번만 수행

 - doFilter는 요청에 대해 계속적인 처리 진행

 

 

 


 

 

 

|    Filter : DelegatingFilterProxy

 : 서블릿 컨테이너와 스프링 애플리케이션 컨텍스트 간의 연결고리 역할

 

 - 역할 및 구조

   > 서블릿 필터 기능 수행

   > 동시에 스프링 의존성 주입 및 빈 관리 기능과 연동되도록 설계됨

   > springSecurityFilterChain이름의 빈을 ApplicationContext에서 찾아 요청을 위임

 

 - 주의

  > 스프링에서만 이용되는 서블릿 필터

  > 실제 보안 처리를 수행하지 않음

 

 - 존재의의

  > 본래 Filter에는 DI/AOP 같은 Spring의 기능 적용이 불가함

  > 이러한 기능을 가지고 요청 및 처리가 가능하기 위해 만들어짐

 

 - springSecurityFilterChain은 누군데요?

  > 그게 바로 FilterChainProxy

 

 


 

 

|   Filter : FilterChainProxy

 : DelegatingFilterProxy로부터 요청을 위임받고 보안 처리 역할을 함

 

 - 특징

  > springSecurityFilterChain이름의 빈으로 생성됨

  > 내부에 하나 이상 SecurityFilterChain 객체를 지님

  > URL 정보 기준 적절 SecurityFilterChain을 선택해 필터 호출

  > HttpSecurity를 통한 API 추가 시 관련 필터가 추가됨

  > 요청에 대해 필터 순대로 호출하여 보안 기능 동작

  > 필요 시 직접 필터를 생성해 기존 필터 전/후 추가 가능

 


 

요약지

 

SpringSecurityInitialization.pdf

 

drive.google.com

 

댓글