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") 으로 사용해도 에러가 난다.
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 theAccess-Control-Allow-Originresponse 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, viaapplyPermitDefaultValues().
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 toallowedOriginswhich only supports "*" and cannot be used withallowCredentials, when an allowedOriginPattern is matched, theAccess-Control-Allow-Originresponse header is set to the matched origin and not to"*"nor to the pattern. Therefore, allowedOriginPatterns can be used in combination withsetAllowCredentials(java.lang.Boolean)set totrue.
By default this is not set.
Since:5.3
정리
스프링부트 5.3부터 allowCredentials가 true일 때 allowedOrigins에 특수 값인 "*" 추가할 수 없게 되었다. 대신 allowOriginPatterns를 사용해야 한다.
근데 이 이유때문에 발생한 오류는 아니었을 것 같다는 느낌 ... 아시는분 댓글 부탁드립니다 !
채팅방에 들어오는 사람마다 session ID를 갖고있는데, 이 세션 아이디를 Redis DB에 저장하는 과정에서 아래와 같은 두 가지 에러가 발생했다.
Jackson ObjectMapper를 사용해서 객체타입인 세션을 스트링타입으로 변환해주고 다시 객체타입으로 변환하는 그런 로직에 사용했는데, 이 부분에서 에러가 터진 것 같다. (추측)
1. No serializer found for class org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)
2. Null key for a Map not allowed in JSON (use a converting NullKeySerializer?)