Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 알고리즘기본개념
- 기본유형
- BFS
- 알고리즘
- 코딩테스트실력진단
- 코테
- Spring
- database
- DFS
- 그래프
- SSAFY
- 유니온파인드
- 코딩테스트
- 완탐
- 백준
- Union Find
- Java
- 다시보기
- 코드트리
- 다익스트라
- SWEA
- 트러블슈팅
- 부분수열의합2
- 그리디
- 자바
- 완전탐색
- JPA
- JUnit
- 싸피
- DP
Archives
- Today
- Total
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 이상 버전에도 여러 부분이 달랐기에 설정에 애를 먹었다.
우선은 아래 블로그를 메인으로 참조하여 설정을 완성하였다.
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);
}
}
그 외 참고:
'DEV-STUDY > Spring' 카테고리의 다른 글
[Spring] Validation 체크는 Controller의 몫이다. (0) | 2023.08.08 |
---|---|
[Spring] @Bean과 @Configuration, @Component (0) | 2023.07.28 |
[Junit] 토이 프로젝트 for JUnit practice : Bank App 1 - 환경 설정 (0) | 2023.07.27 |
[JUnit] MockMVC로 Controller 테스트하기 (0) | 2023.07.26 |
[Spring] entity field에 wrapper class를 사용하는 이유 (0) | 2023.07.20 |
Comments