서브렛을 사용하여 SameSite Cookie 설정

개요


2021년 4월까지 서브렛의 사양 범위 내에서는 쿠키의 SameSite 속성을 설정할 수 없습니다.
따라서 각 응용 서버(소파 컨테이너)에 의존해 준비하는 독특한 방법이 필요하다.
이 글에는 Tomcat9, WildFrly 23.0.0이 있다.Final, Jetty 9을 사용하여 각각 SameSite 속성을 설정하는 방법을 봅니다.
다음 창고clone를 미리 준비하세요.
  • https://github.com/backpaper0/servlet-samesite-cookie-demo
  • 이것은 소파를 포함하는 웹 응용 프로그램이다.
    소파 시기에 세션을 가져와 세션 ID를 추가한 쿠키를 발행한다.
    또 이름demo은 명시치foobar의 쿠키다.
    쿠키 2개를 발매한 셈이다.
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
    
        // Cookieを返すためにセッションを作る
        req.getSession();
    
        // 明示的なCookieの追加もしておく
        Cookie cookie = new Cookie("demo", "foobar");
        resp.addCookie(cookie);
    
        resp.setContentType("text/plain");
        try (PrintWriter out = resp.getWriter()) {
            out.print("Hello, world!");
            out.flush();
        }
    }
    

    Tomcat


    Tomcat에는 읽기 및 쓰기 쿠키org.apache.tomcat.util.http.CookieProcessor 인터페이스가 있습니다.
    설치 클래스org.apache.tomcat.util.http.Rfc6265CookieProcessor를 설정하여 SameSite 속성을 작성할 수 있습니다.
  • https://tomcat.apache.org/tomcat-9.0-doc/config/cookie-processor.html
  • 다음 내용으로 WAR 파일에서 제작META-INF/context.xml(즉 마븐이 구축되기 전src/main/webapp/META-INF/context.xml입니다.
    <?xml version="1.0" encoding="UTF-8"?>
    <Context>
      <CookieProcessor
          className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
          sameSiteCookies="none"/>
    </Context>
    
    mvn package로 WAR 파일을 제작하고 다음 명령으로 Tomcat을 실행하여 WAR 파일을 처리한다.
    docker run --rm -p 8080:8080 \
           -v $PWD/target/demo.war:/usr/local/tomcat/webapps/demo.war \
           tomcat:9
    
    curl를 통해 동작을 확인한다.
    curl -vL localhost:8080/demo
    
    응답에서 Set-Cookie 제목을 발췌합니다.
    < Set-Cookie: JSESSIONID=310DBCB36C68017E053650569D93D431; Path=/demo; HttpOnly; SameSite=None
    < Set-Cookie: demo=foobar; SameSite=None
    
    SameSite 속성이 설정되어 있습니다.

    WildFly


    WildFly 는 버전 19 에서 SameSite 를 지원합니다.
  • https://www.wildfly.org/news/2020/05/04/WildFly-1910-Released/
  • 다음 내용 제작WEB-INF/undertow-handlers.conf.
    samesite-cookie(mode=none)
    
    는 Tomcat과 같은 경우mvn package로 WAR 파일을 만들어 동작 확인을 한다.
    docker run --rm -p 8080:8080 \
           -v $PWD/target/demo.war:/opt/jboss/wildfly/standalone/deployments/demo.war \
           jboss/wildfly:23.0.0.Final
    
    와 Tomcat의 상황은 같고 실행curl 확인Set-Cookie 응답 헤드.
    < Set-Cookie: JSESSIONID=4WORL56grEURqybqfuSqRSnwkRxnzUCt516a1iGm.7b70a942134b; path=/demo; secure; SameSite=None
    < Set-Cookie: demo=foobar; secure; SameSite=None
    
    SameSite 속성이 설정되어 있습니다.

    Jetty


    마지막은 제티야.web.xml에서 comment 요소cookie-config의 하위 요소)에 대해 특정한 주석을 설정하는 불가사의한 방법으로 (솔직히 별로 좋아하지 않는 방법을) 실현했다.
    <session-config>
      <cookie-config>
        <comment>__SAME_SITE_NONE__</comment>
      </cookie-config>
    </session-config>
    
    mvn package에서 WAR 파일을 만들어 동작 확인을 한다.
    docker run --rm -p 8080:8080 \
           -v $PWD/target/demo.war:/var/lib/jetty/webapps/demo.war \
           jetty:9
    
    실행curl을 통해 얻은 Set-Cookie 응답의 첫 부분은 다음과 같다.
    < Set-Cookie: JSESSIONID=node07t0uojz6ahpu17u2eknzti9dl0.node0; Path=/demo; SameSite=None
    < Set-Cookie: demo=foobar
    
    위에서 설명한 대로 세션 ID에는 SameSite만 포함되어 있습니다.
    명시적으로 작성된 쿠키는 코드로 주석을 설정해야 합니다.
    cookie.setComment("__SAME_SITE_NONE__");
    
    동작을 재확인한 후demo=foobar에도 SameSite 속성이 첨부되어 있습니다.
    < Set-Cookie: JSESSIONID=node02lu7plc1tgx51vwiwqigcr75n0.node0; Path=/demo; SameSite=None
    < Set-Cookie: demo=foobar; SameSite=None
    
    이상.

    좋은 웹페이지 즐겨찾기