사용자 정의 보안 기능 구현

SecurityFilterChain 를 상세하게 살펴보고, 하나는 RequestMatcher 그리고 하나는 필터 목록들을 가지고 있었다. 그래서 SecurityFilterChain 안에 이러한 정보가 있기에 웹 보안 기능이 동작을 하며 클라이언트 요청을 처리할 수 있다. 그러나 빈이 하나라도 정의되어 있지 않으면 웹 보안 기능을 처리할 수 있는 요소 자체가 없는 것. 우리가 만약 하나 이상의 빈 타입을 설정하지 않으면 자동 설정에 의해 기본적으로 생성이 된다.

이번 시간에는 우리가 직접 간단하게 생성한다. SecuredConfigure 라는 이름의 설정 클래스를 만들고 이 설정 클래스에는 반드시 하나의 annotation 이 들어간다. 그게 EnableWebSecurity 이것을 선언해야 한다.

스크린샷 2025-01-30 오후 12.32.51.png

그 이 annotation 이 선언이 되면 자동 설정에서 annotation 안에 있는 여러 클래스들이 초기화되고 여러 가지 설정들이 이루어진다. 그래서 반드시 annotation은 선언해야 한다. 그러면 Security Config 설정 클래스 안에서 우리는 어떤 작업을 할 것이냐 하면 일단 SecurityFilterChain 빈을 정의해야 한다. 여기서 HttpSecurity 객체 빈을 주입받는다. 주입 받는 이유는 우리는 이 객체를 통해 또 다른 여러 설정들을 할 수 있다. 우리가 초기 과정 속에서 기억해보면 기본적으로 SecurityFilterChain 빈이 생성될 때 HttpSecurity 를 통해 11개 정도의 설정들이 이루어졌다. CSRF 구성, 로그아웃 구성 등 여러 가지 설정들이 11개 정도 기본적으로 이루어진다. 그거 외에도 별도의 설정을 API 를 통해서 해야 될 필요가 있다. 그러기 위해선 HttpSecurity 객체가 필요하다. 여기에 빈으로 주입 받아야 한다. 따라서 이 책체를 가지고 우리는 두 가지를 할 수 있다. 하나는 인증 API 를 설정할 수 있고 또 하나는 인가 API 를 설정할 수 있다. 각각의 API에 대해서는 각 챕터마다 상세하게 보게 될 것.

기본 구현 코드

@EnableWebSecurity 
@Configuration
public class SecurityConfig {
	@Bean
	public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { 
		http.authorizeHttpRequests(auth -> auth.anyRequest().authenticated())
		.formLogin(Customizer.withDefaults()); 
		return http.build();
	} 
}

먼저 SecurityConfig 클래스를 만들고 여기에는 @EnableWebSecurity 에노테이션을 선언한다. 그리고 빈을 만들어야 하기 때문에 @Configuration 에노테이션도 선언해야 할 것. 하나의 빈을 만들었는데 반드시 하나 이상의 SecurityFilterChain 타입의 빈을 생성을 해야한다. 그리고 여기에는 HttpSecurity 타입의 객체를 주입받아야 하며 우리는 이 객체를 통해 인가 API 나 인증 API 와 같은 여러가지 설정들을 할 수 있다. 이전 시간에 초기 과정 속에서 본 간단한 설정 정도를 할 것.

authorizeHttpRequests Http 요청에 대한 인가 설정을 하며 anyRequest 어떤 요청에도 authenticated 인증을 받아야 한다. 그래야 해당 서버에, 해당 시스템에 접근 가능하다고 설정하는 것. 람다 형식으로 작성 해야 한다.

인증을 받지 못하면 다시 인증을 받을 수 있는 인증 방식을 제공하는데 httpBasic 방식은 제공하지 않고 formLogin 방식만 제공하고 별도의 커스텀한 설정은 하지 않는다. Customizer 는 해당 설정에 대해서 다른 API, 다른 메소드들을 우리가 어떤 값을 설정할 때 커스터마이징 할 수 있도록 제공하는 하나의 메소드를 가지고 있는 함수형 인터페이스이다. http.build() 를 하면 SecurityFilterChain 빈이 하나 생성이 될 것.

자동 설정에 의해 이 빈이 생성될 수도 있는데, 우리가 커스텀하게 생성하면 자동 설정에 의해서는 설정되지 않는다.

사용자 추가 설정

우리는 스프링에 Spring Security 의 의존성을 추가한 다음 서버를 기동하게 되면 기본적으로 웹 보안 기능이 작동하고 그렇기에 인증을 받아야 하는데 인증을 받기 위해 Spring Security 가 우리에게 하나의 계정을 제공한다 배웠다. 그게 이름은 user 이고 password 는 랜덤한 문자열(UUID)이었다. 이때 password 는 매번 바뀌었기에 매번 인증을 받았는데 이럴 필요 없이 직접 사용자를 추가 설정할 수 있다. 이때 권한은 보통 대문자로 준다.