안녕하세요. 오개발입니다.
MSA 구축중 프론트 개발자와 협업 도중 포스트맨과 테스트를 진행하고 api를 공유해드렸는데,
그와중에 CORS 문제가 나타나 메신져를 주셨다.

총 두번의 오류가 났었다.
첫번째로 ~header is present on the requested resource
두번째 에러 ~ but only one is allowed.
결론적으로 첫번째 에러만 해결하면.. 두번째 에러는 금방 해결했다.
첫번째

gateway 자체가 접근이 안되는 이슈였다. 그래서 내가 체크 했던 방법은 다음과 같다.
1. gateway로 접근하지말고 바로 service api로 호출 해볼것
-> service api 에서 cors 허용 코드를 넣어 결론적으로 직접 붙어서 호출하더니 잘되었다. ( 이런짓은 하지마세요 뒤에 이야기 나옴)
2. 공식 문서에 나타난 방법으로 시도
-> 이 방법도 시도를 했으나 내 환경은 docker 기반으로 서버가 올라가 있고 프론트 개발자는 로컬에서 api를 호출하는 상태였다.
서버 프론트 서버를 올리기전이고 해당 프론트 개발자는 localhost 호스트라.. 애매하였다.. ( 실제로 넣어보고 테스트 하였다 )
결론은 다 실패..
구글링 하다가 나온 결론
Use Spring Gateway and getting error: 'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allo
I am using Spring Gateway framework and configured as follows. gateway: default-filters: - DedupeResponseHeader=Access-Control-Allow-Origin globalcors: cors-configurations: '[/**...
stackoverflow.com
cloud:
gateway:
default-filters:
- DedupeResponseHeader=Access-Control-Allow-Origin Access-Control-Allow-Credentials, RETAIN_UNIQUE
globalcors:
corsConfigurations:
'[/**]':
allowed-origins: "*"
allowed-methods: "*"
allowed-headers: "*"
allow-credentials: false
구글링에 allow-credentials 값을 true라고 명시가 되어 있습니다. 하지만 특정 도메인 허용이 아닌 전체 허용이기 때문에 false로 하였습니다.
그거 외에 코드도 추가 하였습니다.. 사실 정확하게 테스트 해보진 않았습니다만 둘중 한군대만 해도 되는지
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
import java.util.Arrays;
import java.util.Collections;
@Configuration
public class CorsConfiguration extends org.springframework.web.cors.CorsConfiguration{
@Bean
public CorsWebFilter corsWebFilter() {
final CorsConfiguration corsConfig = new CorsConfiguration();
corsConfig.setAllowedOrigins(Collections.singletonList("*"));
corsConfig.setMaxAge(3600L);
corsConfig.setAllowedMethods(Collections.singletonList("*"));
corsConfig.addAllowedHeader("*");
corsConfig.setAllowedOriginPatterns(Collections.singletonList("*"));
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", corsConfig);
return new CorsWebFilter(source);
}
}
이렇게 설정하여 실행해보니 오류 내용이 변경되었다.
두번째 이슈는 읽어보면 비교적 간단했다.
중복된 cors 설정때문이다.
api-gateway에서 service를 호출하는 구성으로, Spring boot로 application server를 구성했을 경우 api-gateway와 service두곳에 cors 설정을 하게되면 중복으로 Access-Control-Allow-Origin가 header에 붙게된다.
따라서 multiple values 에러가 발생하게 된다.
결론적으로 service에 설정 되어 있는 cors config코드를 제거 하였습니다.