-> 아무래도 개발을 하다보면 보안 문제도 생기고 회원과 비회원을 구분해야 하는 상황도 생기기 때문에 Spring Security를 적용하여 보안 관리를 해주고, 확장성과 유연성을 높여준다!
build.gradle에 적용
implementation 'org.springframework.boot:spring-boot-starter-security'
/**
* SecurityConfig -> Spring Security 설정을 담당하는 클래스
* -> 애플리케이션의 보안 설정 정의 및 사용자의 인증과 권한 부여 설정
*/
@Configuration
@EnableWebSecurity
@AllArgsConstructor
public class SecurityConfig {
//SecurityFilterChain - HTTP 보안 설정 정의
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
//HTTP 요청에 대한 접근 권한 설정
.authorizeHttpRequests((authorize) -> authorize
.requestMatchers("/", "signup").permitAll()
.anyRequest().permitAll()
)
//폼 로그인 설정 정의
.formLogin(login -> login
.loginPage("/") // 사용자 정의 로그인 페이지 경로 지정
.permitAll() // 로그인 페이지에 대한 접근 허용
)
//CSRF 보호 비활성화
.csrf().disable();
return http.build();
}
//AuthenticationManager - 인증 매니저 구성
@Bean
public AuthenticationManager authenticationManager(
UserDetailsService userDetailsService,
PasswordEncoder passwordEncoder) {
//DaoAuthenticationProvider - 데이터베이스 기반 인증 처리 인증 제공자
DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
authenticationProvider.setUserDetailsService(userDetailsService);
authenticationProvider.setPasswordEncoder(passwordEncoder);
//ProviderManager - 인증 제공자 관리 매니저
ProviderManager providerManager = new ProviderManager(authenticationProvider);
providerManager.setEraseCredentialsAfterAuthentication(false);
return providerManager;
}
//UserDetailsService - 사용자 세부 정보 관리
@Bean
public UserDetailsService userDetailsService() {
UserDetails userDetails = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
//InMemoryUserDetailsManager - 메모리 내 사용자 세부 정보 관리 서비스
//생성한 UserDetails 객체를 사용하여 초기 사용자 정보 설정
return new InMemoryUserDetailsManager(userDetails);
}
@Bean
public PasswordEncoder passwordEncoder() {
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}
}
주석으로 적어놓은 것처럼 SecurityConfig 클래스를 통해 HTTP 보안 설정 정의, 인증 매니저 구성, 사용자 세부 관리 등 여러 보안 문제를 이 클래스를 통해 처리하도록 한다.
그리고 passwordEncoder를 통해서 비밀번호 저장시 암호화하여 저장하도록 한다!
@Bean
public PasswordEncoder passwordEncoder() {
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}
여기서 또 중요한 점은 Spring security를 적용하면 자연스럽게 세션 id가 생성이 되어서 상태 유지 및 보안성을 높여준다.
F12 -> Application에 들어가서 JSESSIONID가 존재하는지 확인하면 정상 동작 하고 있는 것이다.