Apache Tomcat Cookie 관련 설정
1. SameSite
1.1. 개요
CSRF(Cross Site Request Forgery) 와 관련된 보안 설정이다.
1.2. 지원하는 버전
Apache Tomcat 9.0.28 혹은 8.5.48 이상만 지원한다.
1.3. 설정 방법
context.xml 의 <Context>
아래에 다음의 내용을 추가하면, 모든 Context 에 반영된다.
<CookieProcessor sameSiteCookies="strict" />
sameSiteCookies 속성은 다음과 같은 값을 가질 수 있다.
- unset : 기본 값이다. 웹브라우저에 SameSite 값을 보내지 않는다. 웹브라우저가 알아서, 과거의 버전은 None 으로 비교적 최근 버전은 Lax 를 기본 값으로 처리할 것이다.
- strict : 웹브라우저에 SameSite 값을 Strict 로 보낸다.
- lax : 웹브라우저에 SameSite 값을 Lax 로 보낸다.
- none : 웹브라우저에 SameSite 값을 None 로 보낸다.
<CookieProcessor>
는 className
속성도 가질 수 있고(그 값은 아마도 다음 중 하나일 것이다),
생략된 경우 Apache Tomcat 의 버전에 따라 오래된 버전은 LegacyCookieProcessor 로, 비교적 최신의 버전이라면,
Rfc6265CookieProcessor 로 처리된다.
- org.apache.tomcat.util.http.Rfc6265CookieProcessor
- org.apache.tomcat.util.http.LegacyCookieProcessor
partitioned 속성은 Tomcat 9.0.85 부터 지원한다(Apache Tomcat 9 Changelog 참조).
1.4. 문제해결
Apache Tomcat < 9.0.2
8 (혹은 < 8.5.48
) 이라면 catalina.out (catalina.2024-10-25.log) 에서 다음과 같은 로그를 발견할 수 있다.
org.apache.tomcat.util.digester.SetPropertiesRule.begin Match [Context/CookieProcessor] failed to set property [sameSiteCookies] to [none]
partitioned 속성도 기술했다면 다음과 같은 로그도 발견할 수 있다. 9.0.28 <= Tomcat < 9.0.85
이라면 다음과 같은 로그만 발견된다.
org.apache.tomcat.util.digester.SetPropertiesRule.begin Match [Context/CookieProcessor] failed to set property [partitioned] to [true]
1.5. 관련된 주제 - AJAX 요청에 대해서
웹브라우저가 비교적 최근 버전이라면 SameSite 가 None 이라고 하더라도 AJAX 요청에서는 Cookie 를 보내지 않는다.
AJAX 요청에서는 Cookie 가 필요하지 않은 경우에도 Access-Control-Allow-Origin 헤더가 없다면, 이를 처리 할 수는 없다.
2. Secure, HttpOnly
<cookie-config> <http-only>true</http-only> <secure>true</secure> </cookie-config>