[spring security 6] 초기화

rejs·2024년 6월 5일

스프링시큐리티6

목록 보기
2/3
  1. HttpSecurity 생성
  2. HttpSecurity-> SecurityConfigurer 생성
  3. SecurityConfigurer -> 필터 생성
  4. 3의 필터들을 모아서 SecurityFilterChain 생성
  5. WebSecurity가 4에서 생성된 SecurityFilterChain들을 FilterChainProxy에 담아주고 생성함

스프링 시큐리티가 제공하는 기본 보안초기화

별도의 설정이 없어도 스프링 시큐리티를 의존성에 추가하면 아래의 4개의 기능이 작동하도록 자동으로 초기화된다.

  1. 모든 요청에 대해서 인증여부를 검증
  2. form 로그인, httpBasic 로그인 제공
  3. 로그인 페이지 자동 생성
  4. 로그인 이루어질 수 있도록 기본 계정 제공

이 자동 초기화는 SpringBootWebSecurityConfiguration 클래스에 의해 이루어진다.

spring-docs SpringBootWebSecurityConfiguration
클래스의 설명부터가 사용자의 시큐리티 설정이 있으면 작동하지 않는 디폴트 설정이라고 적혀있다.

/* SpringBootWebSecurityConfiguration에 의한 스프링 시큐리티 기본 초기화 */
@Bean
@Order(2147483642)
SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
	http.authorizeHttpRequests((requests) -> {
    	// 모든 요청에 대해서 인증을 요구함 
		((AuthorizeHttpRequestsConfigurer.AuthorizedUrl)requests.anyRequest()).authenticated();
	});
    	
    // form 로그인 및 http basic 인증을 설정함 
	http.formLogin(Customizer.withDefaults()); 
	http.httpBasic(Customizer.withDefaults());		
    return (SecurityFilterChain)http.build();
}

이 코드를 통해서 우리는 스프링 시큐리티를 초기화할 때 어떻게 해야하는 지 이해할 수 있다.

HttpSecurity를 인자로 받아서 SecurityFilterChain을 반환한다.

그렇다면 HttpSecurity는 무엇이고, SecurityFilterChain은 무엇일까?

HttpSecurity

HttpSecuritySecurityBuilder이다.

SecurityBuilder는 웹 보안을 구성하는 객체들을 생성하고 초기화하는 역할을 한다.
(후술할 SecurityConfigurere로 SecurityBuilder이다.)

SecurityConfigurer

HttpSecurity의 역할은 필터들의 집합인 필터체인SecurityFilterChain을 생성하는 것이다.
HttpSecurity가 필터체인의 구성원인 필터를 생성하기 위해서 SecurityConfigurer를 사용한다.

다시 위로 올라가서 defaultSecurityFilterChain메서드를 보자

	http.formLogin(Customizer.withDefaults()); 
    http.httpBasic(Customizer.withDefaults());		

formLogin, httpBasic 메서드는 내부적으로 어떻게 작동할까?

    public HttpSecurity formLogin(Customizer<FormLoginConfigurer<HttpSecurity>> formLoginCustomizer) throws Exception {
        formLoginCustomizer.customize((FormLoginConfigurer)this.getOrApply(new FormLoginConfigurer()));
        return this;
    }

    public HttpSecurity httpBasic(Customizer<HttpBasicConfigurer<HttpSecurity>> httpBasicCustomizer) throws Exception {
        httpBasicCustomizer.customize((HttpBasicConfigurer)this.getOrApply(new HttpBasicConfigurer()));
        return this;
    }

어떤 Configurer 객체를 인자로 받아서 customize메서드를 호출하는 것을 확인할 수 있다.
HttpBasicConfigurer, FormLoginConfigurer는 무슨 역할을 할까?

SecurityConfigurer의 작동

SecurityConfigurer는 아래와 같이 생겼다.

public interface SecurityConfigurer<O, B extends SecurityBuilder<O>> {
    void init(B builder) throws Exception;
    void configure(B builder) throws Exception;
}

Spring Docs - SecurityConfigurer

아래는 httpSecurity의 build가 이루어 질때 실행되는 코드이다.

    protected final O doBuild() throws Exception {
        synchronized(this.configurers) {
        	/* 생략 */
            this.init(); // configurer의 init을 호출함 
            this.configure(); // configurer의 configure를 호출함 
            return result;
        }
    }

SecurityFilterChain

앞서 설명했듯이 HttpSecurity는 보안에 필요한 각 설정클래스, 필터들을 생성하고 SecurityFilterChain을 생성한다. SecurityFilterChain는 보안업무를 수행하는 Filter들을 가지고 있다.

Spring Docs - SecurityFilterChain
SecurityFilterChain 인터페이스는 2개의 메서드를 제공한다.
1. List<Filter> getFilters() : 필터체인이 가지고 있는 필터를 반환
2. boolean matches(HttpRequest request) : 이 보안 업무를 내(현재의 필터체인이)가 해야하는 지 판단 후 boolean값 반환

그렇다면 SecurityFilterChain은 언제 어떻게 사용될까?

이전글을 참조하자

아무튼 SecurityFilterChainFilterChainProxy에서 사용된다.

즉 누군가는 HttpSecurity가 생성한 SecurityFilterChain들을 FilterChainProxy에 넘겨주어야한다. 그 역할을 WebSecurity가 한다.

WebSecurity

WebSecurity는 FilterChainProxy을 생성한다.

HttpSecurity가 생성한 SecurityFilterChain 빈을 저장한 뒤 FilterChainProxy을 생성할 때 전달해주는 역할을 한다.

WebSecurity 빈은 WebSecurityConfiguration에서 생성한다.

0개의 댓글