프로그래밍/Spring

[SpringBoot] 다른 서브 도메인간 쿠키를 교환할 때 에러 (An invalid domain [.xxx.xxx] was specified for this cookie)

들어가며

프론트 도메인인 www.ticket-auctoin.kro.kr  과 서버 도메인인 api.ticket-auction.kro.kr 간 쿠키를 교환하는데

쿠키를 받지못하는 문제가 발생했다.  해당 이유는 서버에서 cookie를 set할 때, 도메인을 따로 설정해주지 않아

서버 도메인경로로 setting이 되서 그렇다. 

 

문제

그래서 cookie를 세팅할 때, 모든 서브도메인끼리 쿠키를 공유할 수 있도록 .ticket-auction.kro.kr 로 세팅하여 보냈다.

도메인을 세팅하고 테스트를 해보니 쿠키에서 다음과 같은 에러가 발생했다.

ava.lang.IllegalArgumentException: An invalid domain [.ticket-auction.kro.kr] was specified for this cookie
        at org.apache.tomcat.util.http.Rfc6265CookieProcessor.validateDomain(Rfc6265CookieProcessor.java:239) ~[tomcat-embed-core-10.1.17.jar!/:na]
        at org.apache.tomcat.util.http.Rfc6265CookieProcessor.generateHeader(Rfc6265CookieProcessor.java:146) ~[tomcat-embed-core-10.1.17.jar!/:na]
        at org.apache.catalina.connector.Response.generateCookieString(Response.java:947) ~[tomcat-embed-core-10.1.17.jar!/:na]

 

원인

tomcat 8버전 이상에서는 Cookie Header를 파싱하는 기본 CookieProcessor가 RFC6265를 기반으로 되어있다. (org.apache.tomcat.util.http.Rfc6265CookieProcessor)
RFC6265의 속성중 하나는 아래와 같은데

5.2.3.  The Domain Attribute

   If the attribute-name case-insensitively matches the string "Domain",
   the user agent MUST process the cookie-av as follows.

   If the attribute-value is empty, the behavior is undefined.  However,
   the user agent SHOULD ignore the cookie-av entirely.

   If the first character of the attribute-value string is %x2E ("."):

      Let cookie-domain be the attribute-value without the leading %x2E
      (".") character.

   Otherwise:

      Let cookie-domain be the entire attribute-value.

   Convert the cookie-domain to lower case.

   Append an attribute to the cookie-attribute-list with an attribute-
   name of Domain and an attribute-value of cookie-domain.

 

Domain값 맨 앞자리에 “.”을 붙일 경우 “.”을 제거하고 파싱하게 된다.

 

해결

아래의 빈을 설정하여 등록해주면 된다.

@Bean
public EmbeddedServletContainerCustomizer tomcatCustomizer() {
    return container -> {
        if (container instanceof TomcatEmbeddedServletContainerFactory) {
            TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) container;
            tomcat.addContextCustomizers(context -> context.setCookieProcessor(new LegacyCookieProcessor()));
        }
    };
}

 

Refrence

https://jistol.github.io/java/2017/08/30/tomcat8-invalid-domain/

https://tomcat.apache.org/tomcat-8.5-doc/config/cookie-processor.html

728x90