01.Security Config 클래스(STATELESS)
Security Config 클래스
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import lombok.AllArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
@AllArgsConstructor
public class SecurityConfig {
// 스프링 시큐리티에서 제공하는 인증, 인가를 위한 필터 모음
// Application Context 초기화가 이루어 지면서 HttpSecurity 객체가 설정한 filterChain 형성
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf(AbstractHttpConfigurer::disable);
// == .csrf((auth) -> auth.disable());
// CSRF(Cross-Site-Request Forgery 보호를 비활성화하는 메서드 호출
// AbstractHttpConfigurer::disable -> AbstractHttpConfigurer에 정의된 disable 메소드에 대한 참조
http
.formLogin(AbstractHttpConfigurer::disable);
// == formLogin((auth) -> auth.disable());
http
.httpBasic(AbstractHttpConfigurer::disable);
http
.authorizeHttpRequests(
(authorizeRequest) -> authorizeRequest
.requestMatchers("/", "/api/users/login", "/api/users/loginProc", "/api/users/join" , "/api/users/joinProc").permitAll()
.requestMatchers("/api/users/admin").hasRole("ADMIN")
.anyRequest().authenticated()
);
// 세션 설정. STATELESS 상태로 변경
http
.sessionManagement((session) -> session
.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
return http.build();
}
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder(){
return new BCryptPasswordEncoder();
}
}
- JWT 사용을 위해 Session을 stateless 상태로 반드시 변경해줘야 한다
- csrf의 공격은 세션 방식에서는 세션에 정보가 저장되기 때문에 방어가 필요하였지만 JWT를 사용함으로써 세션이 STATELESS로 관리되기 때문에 필요가 없다
- JWT 방식으로 로그인을 진행하기 위해 formLogin과 httpBasic은 disable하였다.