Tomcat7 とRFC違反のCookie


業務の都合で、Tomcat7でRFC違反のCookieを発行しなければならなくなった。
具体的には、値に"="を含むCookieをダブルクォートで囲まずに発行せよ、とのことである。

Tomcat7では通常RFCに従い、"="のような特殊なセパレータ文字を含むCookie値が許可されることはなく、ダブルクォーテーションによって囲まれる。
これを嫌い、ダブルクォートで囲まれないようにするための実装について記す。

Tomcat 7 では(Tomcat HOME)/conf/catalina.propertiesに記載された設定値によって、発行するCookieに以下のように制約が生じる。

なお、デフォルトでは両設定値ともfalseとなる。

パターン①
org.apache.tomcat.util.http.ServerCookie.ALLOW_HTTP_SEPARATORS_IN_V0=true
org.apache.tomcat.util.http.ServerCookie.FWD_SLASH_IS_SEPARATOR=false
又は
org.apache.tomcat.util.http.ServerCookie.ALLOW_HTTP_SEPARATORS_IN_V0=true
org.apache.tomcat.util.http.ServerCookie.FWD_SLASH_IS_SEPARATOR=true

  →',', ';', ' ', '\t'が含まれている場合ダブルクォートで囲う

パターン②
org.apache.tomcat.util.http.ServerCookie.ALLOW_HTTP_SEPARATORS_IN_V0=false
org.apache.tomcat.util.http.ServerCookie.FWD_SLASH_IS_SEPARATOR=false

  → '\t', ' ', '\"', '(', ')', ',',':', ';', '<', '=', '>', '?', '@', '[', '\', ']', '{', '}'が含まれている場合ダブルクォートで囲う

パターン③
org.apache.tomcat.util.http.ServerCookie.ALLOW_HTTP_SEPARATORS_IN_V0=false
org.apache.tomcat.util.http.ServerCookie.FWD_SLASH_IS_SEPARATOR=true

  →パターン②に加え、'/'が含まれている場合にはダブルクォートで囲う。

従って、Tomcat 7系では"="に限らず、主要なセパレータを含む値をCookieにセットしたい場合、org.apache.tomcat.util.http.ServerCookie.ALLOW_HTTP_SEPARATORS_IN_V0をtrueにセットすることで目的を達成することが出来る。

なお、TomcatでこれらRFC違反のCookieを受け付けられるか、という点は未検証である。
従って別途注意が必要である。
 ※恐らく上記設定値に従うと思われるが。。。

私が参考にしたのはTomcat Ver 7.0.47のソースコードであるが、恐らく7系ではこの制約は同じものと思われる。
細かいマイナーバージョンでの動作を確認したい場合は、各自ソースコードを参照されたし。

なお、Tomcat v6やv8のソースコードは読んでいないため、仕様が本記事と異なる可能性がある。