본문 바로가기
Spring/Security

[Spring] Spring Security 구성 요소

by 기몬식 2023. 9. 20.

설정

@EnableWebSecurity

WebSecurityConfigurer 또는 SecurityFilterChain을 사용하기 위해서는 @EnableWebSecurity 어노테이션을 선언해야합니다.
또한 @EnableWebSecurity 어노테이션을 명시함으로써 Spring Security 를 활성화하고 설정되어 있는 기본 설정을 비활성화한 후 필요한 보안 규칙을 정의하고 구성할 수 있습니다.
즉 EnableWebSecurity 는 Spring Security 자동 구성(Auto Configuration)을 사용함을 나타내는 어노테이션으로 Spring Security 5.7.0-M2부터 Deprecated 된 WebSecurityConfigurer 또는 SecurityFilterChain의 설정 파일을 정의합니다.

SpringWebMvcImportSelector

ImportSelector는 @Configuration이 선언된 클래스를 가져오는지(Import)를 판단하는 인터페이스로 각 구현체 마다 특정 설정 파일을 가져오는 것을 결정합니다.

먼저 애플리케이션이 구동되면 ConfigurationClassParser 의 processConfigurationClass() 메소드를 통해 모든 설정 파일을 불러옵니다.

그 후 설정 클래스들을 ApplicationContext 의 빈으로 관리하기 위한 메타 정보들을 ImportSelector 구현체들로 가져오게 됩니다.
그 중 SpringWebMvcImportSelector는 @EnableWebSecurity 이 선언된 설정 파일 정보를 불러옵니다.

불러온 설정 파일을 기반으로 Spring Security에 필요한 인증, 권한 부여, 보안 필터 체인, 세션 관리 등과 같은 작업을 설정하고 구성합니다.

하지만 SpringWebMvcImportSelector 는 @EnableWebSecurity와 관련되어 최소 1개의 설정 파일을 가져옵니다.
SpringSecurity 에서는 사용자가 커스텀 보안을 추가하고 @EnableWebSecurity 어노테이션을 누락했을 때를 방지하기 위해 SpringBootWebSecurityConfiguration 의 내부 클래스인 WebSecurityEnablerConfiguration 를 추가로 가져옵니다.

@Configuration(proxyBeanMethods = false)
@ConditionalOnMissingBean(name = BeanIds.SPRING_SECURITY_FILTER_CHAIN)
@ConditionalOnClass(EnableWebSecurity.class)
@EnableWebSecurity
static class WebSecurityEnablerConfiguration {

}

하지만 이미 @EnableWebSecurity 어노테이션을 명시했거나 springSecurityFilterChain 이름의 빈이 있다면 가져온 설정 파일을 사용하지 않습니다(back off).

HttpSecurityConfiguration

HttpSecurityConfiguration는 HttpSecurity를 처리하기 위해 Bean으로 노출(exposes)하는 설정 클래스입니다.
HttpSecurityConfiguration 는 HttpSecurity를 빈으로 등록하기 위해 필요한 AuthenticationManager, AuthenticationEventPublisher, PasswordEncoder 등 설정에 필요한 인스턴스들을 주입 받고 prototype scope 빈으로 생성합니다.

HttpSecurity를 사용할 때마다 새로 생성된 HttpSecurity를 반환하며 다른 모든 초기 설정 값은 기본 값으로 설정합니다.

HttpSecurity 빈 스코프를 prototype 으로 유지함으로써 각 요청에 대해 서로 영향을 미치지 않으며 불변성을 유지하기가 더 용이합니다.
즉 요청 그룹에 대한 고유한 보안 구성을 가능하게 함으로써 보안 설정의 독립성과 요청 간의 분리를 보장합니다.

HttpSecurity

HttpSecurity는 Spring Security 에서 보안 설정을 정의하고 구성하는데 사용되는 클래스입니다.
설정 클래스에서 HttpSecurity를 인자로 받아서 원하는 보안 설정을 구성하여 이를 통해 웹 애플리케이션의 보안 규칙을 정의하고 구성할 수 있으며 사용자의 인증 및 권한 부여 요구 사항을 처리할 수 있습니다.

