문제 상황
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 )
- 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().
- 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://evan-moon.github.io/2020/05/21/about-cors/
'Coding > Spring' 카테고리의 다른 글
[52] Spring boot Logging(@Slf4j) (0) | 2023.01.17 |
---|---|
[51] 트러블 슈팅 : (WebRTC) Error parsing HTTP request header (0) | 2023.01.13 |
[49] 트러블 슈팅 : JWT signature does not match locally computed signature (1) | 2023.01.12 |
[48] 트러블슈팅 : No serializer found for class (Spring Boot) 해결못함 ^_^ (0) | 2023.01.11 |
[47] Enum (0) | 2023.01.10 |