Spring Security - Web Security Configuration 설정 , @EnableWebSecurity

TopOfTheHead·2025년 11월 18일

Spring Security

목록 보기
12/21

WebSecurityConfiguration :
Spring Security웹 보안설정을 담당하는 @Configuration Class

Authentication , Authorization , CSRF Protection 등의 보안정책을 설정한 SecurityFilterChain 객체@Bean method를 통해 Spring Bean으로 등록

  • SpringBootWebSecurityConfiguration
    Servlet 어플리케이션을 보호하는 역할의 WebSecurityConfiguration Class
    ▶ 웹보안을 위한 Default로 설정된 Configuration Class.

    Spring은 기본적으로 FilterChain을 통해 명시적으로 인증된 HTTP Request에 대해서만 허용 및 formLogin()httpBasic()이 기본적으로 활성화 설정되도록 설정됨.
    CsrfFilter도 기본적으로 활성화 설정이 되어있음.

WebSecurityConfiguration Class 설정

@Configuration
@EnableWebSecurity
@EnableMethodSecurity(prePostEnabled = true)
@RequiredArgsConstructor
public class SecurityConfiguration {
	// 커스텀한 필터구현체를 의존성주입
	private final JwtFilter jwtFilter;
	// 메서드를 허용할 API 엔드포인트 지정
	private static final String[] GET_PERMIT_ALL = {"/api/health/**", "/swagger-ui/**", "/v3/api-docs/**"};
	private static final String[] POST_PERMIT_ALL = {"/members", "/auth/login"};
	private static final String[] PUT_PERMIT_ALL = {"/api/v1/public/**"};
	private static final String[] PATCH_PERMIT_ALL = {"/api/v1/public/**"};
	private static final String[] DELETE_PERMIT_ALL = {"/api/v1/public/**"};
	// BCrypt hashing 알고리즘을 사용하는 패스워드 인코더를
	// Spring Bean으로 등록
	@Bean
	public PasswordEncoder passwordEncoder() {
		return new BCryptPasswordEncoder();
	}
	// AuthentificationManagerSpring Bean으로 등록
	// 사용자가 전달한 인증방식에 맞는 검증방식의 AutheticationProvider// 식별하여 검증을 수행
	@Bean
	public AuthenticationManager authenticationManagerBean(AuthenticationConfiguration authenticationConfiguration)
		throws Exception {
		return authenticationConfiguration.getAuthenticationManager();
	}
	// @EnableWebSecurity를 통해 사용할 Spring Security Filter Chain 설정
	// JWT 사용 기준
	@Bean
	public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
		return http
			.sessionManagement(session ->
				session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) // 세션을 사용하지 않도록 설정
			.authorizeHttpRequests(
				request -> { // 요청에서 허용할 메서드 당 API 엔드포인트 범위 지정
					// "/api/v1/public/**" URL로 요청하는 HTTP GET REQUEST를 모두 허용
					request.requestMatchers(HttpMethod.GET, GET_PERMIT_ALL).permitAll();
					request.requestMatchers(HttpMethod.POST, POST_PERMIT_ALL).permitAll();
					request.requestMatchers(HttpMethod.PATCH, PATCH_PERMIT_ALL).permitAll();
					request.requestMatchers(HttpMethod.PUT, PUT_PERMIT_ALL).permitAll();
					request.requestMatchers(HttpMethod.DELETE, DELETE_PERMIT_ALL).permitAll();
				}
				// 위 설정범위에 들어가지 않는 메서드에 대해서는 인증이 필요하도록 설정
			).authorizeHttpRequests(request->request.anyRequest().authenticated())
			.csrf(AbstractHttpConfigurer::disable)
			// 커스텀한 JWT 검증용도의 FilterSpring Security Filter Chain에 포함
			// UsernamePasswordAuthenticationFilter가 동작하기 전에 작동할 필터로 설정
			.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class)
			.build();
	}
}

WebSecurityConfiguration을 담당하는 @Configuration ClassBCryptPasswordEncoder객체를 생성하여 PasswordEncoder type으로 Spring Bean으로 등록하는 @Bean Method를 정의.
▶ 추후 계정 저장 시 해당 Password Encoder를 통해 단방향 암호화되어 저장되어 복호화 불가능.

AuthentificationManagerSpring Bean으로 등록하는 @Bean method 정의

.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class)
사용자JWT 토큰서버에 전달 시 JWT 검증 용도로 구축한 커스텀 Filter 구현체Spring Security Filter Chain에 포함 JWT 검증 필터
UsernamePasswordAuthenticationFilter 가 동작하기전에 동작하도록 설정

@EnableWebSecurity
Spring Secuirty을 활성화 및 웹보안 설정을 구성하는 용도로 사용되는 어노테이션
Spring Security를 설정 및 구성하는 @Configuration Class에 선언

WebSecurityConfiguration 역할의 @Configuration ClassSpring Bean으로 등록된 SecurityFilterChain을 활성화

spring-boot-starter-security 의존성 추가 시 별도의 어노테이션 선언 없어도 자동 활성화

  • @EnableWebFluxSecurity
    Tomcat이 아닌 Netty 기반의 비동기 서버환경에서 선언하는 어노테이션
profile
공부기록 블로그

0개의 댓글