포스트

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하였다.
참고 사이트

개발자 유미