이번 포스팅은 Security 적용을 위한 세팅과 클래스들을 작성하는 시간을 가지도록 하겠다.
// Security
implementation 'org.springframework.boot:spring-boot-starter-security'
(버전 3.2.2)
@EnableWebSecurity
어노테이션을 사용하여 스프링 시큐리티의 보안 구성을 활성화할 수 있다.
@Configuration
@EnableWebSecurity
public class SecurityConfig {
}
지금부터 SpringSecurity에 등록되는 빈들에 대해 알아보자.
우선 이전 포스팅에서 다뤘듯이 스프링의 보안 체계는 필터체인을 구성하면서 완성된다.
나의 경우 stateless 방식의 JWT 로그인을 구현할 것이므로 다음과 같이 구성하였다.
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
// jwt 토큰 사용
.csrf(AbstractHttpConfigurer::disable)
.formLogin(AbstractHttpConfigurer::disable)
.httpBasic(AbstractHttpConfigurer::disable)
.sessionManagement(AbstractHttpConfigurer::disable)
.and()
.authorizeHttpRequests((authz) -> authz
// 회원 가입
.requestMatchers(antMatcher(HttpMethod.POST, "/api/users")).permitAll()
.anyRequest().authenticated()
);
return http.build();
}
CSRF(크로스 사이트 요청 위조) 보호 기능, 폼 기반 로그인, HTTP 기본 인증, 세션 관리 비활성화
.csrf(AbstractHttpConfigurer::disable)
.formLogin(AbstractHttpConfigurer::disable)
.httpBasic(AbstractHttpConfigurer::disable)
.sessionManagement(AbstractHttpConfigurer::disable)
회원가입 요청에 대해서는 필터 제외.
.authorizeHttpRequests((authz) -> authz
// 회원 가입
.requestMatchers(antMatcher(HttpMethod.POST, "/api/users")).permitAll()
.anyRequest().authenticated()
);
Authentication 객체를 매개변수로 받아 처리하고, 인증이 성공적으로 완료되면 인증된 Authentication 객체를 반환하는 메서드이다. 자세한 내용은 인증 로직 구현시 다루겠다.
@Bean
public AuthenticationManager authenticationManager(
AuthenticationConfiguration authenticationConfiguration) throws Exception {
return authenticationConfiguration.getAuthenticationManager();
}
회원가입시 비밀번호를 인코딩을 해줄 메서드이다.
// 비밀번호 인코더
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
SecurityConfig를 등록하게 되면 Security 적용이 완료된다. 이제 인증되지 않은 API 요청이 있을시 인증 에러를 반환할 것이다!