- 리엑트와 스프링 부트 연동시 자바스크립트를 이용한 접근 때문에 cors 오류가 발생함
- 이를 해결하기 위해 @CrossOrigin을 메소드 마다 붙여야 함
- CorsConfig.java 파일을 설정하여 해결함
* CorsConfig.java
@Configuration
public class CorsConfig {
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.setAllowedOrigins(List.of("http://localhost:3000"));
config.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"));
config.setAllowedHeaders(List.of("*"));
config.setExposedHeaders(List.of("*"));
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return source;
}
}
* SecurityConfig.java
Configuration
@EnableMethodSecurity(securedEnabled = true)
@EnableWebSecurity // Spring Security 설정을 활성화 - 스프링 시큐리티 필터가 필터 체인에 등록됨
@RequiredArgsConstructor
public class SecurityConfig {
private final PrincipalOauth2UserService principalOauth2UserService;
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf(AbstractHttpConfigurer::disable) // CSRF 보안 토큰 disable처리.
.cors(withDefaults()) // 설정을 이용한 사이트에 대해 cors 허용
.authorizeHttpRequests(request -> request
.requestMatchers("/user/**").authenticated()
.requestMatchers("/manager/**").hasAnyAuthority("MANAGER", "ADMIN")
.requestMatchers("/admin/**").hasAuthority("ADMIN")
.anyRequest().permitAll()
)
.formLogin(login -> login
.loginPage("/loginForm") // 로그인 페이지
.loginProcessingUrl("/login") // login이 호출되면 시큐리티가
// 낚아채서 대신 로그인을 진행해줌
.defaultSuccessUrl("/") // 로그인이 정상적으로 완료되면 "/"로 이동
.usernameParameter("username")
.passwordParameter("password")
)
.logout(withDefaults()) // 로그아웃은 기본설정으로 (/logout으로 인증해제)
.oauth2Login(oauth2 -> oauth2
.loginPage("/loginForm") // 구글 로그인이 완료된 후 엑세스 토큰 + 사용자 프로필정보
.userInfoEndpoint(userInfoEndpointConfig ->
userInfoEndpointConfig.userService(principalOauth2UserService))
);
return http.build();
}
@Bean // 비밀번호 암호화
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}