문제 상황

Front와 협업중에 구매한 도메인을 적용했고 서버에서 데이터를 문제없이 내려주기 위해서 CORS에 해당 도메인을 등록했다. 해당 도메인을 등록하고 나니까 localhost:3000 [즉, 프론트쪽 리액트 local] 에서 spring 서버로 접근이 안되는 현상이 발생했다.

 

  • 문제 발생했을 때 코드

  • 수정된 코드

  • allowedOrigins 대신 allowOriginPatterns를 사용

일단 이렇게 해서 해결이 되긴 했는데, 이 글을 쓰면서 관련 에러를 더 찾아보니 새로운 사실을 알게 되었다.

 

원인 / 해결 방법  (추측임 , 확실하지 x)

 (어느블로그에서 본 글이기 때문에 정확한 정보라고 볼 순 없을 것 같다.)

  • AllowedOrigins()은 중복해서 사용할 수 없다. 중복할 경우 값이 계속해서 덮어씌여지면서 앞에 Setting 값들이 다 날아간다.

즉, 올바른 사용은 다음과 같다.

  • .setAllowedOrigins("http://localhost:3000", "http://--------.cloudfront.net") 으로 사용하거나
  • .setAllowedOrigins("*")를 사용해준다.

-----> 수정 !! 

  • .setAllowedOrigins("http://localhost:3000", "http://--------.cloudfront.net") 으로 사용해도 에러가 난다.
  • 결론은 setAllowedOriginPatterns 를 사용해야만 해결이 되었다 ! 

 

추가

setAllowedOriginPatterns vs setAllowedOrigins ? 

( 자료출처 스프링 공식 문서 : https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/cors/CorsConfiguration.html )

public void setAllowedOrigins(@Nullable List<String> origins)
A list of origins for which cross-origin requests are allowed where each value may be one of the following:
  • a specific domain, e.g. "https://domain1.com"
  • comma-delimited list of specific domains, e.g. "https://a1.com,https://a2.com"; this is convenient when a value is resolved through a property placeholder, e.g. "${origin}"; note that such placeholders must be resolved externally.
  • the CORS defined special value "*" for all origins

For matched pre-flight and actual requests the Access-Control-Allow-Origin response header is set either to the matched domain value or to "*". Keep in mind however that the CORS spec does not allow "*" when allowCredentials is set to true and as of 5.3 that combination is rejected in favor of using allowedOriginPatterns instead.

By default this is not set which means that no origins are allowed. However, an instance of this class is often initialized further, e.g. for @CrossOrigin, via applyPermitDefaultValues().

 

 

 

public CorsConfiguration setAllowedOriginPatterns(@Nullable List<String> allowedOriginPatterns)

 

Alternative to setAllowedOrigins(java.util.List<java.lang.String>) that supports more flexible origins patterns with "*" anywhere in the host name in addition to port lists. Examples:
  • https://*.domain1.com -- domains ending with domain1.com
  • https://*.domain1.com:[8080,8081] -- domains ending with domain1.com on port 8080 or port 8081
  • https://*.domain1.com:[*] -- domains ending with domain1.com on any port, including the default port
  • comma-delimited list of patters, e.g. "https://*.a1.com,https://*.a2.com"; this is convenient when a value is resolved through a property placeholder, e.g. "${origin}"; note that such placeholders must be resolved externally.

In contrast to allowedOrigins which only supports "*" and cannot be used with allowCredentials, when an allowedOriginPattern is matched, the Access-Control-Allow-Origin response header is set to the matched origin and not to "*" nor to the pattern. Therefore, allowedOriginPatterns can be used in combination with setAllowCredentials(java.lang.Boolean) set to true.

By default this is not set.

Since:5.3

 

정리

스프링부트 5.3부터 allowCredentials가 true일 때 allowedOrigins에 특수 값인 "*" 추가할 수 없게 되었다. 대신 allowOriginPatterns를 사용해야 한다. 

근데 이 이유때문에 발생한 오류는 아니었을 것 같다는 느낌 ... 아시는분 댓글 부탁드립니다 ! 


[ 참고 자료 ]

 

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/cors/CorsConfiguration.html 

 

CorsConfiguration (Spring Framework 6.0.4 API)

Alternative to setAllowedOrigins(java.util.List ) that supports more flexible origins patterns with "*" anywhere in the host name in addition to port lists. Examples: https://*.domain1.com -- domains ending with domain1.com https://*.domain1.com:[8080,8081

docs.spring.io

 

https://evan-moon.github.io/2020/05/21/about-cors/

 

CORS는 왜 이렇게 우리를 힘들게 하는걸까?

이번 포스팅에서는 웹 개발자라면 한번쯤은 얻어맞아 봤을 법한 정책에 대한 이야기를 해보려고 한다. 사실 웹 개발을 하다보면 CORS 정책 위반으로 인해 에러가 발생하는 상황은 굉장히 흔해서

evan-moon.github.io

 

https://cotak.tistory.com/248

 

[트러블슈팅] CORS 설정 시 allowedOrigins 에러

개요 CORS 필터를 분명 적용했는데, CORS에러가 발생해서 디버깅을 해봤더니 다음과 같은 에러가 발생했다. When allowCredentials is true, allowedOrigins cannot contain the special value "*" since that cannot be set on the "

cotak.tistory.com

 

+ Recent posts