목차

HTTP cookie와 톰캣 버전별 이슈

출처 : https://meetup.toast.com/posts/172

HTTP 쿠키

쿠키의 목적

세션 관리 (로그인)

↓ 로그인 후

개인화 (검색 결과 설정, 테마 등)

트래킹 (사용자 행동)

쿠키 만드는 방법

유저가 서버에 페이지를 요청합니다.

GET /test HTTP/1.1
Host: localhost:8080
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36
DNT: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: ko,en-US;q=0.9,en;q=0.8
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: CookieName1=Example1; Expires=Tue, 27-Nov-2018 02:53:13 GMT
Set-Cookie: CookieName2=Example2; Expires=Tue, 27-Nov-2018 02:53:13 GMT
Set-Cookie: JSESSIONID=8EB8434C5776358C84017077E11A3300; Path=/
Content-Type: text/html;charset=ISO-8859-1
Content-Language: ko
Content-Length: 316

이렇게 생성된 쿠키는 클라이언트가 서버에 요청할 때마다 브라우저가 같이 전송해줍니다.

GET /test HTTP/1.1
Host: localhost:8080
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36
DNT: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: ko,en-US;q=0.9,en;q=0.8
Cookie: JSESSIONID=8EB8434C5776358C84017077E11A3300; CookieName1=Example1; CookieName2=Example2

쿠키의 속성

Domain

Path

Expires / Max-Age

Secure

HttpOnly

쿠키의 종류

세션 쿠키

시큐어 쿠키

Http-only 쿠키

Same-site 쿠키

third-party 쿠키

좀비 쿠키

쿠키의 버전별 차이

쿠키 버전 0, 1의 차이

RFC 6265, RFC 2109의 쿠키 차이.

* This class supports both the RFC 2109 and the RFC 6265 specifications.
* By default, cookies are created using RFC 6265.

/**
* Sets the version of the cookie protocol this cookie complies with.
* Version 0 complies with the original Netscape cookie specification.
* Version 1 complies with RFC 2109.
* <p>
* Since RFC 2109 is still somewhat new, consider version 1 as experimental;
* do not use it yet on production sites.
*
* @param v
*            0 if the cookie should comply with the original Netscape
*            specification; 1 if the cookie should comply with RFC 2109
* @see #getVersion
*/
public void setVersion(int v) {
        version = v;
    }
private final String name;
private String value;

private int version = 0; // ;Version=1 ... means RFC 2109 style

//
// Attributes encoded in the header's cookie fields.
//
private String comment; // ;Comment=VALUE ... describes cookie's use
private String domain; // ;Domain=VALUE ... domain that sees cookie
private int maxAge = -1; // ;Max-Age=VALUE ... cookies auto-expire
private String path; // ;Path=VALUE ... URLs that see the cookie
private boolean secure; // ;Secure ... e.g. use SSL
private boolean httpOnly; // Not in cookie specs, but supported by browsers

톰캣 6.0~8.5 버전별 쿠키 이슈.

톰캣 6.0

6.0 쿠키 버그 리스트

DIGEST 인증이 6.0.x Manager App에서 WWW-Authenticate 헤더 중복문제로 깨지는 경우

         HTTP/1.1 401 Unauthorized
         Pragma: No-cache
         Cache-Control: no-cache
         Expires: Thu, 01 Jan 1970 10:00:00 EST
         WWW-Authenticate: Basic realm="Tomcat Manager Application"
         Set-Cookie: JSESSIONID=****removed****; Path=/manager
         WWW-AuthenticateREDUNDANT: Basic realm="Tomcat Manager Application"
         Content-Type: text/html
         Transfer-Encoding: chunked
         Vary: Accept-Encoding
         Date: Mon, 26 Mar 2012 03:39:09 GMT
         Server: Coyote

쿠키 값을 ""로 묶을 때 헤더 값이 손상되는 현상

톰캣 7.0

7.0 전체 버그 리스트

의도하지 않게 JSESSIONID가 수정되는 현상

톰캣 시작시 ClusterSingleSignOn valve의 SingleSignOnEntry 캐시가 동기화되지 않는 현상

톰캣 8.0 ~ 8.5

8.0 ~ 8.5 전체 버그 리스트

Domain 속성이 .으로 시작하면 에러가 발생하는 현상

Request.parseCookies()에서 NullPointerException이 발생하는 현상

Rfc6265CookieProcessor에서 유효한 도메인 문자가 불완전한 현상

잘못된 쿠키가 들어온 경우 Rfc6265CookieProcessor가 모든 쿠키를 무시하는 현상

모든 버전에서 발생

쿠키에 한글을 저장할 때 에러가 나는 현상

쿠키값에 =가 들어 있으면 =뒤의 문자가 잘리는 현상

쿠키값에 @가 들어 있으면 @뒤의 문자가 잘리는 현상

쿠키 Value에 +가 들어있을 때 " "(공백)으로 바뀌는 현상

쿠키 이름에 괄호가 들어가는 경우 에러가 발생하는 현상

↓ 결과

출처