java spring

HttpClient WARNING: Cookie rejected: Illegal domain attribute 해결방법

윤돌_99 2022. 1. 30. 12:12

 

RestTemplate을 사용하여 특정 Url을 조회하는 코드를 포함한 Spring boot 프로젝트를 서버를 배포하던 중 다음과 같은 오류가 발생하였다.

 

2022-01-28 13:17:32.243  WARN 10664 --- [  restartedMain] o.a.h.c.protocol.ResponseProcessCookies  : Invalid cookie header: "Set-Cookie: AWSALB=GLC7UzreO+rTzXNlwMuiB6mONl3Ih++VelqGEo8WUnZ8XsW7l9RwIDsOXFipfqfNFHjkWEwl2vbSpLuPj30vNHsti8uYx8pNudxsFmF2g5z5WK4dMyiAN8AKy4ng; Expires=Thu, 12 Aug 2021 04:17:32 GMT; Path=/". Invalid 'expires' attribute: Thu, 12 Aug 2021 04:17:32 GMT
2022-01-28 13:17:32.243  WARN 10664 --- [  restartedMain] o.a.h.c.protocol.ResponseProcessCookies  : Invalid cookie header: "Set-Cookie: AWSALBCORS=GLC7UzreO+rTzXNlwMuiB6mONl3Ih++VelqGEo8WUnZ8XsW7l9RwIDsOXFdpbqzNFHjlWEwl2vbSpLuPj70vNHsti8uYx8pNudxsFmF2f5x5WK4dMyiAN8AKy4ng; Expires=Thu, 12 Aug 2021 04:17:32 GMT; Path=/; SameSite=None; Secure". Invalid 'expires' attribute: Thu, 12 Aug 2021 04:17:32 GMT

 

정확한 원인은 알아내지 못하였지만, 구글링을 통해 RestTemplate의 Default cookie 설정이 문제가 되어 발생하는 것 같다.

그래서 구글링 들과 회사 사수분의 조언을 따라 HttpClient Cookie 설정을 수정하여 문제를 해결하였다.

각각 상황에 따라 cookie 사양을 설정하여 문제를 해결해야 하는 것 같다.

하지만 나는 경우에서는 굳이 cookie를 추가할 필요가 없어서 disableCookieManagement()로 내부 쿠키 처리를 비활성화하였다.

 

 

<기존 코드>

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<?> entity = new HttpEntity<>(headers);

response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);

 

<변경 후 코드>

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<?> entity = new HttpEntity<>(headers);

HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setReadTimeout(5000);
factory.setConnectTimeout(3000);

CloseableHttpClient httpClient = HttpClientBuilder.create()
            .setMaxConnTotal(100)
            .setMaxConnPerRoute(5)
            .disableCookieManagement() // 쿠키 설정 비활성화
            .build();
factory.setHttpClient(httpClient);
RestTemplate restTemplate = new RestTemplate(factory);

response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);

 

회고

- RestTemplate 작동 원리 알아보기 (HttpClient, HttpHeader)