SpringSecurity 6.0 초기화 과정 이해

jkky98·2025년 1월 3일
0

SpringSecurity

목록 보기
1/2

Spring Security 설정

spring boot starter에서 의존성으로 Spring Security를 추가하면 시큐리티 의존성이 자동 적용된다.

이때 디폴트로 설정되는 것들과 스프링 시큐리티 초기화과정에서 일어나는 현상을 이해하고자 한다.

기본 보안 작동

시큐리티 의존성을 가진 서버를 처음 띄우면 스프링 시큐리티의 초기화 작업 및 기본 보안 설정이 이루어진다.

별도의 설정작업이나 코드를 작성하지 않아도 작동하는 것들이 존재한다.

  1. 기본적으로 모든 요청에 대해 인가를 진행하고 인증승인이 되어야 자원 접근이 가능하다.(모든 엔드포인트에 대해 로그인 검증 필터링이 디폴트로 들어간다고 보면 된다.)
  2. 인증 방식은 form, httpBasic 로그인 방식을 제공한다.
  3. /login 엔드포인트의 로그인 페이지가 자동적으로 생성되어 랜더링 된다.
  4. 초기 인증승인을 위해 한 개의 계정이 기본적으로 제공된다.

아래는 homeController("/")만 설정하고 기본경로로 접근했을때 곧바로 login페이지로 리다이렉트 하여 login페이지를 보이고 있는 모습이다.

아래는 초기 인증승인을 위해 한 개의 계정이 기본적으로 제공되는데 이때 패스워드를 서버 실행마다 랜덤한 값으로 주는 모습니다.

AutoConfiguration 시점

시큐리티 의존성을 가질 경우 SpringBoot AutoConfiguration시점에 기본적인 SecurityBuilder를 생성한다.

HttpSecurity

SecurityBuilderHttpSecurity를 통해SecurityConfigurer를 이용하여 초기화 및 설정 작업을 진행한다.

그 결과 검증에 필요한 필터들이 생성된다.

HttpSecurity는 Spring 컨텍스트에서 관리되는 빈이 아니며, 요청 경로별 보안 설정을 독립적으로 처리하기 위해 매번 새로운 객체로 생성된다. 이를 통해 SecurityConfigurer를 사용하여 초기화 및 설정 작업을 진행하고, 최종적으로 SecurityFilterChain을 생성한다. 생성된 SecurityFilterChain만이 Spring 컨텍스트에 싱글톤 빈으로 등록되며, HttpSecurity는 이를 위한 임시 객체로 사용된다.

SecurityFilterChain

HttpSecurity는 모든 초기화 및 설정을 진행하고 검증 필터들을 지닌SecurityFilterChain라는 빈을 생성한다.

HttpSecurity의 최종 목적은 SecurityFilterChain를 생성하는 것이 최종 목적이다.

HttpSecurity는 많은 설정클래스들을 생성해서 이로 하여금 해당 설정클래스를 통해 만든 필터들이 SecurityFilterChain안에 저장된다.

WebSecurity

WebSecurity는 Spring Security의 전역 보안 설정을 담당하는 클래스이다.

WebSecurity는 생성된 SecurityFilterChain를 SecurityBuilder에 저장한다.

그 후 WebSecurity의 build()를 진행하면 SecurityFilterChain를 시큐리티 빌더에서 꺼내어 FilterChainProxy에 전달한다.

FilterChainProxy는 HTTP 요청을 처리하기 위한 Spring Security의 핵심 필터다. FilterChainProxy는 들어오는 HTTP 요청을 적절한 SecurityFilterChain에 매핑하여 요청을 처리한다.

DelegatingFilterProxy

기본적으로 필터 체인은 서블릿 컨테이너에서 초기화된다. 하지만 스프링 시큐리티에서는DelegatingFilterProxy에 의해 필터체인의 초기화 및 관리가 스프링에서 이루어진다.

DelegatingFilterProxy는 HTTP 요청이 들어올때 필터체인이 실행되는 과정에서 실행되는데 이때 후에 실행될 필터들(서블릿에서 관리되던, 후에 실행될 필터들을 FilterChainProxy라고 보면 되고 FilterChainProxy가 스프링에서 관리된다는 것이다.)을 스프링Context로 위임한다.

정확하게 해석하자면, 본래 필터는 스프링으로 가기전의 Request를 처리하고 처리가 다 끝나면(필터들이 동작을 다 수행하면) 스프링으로 Request가 넘어가는 것이지만, DelegatingFilterProxy에 의해 필터작업들이 스프링으로 넘어가서 실행되는 것이다.

필터 로직은 서블릿단에서의 행동이다. 그리고 필터 로직의 목적은 스프링단으로 가기 이전의 가공단계같은 것이지만 실제로는 필터 로직(서블릿단의 행동)이 끝나지 않았지만 스프링단 환경에서 수행되는 것이다. 이말은 서블릿단의 행동인 필터 로직이 스프링에 종속적이 된다는 것으로 해석된다.

이러한 "위임" 처리는 Spring의 강력한 기능들을 활용하기 위함이다. 예를 들어, Spring의 DI(Dependency Injection)를 통해 필터 로직에서 인증 서비스나 사용자 정보 서비스를 주입받아 사용할 수 있으며, 보안 설정을 HttpSecurity로 유연하게 구성하거나 Spring AOP를 통해 메서드 단위의 권한 검사를 손쉽게 구현할 수 있다. 또한, Spring의 트랜잭션 관리 기능을 사용하여 보안 로직과 데이터 작업을 하나의 트랜잭션으로 처리할 수 있고, 커스터마이징 가능한 구조로 필터 체인을 확장하거나 커스텀 필터를 추가할 수 있어 강력하고 유연한 보안 처리가 가능하다.

위에서 사용했던 문장이다.

HttpSecurity는 모든 초기화 및 설정을 진행하고 검증 필터들을 지닌SecurityFilterChain라는 빈을 생성한다.

사실 필터들은 라이프사이클 자체가 빈으로 등록될 수 없기에 "빈을 생성한다"라는 말이 어울릴 수 없었는데 위임처리 필터 프록시를 통해 이를 이해할 수 있게 되었다.

정리

Spring Security에서 SecurityBuilder는 애플리케이션이 시작될 때 Spring 컨텍스트와 함께 초기화되며, 이 빌더를 통해 생성된 FilterChainProxy는 최종적으로 Spring 컨텍스트에 싱글톤 빈으로 등록된다. 요청이 들어올 때마다 FilterChainProxy가 요청을 처리하며, 적절한 SecurityFilterChain을 선택해 실행한다.

profile
자바집사의 거북이 수련법

0개의 댓글