Spring Security 내부 구조

이상억·2025년 2월 18일

Spring

목록 보기
1/2


1. WAS 필터 단계 – DelegatingFilterProxy

DelegatingFilterProxy 역할

  • WAS(Web Application Server)에 등록된 서블릿 필터로, 클라이언트의 요청을 애플리케이션 진입 시점에서 가장 먼저 가로 챔.

  • 주요 기능: 실제 보안 처리는 스프링 컨테이너 내부에 정의된 빈(보통 springSecurityFilterChain 이름)을 위임하여 수행.

  • 자동 구성: 스프링 시큐리티 의존성을 추가하면, 스프링 부트의 자동 구성 기능 또는 수동 설정을 통해 자동으로 등록.


2. 스프링 컨테이너와 FilterChainProxy

a. FilterChainProxy

역할

  • DelegatingFilterProxy로부터 요청을 전달받아 내부에 등록된 여러 보안 필터 체인(SecurityFilterChain) 중 하나를 선택하여 실행.

동작 방식

  • 여러 SecurityFilterChain 존재: 애플리케이션에 여러 보안 설정(예: /admin/** 등) 을 적용할 수 있으며, 요청 URL 및 조건에 따라 가장 먼저 매칭되는 SecurityFilterChain을 선택.
  • 순차 실행: 선택된 SecurityFilterChain에 등록된 필터들을 순서대로 실행.

b. SecurityFilterChain

구성

  • 여러 보안 필터(예: 인증, 인가, CSRF 방어, 세션 관리, 로그인/로그아웃 처리 등)가 하나의 체인으로 묶여 있음.

설정 방법

  • 주로 HttpSecurity 객체를 사용하여 구성하며, 개발자가 세밀하게 설정할 수 있음.
  • 예시: /admin/ 경로에는 관리자 전용 보안 체인을, /user/ 경로에는 일반 사용자 체인을 적용하는 식으로 URL별 맞춤 구성이 가능.

필터 종류

  • 인증 필터: 로그인 요청을 처리하고, 사용자의 자격 증명을 검증.
  • 인가 필터: 사용자의 역할과 권한을 확인하여 접근 제어를 수행.
  • CSRF 방어 필터: CSRF 공격을 방지하기 위해 토큰 검증을 수행.
  • 기타: 세션 관리, Remember-me 기능 등 추가적인 보안 기능을 제공하는 필터들이 포함.

3. 보안 정보 저장과 관리

스프링 시큐리티는 인증된 사용자와 그 권한 정보를 효과적으로 관리하기 위해 SecurityContextHolder와 Authentication 객체를 사용.

a. SecurityContextHolder

역할

  • 현재 요청 또는 사용자의 보안 정보를 저장하는 컨테이너 역할 수행.
  • 어디서든 쉽게 접근하여 현재 사용자의 인증 정보를 확인 가능.

구현 방식

  • 기본적으로 ThreadLocal 방식을 사용하여, 각 요청마다 별도의 보안 정보를 유지.
  • 멀티스레드 환경 고려: 요청이 별도의 스레드에서 처리되어도 보안 정보가 올바르게 분리되어 저장.

b. Authentication

역할

  • 사용자의 인증(로그인) 정보를 담는 객체.
  • Authentication 객체는 SecurityContext에 포함되어 관리되며 SecurityContext는 0개 이상 존재할 수 있다. 그리고 이 N개의 SecurityContext는 하나의 SecurityContextHolder에 의해서 관리

구성 요소

  • Principal: 사용자의 기본 정보(예: 사용자 이름, 상세 정보 등).
  • Credentials: 비밀번호, 인증 토큰 등 실제 인증을 위해 사용되는 자료.
  • Authorities: 사용자의 역할과 권한 목록 (예: ROLE_ADMIN, ROLE_USER 등).

활용 방법

  • 인증 성공 후: 인증 처리 필터(예: UsernamePasswordAuthenticationFilter)는 로그인 성공 시 Authentication 객체를 생성하여 SecurityContextHolder에 저장.
  • 애플리케이션 전반: 이후 다른 필터나 서비스, 컨트롤러 등에서 SecurityContextHolder.getContext().getAuthentication()을 통해 현재 사용자의 정보를 쉽게 조회할 수 있음.
  • 인증 정보 활용: 접근 제어나 권한 체크를 위해 스프링 시큐리티는 이 Authentication 객체에 저장된 Authorities 정보를 사용.

c. SecurityContext의 생명 주기

  • Authentication 객체를 관리하는 SecurityContext는 사용자의 요청이 서버로 들어오면 생성되고, 처리가 끝난 후 응답되는 순간에 초기화 됨
profile
이상억

0개의 댓글