Spring Cloud를 통해 MSA 환경을 구축하면서 Cors를 어디에 설정해야 하는지 의문이었습니다.
클라이언트와 통신하는 Gateway에만 설정하면 되는지? 아니면 클라이언트와 데이터를 주고받는 각 마이크로 서비스에도 Cors 설정이 필요한지 궁금했습니다.
위 내용을 공부하고 실제 서비스에 적용해보며, 의문이었던 점들을 정리하였습니다.
Spring Cloud Gateway CORS 이슈
👉 Spring Cloud Gateway에서 Cors 설정을 게이트웨이 서버에만 하면 되는지, Spring cloud 내부에도 Cors 설정이 필요한지 궁금했다.
우리의 프론트 - 백엔드 서비스 환경은 대략 아래와 같다.
- Kubernetes
- Next.js
- spring cloud gateway
- spring cloud config
- spring cloud service (n)
MSA 환경에서 Cors 설정을 각각의 서비스에 설정해야 하는지, 클라이언트와 통신하는 Gateway server에만 설정을 하면 되는지 의문이었다.
일단은 클라이언트와 통신을 담당하는 Gateway에만 CORS를 설정하여 진행해 보았다.
CORS 문제
👉 나는 일단 Corsfig.class를 Gateway server에만 작성하여 클라이언트와의 통신이 가능하게 설정했다.
방법 1
@Configuration
public class CorsConfig {
@Bean
public CorsWebFilter corsWebFilter() {
return new CorsWebFilter(corsConfigurationSource());
}
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(List.of("*"));
configuration.setAllowedMethods(List.of("*"));
configuration.setAllowedHeaders(List.of("Authorization", "Authorization-refresh"));
configuration.setAllowCredentials(true);
configuration.setMaxAge(3600L);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
}
Spring Cloud Gateway는 reactive-gateway를 의존성을 추가한 webflux 통신 상태이다. 그러므로 corsfilter를 등록할 때, cors.reactive 라이브러리 필터를 사용해 설정해야 한다.
import org.springframework.web.cors.reactive.CorsWebFilter;
방법 2
CorsWebFilter 말고 gateway에서 지원해 주는 기능으로, application.yml에 작성할 수도 있다.
spring:
cloud:
gateway:
globalcors:
cors-configurations:
"[/**]":
allow-credentials: true
allowed-origins:
- "*"
allowed-headers:
- Authorization
- Authorization-refresh
allowed-methods:
- PUT
- GET
- POST
- DELETE
- PATCH
위와 같은 형태로 yml에 globalcors를 설정할 수도 있다.
Spring Cloud Gateway Cors 해결
👉 구글링과 GPT 질문을 통해 궁금했던 사항을 정리하였습니다.
QnA: 클라이언트는 게이트웨이만 통신하고 나머지는 게이트웨이랑 cloud service랑만 통신하는데 spring cloud에서는 cors 설정이 필요 없는지?
Gateway에만 CORS 설정을 합니다.
MSA의 설계 목표 중 하나로 각각의 마이크로 서비스는 독립적으로 배포되고 확장되어야 합니다. 또한, 클라이언트는 마이크로 서비스의 위치를 알 필요 없이 Gateway의 위치만 알면 되기 때문에 Cors를 Gateway에만 설정합니다.
MSA에서 Gateway는 클라이언트와 마이크로서비스 간의 중개자 역할을 합니다.
클라이언트가 Gateway에 요청을 보내면, Gateway는 이를 해당하는 마이크로 서비스로 라우팅 하여 요청을 처리합니다. 이때 게이트웨이가 마이크로 서비스 간의 중개 역할을 하기 때문에, 클라이언트와 마이크로서비스 간의 출처가 같은 것처럼 동작하여, 각 서비스의 CORS 설정을 하지 않아도 됩니다.
QnA: Cors와 같은 출처가 무엇인지 정확히 파악하기
CORS(Cross-Origin Resource Sharing)는 웹 애플리케이션에서 발생하는 보안 정책으로, 웹 브라우저에서 실행되는 스크립트가 다른 출처(origin)의 리소스에 접근하는 것을 제한합니다.
'Spring Framework > Spring Cloud' 카테고리의 다른 글
[Spring Cloud] Spring에서 Feign Client에 공통 Header 설정하기: Configuration을 활용 방법 (0) | 2024.04.08 |
---|---|
[Spring Cloud] Spring Cloud에서 OpenFeign 사용하기: RESTful 서비스 간 통신 방법 (0) | 2024.04.08 |