[Spring] Spring Security 기초

Jiwoo Jung·2025년 1월 10일
0

Spring Security
Authentication & Authorization
Spring Filter
Spring Security Architecture
기타 특징

Spring Security

인증, 권한 부여, 보호 기능을 제공하는 프레임워크.

Spring Security is a framework that provides authentication, authorization, and protection against common attacks.
docs.spring.io

Authentication & Authorization

Authentication is how we verify the identity of who is trying to access a particular resource. docs.spring.io
Authorization is determining who is allowed to access a particular resource. docs.spring.io

Authentication(인증)

리소스에 접근하려는 사용자의 신원을 증명하는 것.

Authorization(권한 부여)

리소스에 대한 사용자의 접근 권한을 확인하는 것.

Popular Authentication TechniquesPopular Authorization Techniques
Password-Based AuthenticationRole-Based Access Controls (RBAC)
Passwordless AuthenticationJSON web token (JWT) Authorization
2FA/MFA (Two-Factor Authentication / Multi-Factor Authentication)SAML Authorization
Single sign-on (SSO)OpenID Authorization
Social authenticationOAuth 2.0 Authorization

geeksforgeeks.org


Spring Filter

Spring Security’s Servlet support is based on Servlet Filters docs.spring.io

Servlet

Java 기반의 웹 애플리케이션에서 클라이언트의 요청을 처리하고, 그에 대한 응답을 생성하는 서버 측 프로그램.
스프링 MVC에서 Servlet이란 DispatcherServlet의 인스턴스.

Servlet Filter

Servlet 요청 및 응답을 가로채고 처리하는 기능을 한다.
요청이 서블릿에 도달하기 전에, 또는 서블릿에서 응답이 클라이언트로 전달되기 전에 특정 로직을 실행한다.

Filter vs Interceptor

FilterInterceptor
DispatcherServlet 전/후 로직 처리Dispatcher Servlet이 Controller를 호출하기 전/후에
웹 컨테이너(Web Container)가 관리스프링 컨테이너(Spring Container)가 관리
스프링 외부 기술스프링 내부 기술

mangkyu.tistory.com


Spring Security 아키텍처

FilterChain

클라이언트가 애플리케이션에서 요청을 받으면 웹 컨테이너는 FilterChain를 생성한다.
FilterChain여러개의 Filter와 단일 Servlet 인스턴스로 구성된다. 필터의 순서는 보안 로직 처리에 영향을 미치므로 매우 중요하다.

DelegatingFilterProxy

Spring provides a Filter implementation named DelegatingFilterProxy that allows bridging between the Servlet container’s lifecycle and Spring’s ApplicationContext. docs.spring.io

스프링은 Filter의 구현체인 DelegatingFilterProxy를 제공한다. 이는 Servlet Container와 Spring의 IOC Container를 연결해주는 다리 역할을 하는 필터이다.
Servlet Container는 Spring Bean을 직접 사용할 수 없으므로, DelegatingFilterProxy가 Spring Bean에게 작업을 위임한다.
즉, DelegatingFilterProxy는 보안 작업을 수행하지 않고, Spring 컨테이너에 작업을 위임하는 역할만 하는 Servlet Filter이다.

FilterChainProxy

Spring Security에서 제공하는 특별한 Filter로, 이를 통해 여러 Filter 인스턴스를 SecurityFilterChain을 통해 관리할 수 있다.
DelegatingFilterProxy로 감싸져 있으며, 요청을 적합한 SecurityFilterChain으로 위임한다.
SecurityFilterChain의 URL 패턴이 겹칠 경우, 가장 먼저 매칭되는 필터 체인만 호출된다.

SecurityFilterChain

  • SecurityFilterChainFilterChainProxy가 현재 요청에 대해 호출해야 할 Spring Security Filter 인스턴스를 결정하는 데 사용된다.
  • SecurityFilterChain 내부의 Security Filter들은 일반적으로 Bean이지만, DelegatingFilterProxy가 아닌 FilterChainProxy에 등록된다. FilterChainProxy를 사용하는 것은 직접 Servlet 컨테이너나 DelegatingFilterProxy에 등록하는 것과 비교하여 다음과 같은 여러 가지 이점을 제공한다.
    1. Spring Security Servlet 지원의 시작점 제공
    2. 중앙 집중화된 필터 관리
    3. 유연한 필터 체인 호출 조건
  • 여러개의 SecurityFilterChain 인스턴스

    URL과 매치되는 첫번째 SecurityFilterChain만 호출된다. 따라서, 필터 체인의 선언 순서가 매우 중요하다.
    SecurityFilterChain은 독립적이며, 여러개 또는 0개의 Filter 인스턴스를 가질 수 있다. (0개의 경우 특정 요청을 무시할 때 사용된다.)

Security Filters

Security Filter는 SecurityFilterChain API와 함께 FilterChainProxy에 삽입된다. Security Filter는 일반적으로 HttpSecurity 인스턴스를 이용하여 선언된다.

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .csrf(Customizer.withDefaults())
            .httpBasic(Customizer.withDefaults())
            .formLogin(Customizer.withDefaults())
            .authorizeHttpRequests(authorize -> authorize
                .anyRequest().authenticated()
            );

        return http.build();
    }

}

위의 Configuration은 다음과 같은 순서의 Filter를 설정한다.
CsrfFilter(.csrf) > UsernamePasswordAuthenticationFilter(.formLogin) > BasicAuthenticationFilter(.httpBasic) > AuthorizationFilter(.authorizeHttpRequests)
이렇게 특정 순서로 수행되며, 순서는 github에서 확인할 수 있다.

기타 특징

  1. Spring MVC와 독립적인 관리
    REST API에서 JWT 또는 OAuth 2.0을 활용해 스프링 MVC와 독립적으로 동작.

  2. Java Config 기반 설정
    @EnableWebSecurity를 통해 보안 설정을 활성화.
    주로 SecurityFilterChainAuthenticationManager를 활용.

  3. 어노테이션 지원
    Spring Security 3.2 이후로 XML 설정 없이 어노테이션으로 간단히 설정 가능.
    @PreAuthorize, @PostAuthorize

  4. 기본 인증 방식

    • 기본적으로 세션과 쿠키 기반 인증.
    • REST API에서는 토큰 기반 인증 방식(OAuth 2.0, JWT) 권장.

참고자료

velog.io/@eileen0379
docs.spring.io

0개의 댓글