
프론트엔드 서버랑 백엔드 서버를 나눠서 구현하면 포트가 서로 달라서 웹브라우저가 교차 출처 리소스 공유를 금지시키면서 데이터가 안 보인다.
백엔드에서 CORS 설정을 해주어야 함.
- SecurityConfig.java
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
http.cors((cors)-> cors.configurationSource(new CorsConfigurationSource() {
@Override
public CorsConfiguration getCorsConfiguration(HttpServletRequest request) {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Collections.singletonList("http://localhost:3000"));
configuration.setAllowedMethods(Collections.singletonList("*"));
configuration.setAllowCredentials(true);
configuration.setAllowedHeaders(Collections.singletonList("*"));
configuration.setMaxAge(3600L);
configuration.setExposedHeaders(Collections.singletonList("Authorization"));
return configuration;
}
}));
// csrf disable
http.csrf((auth) -> auth.disable());
// Form 로그인 방식 disable
http.formLogin((auth) -> auth.disable());
// http basic 인증 방식 disable
http.httpBasic((auth) -> auth.disable());
// 경로별 인가 작업
http.authorizeHttpRequests((auth) -> auth
.requestMatchers("/login", "/","/join").permitAll() // 이 경로에 대해서는 모든 권한을 허가한다.
.requestMatchers("/admin").hasRole("ADMIN") // 이 경로에 대해서는 해당 권한이 있는 사용자만 접근을 허가한다.
.anyRequest().authenticated() // 그 외 경로에는 로그인된 사용자만 권한을 허가한다.
);
// JWTFilter 등록
http.addFilterBefore(new JWTFilter(jwtutil), LoginFilter.class);
// 커스텀 필터 추가
http.addFilterAt(new LoginFilter(authenticationManager(authenticationConfiguration),jwtutil), UsernamePasswordAuthenticationFilter.class);
// 세션 설정
http.sessionManagement((session) -> session
.sessionCreationPolicy(SessionCreationPolicy.STATELESS) // JWT를 통한 인증/인가를 위해서 세션을 STATELESS 상태로 설정.
);
return http.build();
}
CorsMvcConfig 클래스를 하나 만들어주자.
- CorsMvcConfig
package com.example.classicHub.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class CorsMvcConfig implements WebMvcConfigurer{
@Override
public void addCorsMappings(CorsRegistry corsRegistry) {
corsRegistry.addMapping("/**").allowedOrigins("http://localhost:3000");
}
}