[Spring Security 02] SecurityConfig.java

 

Spring Security를 사용하기 위해 먼저 Security 설정을 해주어야 한다.
이 때, 설정 정보들을 하나의 class에 적어주는데 이것이 바로 SecurityConfig.java이다.

 

SecurityConfig.java : Spring Security 설정 정보들을 작성해놓은 Class

 

해당 클래스 안에 filterChain이라는 method에 설정을 지정해준다.

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    return http
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .csrf().disable()
            .addFilter(corsFilter)
            .formLogin().disable()
            .httpBasic().disable()
            .authorizeRequests()
            .antMatchers("/api/game/**", "/api/user/logout/**").authenticated()
            .anyRequest().permitAll()
            .and()
            .logout()
            .logoutSuccessUrl("/")
            .and()
            .addFilterBefore(tokenAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)
            .exceptionHandling()
            .authenticationEntryPoint(new RestAuthenticationEntryPoint())
            .accessDeniedHandler(tokenAccessDeniedHandler)
            .and().build();
}

 

.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)

  • session을 관리해주는 부분인데 위 코드는 세션을 사용하지 않겠다는 의미

 

 .and()

  • return type이 특정 Configurer인 경우에만 뒤에 붙인다.return type이 HttpSecurity인 경우 붙이지 ❌

 

.csrf.disable()

  • Cross Site Request Forgery - 사이트 간 위조 요청
  • A라는 도메인에서는 사용자가 일반 유저인지 악용된 공격인지 구분할 수가 없음.
  • 따라서 GET을 제외한 CUD는 csrf 토큰이 있어야 요청을 받아들여줌.
  • spring security에서는 CSRF protection이 default로 설정 되어있음.
  • 근데 jwt라는 토큰을 어차피 사용할 예정이라 굳이 csrf protection이 필요 없음.

 

.formLogin().disable()

  • Security에서 기본적으로 제공하는 로그인 폼을 사용하지 않겠다는 의미

 

.httpBasic().disable()

  • http Basic 방식을 사용하지 않겠다는 의미
  • http Basic 방식이란? 
    • 아래 그림과 같이 header의 Authorization에 키 값을 담아서 인증할 때 id, pw를 암호화 하지 않고 그대로 보내는 방식

 

.authorizeRequests()

  • 인증과 관련된 설정을 시작하겠다는 의미

 

 .antMatchers("/api/game/**").authenticated()

  • 소괄호 안에 있는 경로로 접근 시 인증된 사용자만 접근을 허용하겠다는 의미

 

.anyRequest().permitAll()

  • 이외에 다른 요청을 모두 허용하겠다는 의미

 

.logout()
            .logoutSuccessUrl("/")

  • 로그아웃 성공 시 메인으로 redirect 한다는 의미

 

.addFilterBefore(tokenAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)

  • Back으로 접근이 오면 가장 먼저 실행되고 커스텀 한 필터(tokenAuthenticationFilter())를 거치도록 설정

 

.exceptionHandling()
            .authenticationEntryPoint(new RestAuthenticationEntryPoint())
            .accessDeniedHandler(tokenAccessDeniedHandler)

  • 인증 성공, 실패 시 적용될 필터 설정

'Spring Boot' 카테고리의 다른 글

[CORS 02] CORS 설정 | CorsConfig  (0) 2023.07.26
[CORS 01] CORS 기본 동작 과정  (0) 2023.07.26
[CORS 00] CORS, 왜 필요할까?  (0) 2023.07.26
Spring Security란 무엇인가  (0) 2023.01.30