HwangHub

[JUnit] 토이 프로젝트 for JUnit practice : Bank App 2 - SecurityConfig 본문

DEV-STUDY/Spring

[JUnit] 토이 프로젝트 for JUnit practice : Bank App 2 - SecurityConfig

HwangJerry 2023. 7. 27. 16:48

스프링부트 2.7.6 이하 버전과 스프링부트 3.0 이상 버전이 시큐리티 최적 호환 버전이 달라서 config 작성시에 많은 부분이 다르고,

 

스프링부트 3.1 이상 버전에도 여러 부분이 달랐기에 설정에 애를 먹었다.

 

우선은 아래 블로그를 메인으로 참조하여 설정을 완성하였다.

 

Spring Boot 3.1(Spring 6.1) Security Config: 'csrf()' is deprecated and marked for removal

스프링 부트 3.1로 올리면서 발생하는 Deprecated 문제가 있다. 기존에 Security Config에서 서로 무관한 애들끼리도 직렬로 이어지던 이런 메서드 체이닝을 지양하고이런 식으로 함수형을 쓰면 된다.

velog.io

package study.junit.bank.config;

import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
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.annotation.web.configurers.HeadersConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import study.junit.bank.user.UserEnum;

//@Slf4j
@Configuration
@EnableWebSecurity // 스프링 시큐리티 설정 활성화 - 커스터마이즈
public class SecurityConfig {
    private final Logger log = LoggerFactory.getLogger(getClass());

    @Bean // IoC 컨테이너에 BCryptPasswordEncoder() 객체가 등록됨.
    public BCryptPasswordEncoder passwordEncoder() {
        log.debug("디버그 : BCryptPasswordEncoder 빈 등록됨");
        return new BCryptPasswordEncoder();
    }

    // JWT 서버를 만들 예정!! Session 사용 안함.
    @Bean // 컴포넌트 기반의 보안 설정 가능
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        // iframe 허용 안함 <- h2-console 화면을 사용하기 위해 disabled
        http.headers(httpSecurityHeadersConfigurer -> httpSecurityHeadersConfigurer.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable));
        // httpBasic은 브라우저가 팝업창을 이용해서 사용자 인증을 실행한다.
        http.httpBasic(AbstractHttpConfigurer::disable);
        /*
        enable이면 postman 작동 안함 (메타코딩 유튜브에 시큐리티 강의) <- basic auth를 사용하기 위해 csrf 보호기능
        만약 JWT를 사용하여 로그인을 하게끔 하며녀 csrf를 disabled() 해줘야 한다.
        **/
        http.csrf(AbstractHttpConfigurer::disable);

        // JSessionId를 서버쪽에서 관리 안하겠다는 뜻!!
        http.sessionManagement(sessionManagement -> sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
        // react, 앱으로 요청할 예정
        http.formLogin(AbstractHttpConfigurer::disable);

//        http.cors().configurationSource(null);
        http.cors(httpSecurityCorsConfigurer -> configurationSource());


        /* 여기서부턴 해결되어있음 */
        http.authorizeHttpRequests(authorize -> authorize
                .requestMatchers("api/s/**").authenticated()
//                .requestMatchers("api/admin/**").hasRole("ROLE_" + UserEnum.ADMIN); // 예전 방식 : 앞에 ROLE_ 붙여줘야 했음
                .requestMatchers("api/admin/**").hasRole(String.valueOf(UserEnum.ADMIN)) // 최근 공식문서에서는 ROLE_ 안붙여도 됨.
                .anyRequest().permitAll());
        return http.build();
    }

    public CorsConfigurationSource configurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.addAllowedHeader("*");
        configuration.addAllowedMethod("*"); // GET, POST, PUT, DELETE (javascript 요청 허용)
        configuration.addAllowedOriginPattern("*"); // 모든 IP 주소 허용 -> 원래는 프론트엔드 IP만 허용해야함 (react)
        configuration.setAllowCredentials(true); // 클라이언트에서 쿠키 요청 허용

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);

    }

}

 

그 외 참고:

 

스프링 부트 2.0에서 3.0 스프링 시큐리티 마이그레이션 (변경점)

목차 스프링 부트 3.0 부터 스프링 시큐리티 6.0.0 이상의 버전이 적용되었습니다. 스프링 부트 2.7.8 까지는 deprecated는 되었더라도 기존 설정대로 대부분 사용 가능했으나, 스프링 부트 3.0 부터는

nahwasa.com

 

Comments