다음 아래는 HttpSecurity 에서 설정 가능한 목록입니다.

  • 인증 & 권한설정: 특정 URL 패턴에 대한 접근 권한을 부여합니다.
  • 로그인/아웃 설정: 로그인 요청시 인증 절차 수행 및 로그아웃 후 후속 조치에 대해 설정합니다.
  • 세션 관리: : 세션 관리 정책을 설정하고, 세션 고정 및 세션 타임아웃과 같은 세션 관리 옵션을 구성할 수 있습니다.
  • CSRF: CSRF 토큰을 생성하고 검증하는 설정을 할 수 있습니다.
  • 헤더: HTTP 응답 헤더에 대한 옵션을 설정할 수 있습니다.
  • 예외 처리: 엑세스 권한이 없거나 인가 권한이 없는 경우 처리 방식에 대해 설정합니다.

WebSecurityConfiguration

WebSecurityConfiguration 는 WebSecurity를 사용하여 Spring Security에 FilterChainProxy를 생성한 후 Bean으로 등록합니다.
또한 WebSecurityConfigurer 를 구현하거나 WebSecurityCustomizer Bean을 관리하며 WebSecurity에 대한 사용자 정의를 설정합니다.
즉 Spring Security에 대한 설정을 담고 있는 클래스로 @EnableWebSecurity 어노테이션을 사용할 때 해당 설정들을 불러옵니다.

WebSecurityConfiguration는 전달받은 WebSecurityCustomizer와 WebSecurityConfigurer 설정 파일들을 통해 WebSecurity를 다음과 같이 생성합니다.

먼저 SecurityFilterChain과 WebSecurityCustomizer가 있는지 확인합니다.

boolean hasConfigurers = this.webSecurityConfigurers != null && !this.webSecurityConfigurers.isEmpty();
boolean hasFilterChain = !this.securityFilterChains.isEmpty();

그 후 각각의 파일이 존재한다면 해당 설정을 적용한 WebSecurity 를 반환하며 만일 존재하지 않다면 새로운 WebSecurityConfigurerAdapter 인스턴스를 적용한 WebSecurity 를 반환합니다.

WebSecurity

WebSecurity 의 주된 목적은 FilterChainProxy 를 만들어 DelegatingFilterProxy 에게 실제 처리를 위임합니다.
FilterChainProxy 는 Chain 처럼 순서대로 정의되어 있는 필터들을 연계적으로 실행시켜 각 목적에 맞는 특정한 보안 작업을 수행합니다.

WebSecurityConfiguration 에서 전달 받은 사용자 정의 설정들을 통해서 실제 WebSecurity 객체를 생성하기 위해 빌드 메소드를 호출합니다.

사용자가 등록한 ignoreRequestMatcher, securityRequestMatcher 들을 하나의 SecurityFilterChain 으로 만든 뒤 FilterChainProxy 로 만들어줍니다.

생성된 FilterChainProxy 는 웹 요청이 들어와 SecurityFilter들을 실행 시키기 위해서는 서블릿 컨테이너로부터 요청을 위임받아야 합니다.
ServletFilter 와 FilterChainProxy 는 관리되는 영역이 각각 서블릿 컨테이너와 스프링 컨테이너로 다르기 때문에 DelegatingFilterProxy 를 통해 ServletFilter에서 FilterChainProxy 에게 요청을 위임하게 됩니다.
위임 요청을 받은 FilterChainProxy 는 Spring Security 보안 처리를 진행하게 됩니다.

출처

오탈자 및 오류 내용을 댓글 또는 메일로 알려주시면, 검토 후 조치하겠습니다.

'Spring > Security' 카테고리의 다른 글

[Spring] Spring Security Authentication이란?  (0) 2023.12.10
[Spring] Spring Security SecurityFilter란?  (1) 2023.12.03
[Spring] Spring Security란?  (1) 2023.09.14