<aside> 💡

인증 (Authentication)

인가 (Authorization)

<aside> 👉

웹 인증 방식 학습 자료

Spring Security 학습 자료

</aside>

REST API 를 위한 Spring Security 설정

  1. build.gradle 의존성 추가

    implementation 'org.springframework.boot:spring-boot-starter-security'
    
  2. SecurityConfig 설정 컴포넌트 생성

    <aside> <img src="/icons/question-mark_gray.svg" alt="/icons/question-mark_gray.svg" width="40px" />

    CORS (Cross Origin Resource Sharing)

    CSRF (Cross Site Request Forgery)

    @Configuration
    @EnableWebSecurity
    public class WebSecurityConfig {
    		@Bean
        public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    
            http.cors(withDefaults());
            // CSRF 보안 disable
            http.csrf(AbstractHttpConfigurer::disable);
    
    				// REST API 는 무상태성 이다. -> session : STATELESS
            http.sessionManagement((sessionManagement) -> sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
    
    				// 모든 요청에 대해서 인증정보가 필요하다.
    				http.authorizeHttpRequests((authorizeRequests) ->
                    authorizeRequests
                            .anyRequest().authenticated()
            );
    
            return http.build();
    
        }
        
        // CORS 허용
        @Bean
        public CorsConfigurationSource corsConfigurationSource() {
            CorsConfiguration configuration = new CorsConfiguration();
    
            configuration.addAllowedOriginPattern("*");
            configuration.setAllowedHeaders(List.of("Authorization", "Content-Type"));
            configuration.setAllowedMethods(List.of("GET", "POST", "PUT", "PATCH", "DELETE"));
            configuration.setAllowCredentials(true);
    
            UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
            // 모든 API Endpoint 에 동일한 configuration 적용
            source.registerCorsConfiguration("/**", configuration); 
    
            return source;
        }
    }
    

ID/PW 기반 로그인 및 JWT 발급

로그인 및 JWT 발급 처리 순서

  1. 클라이언트에서 /user/login (서버 로그인 API)으로 사용자 ID/PW 정보를 요청 본문에 넣어서 요청한다.
  2. 요청이 들어오면 JwtAuthFilter 를 거친다. → JwtAuthFilter 는 UsernamePasswordAuthenticationFilter 이전에 위치해있다.
  3. 로그인 요청에 대해서는 인증이 필요한 요청이 아니므로 토큰 정보가 필요하지 않다. → JWT 토큰 검증 Pass
  4. 로그인 API에서 로그인 비즈니스 로직(로그인 요청 검증 및 JWT 생성)이 수행된다.

<aside> <img src="/icons/question-mark_gray.svg" alt="/icons/question-mark_gray.svg" width="40px" />

JwtAuthFilter 를 AuthenticationFilter(UsernamePasswordAuthenticationFilter) 이전에 위치시키는 이유

로그인 및 JWT 발급 구현

Spring Security 설정 파일 수정

JwtProvider 클래스 선언

JwtAuthFilter 생성