Spring Security
Authentication & Authorization
Spring Filter
Spring Security Architecture
기타 특징
인증, 권한 부여, 보호 기능을 제공하는 프레임워크.
Spring Security is a framework that provides authentication, authorization, and protection against common attacks.
docs.spring.io
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
리소스에 접근하려는 사용자의 신원을 증명하는 것.
리소스에 대한 사용자의 접근 권한을 확인하는 것.
Popular Authentication Techniques | Popular Authorization Techniques |
---|---|
Password-Based Authentication | Role-Based Access Controls (RBAC) |
Passwordless Authentication | JSON web token (JWT) Authorization |
2FA/MFA (Two-Factor Authentication / Multi-Factor Authentication) | SAML Authorization |
Single sign-on (SSO) | OpenID Authorization |
Social authentication | OAuth 2.0 Authorization |
Spring Security’s Servlet support is based on Servlet Filters docs.spring.io
Java 기반의 웹 애플리케이션에서 클라이언트의 요청을 처리하고, 그에 대한 응답을 생성하는 서버 측 프로그램.
스프링 MVC에서 Servlet이란 DispatcherServlet
의 인스턴스.
Servlet 요청 및 응답을 가로채고 처리하는 기능을 한다.
요청이 서블릿에 도달하기 전에, 또는 서블릿에서 응답이 클라이언트로 전달되기 전에 특정 로직을 실행한다.
Filter vs Interceptor
Filter Interceptor DispatcherServlet 전/후 로직 처리 Dispatcher Servlet이 Controller를 호출하기 전/후에 웹 컨테이너(Web Container)가 관리 스프링 컨테이너(Spring Container)가 관리 스프링 외부 기술 스프링 내부 기술
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
SecurityFilterChain
은 FilterChainProxy
가 현재 요청에 대해 호출해야 할 Spring Security Filter 인스턴스를 결정하는 데 사용된다. SecurityFilterChain
내부의 Security Filter들은 일반적으로 Bean이지만, DelegatingFilterProxy
가 아닌 FilterChainProxy
에 등록된다. FilterChainProxy
를 사용하는 것은 직접 Servlet 컨테이너나 DelegatingFilterProxy
에 등록하는 것과 비교하여 다음과 같은 여러 가지 이점을 제공한다.SecurityFilterChain
인스턴스SecurityFilterChain
만 호출된다. 따라서, 필터 체인의 선언 순서가 매우 중요하다.SecurityFilterChain
은 독립적이며, 여러개 또는 0개의 Filter 인스턴스를 가질 수 있다. (0개의 경우 특정 요청을 무시할 때 사용된다.)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에서 확인할 수 있다.
Spring MVC와 독립적인 관리
REST API에서 JWT 또는 OAuth 2.0을 활용해 스프링 MVC와 독립적으로 동작.
Java Config 기반 설정
@EnableWebSecurity를 통해 보안 설정을 활성화.
주로 SecurityFilterChain
과 AuthenticationManager
를 활용.
어노테이션 지원
Spring Security 3.2 이후로 XML 설정 없이 어노테이션으로 간단히 설정 가능.
@PreAuthorize
, @PostAuthorize
기본 인증 방식