2015年6月11日木曜日

Tomcat7 とRFC違反のCookie

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

通常、TomcatのサーブレットはHttpServletResponseに定義されたaddCookieメソッドを用いる。
但し厳密にはHttpServletResponseはInterfaceであるから、通常はこれを実装したorg.apache.catalina.connector.Responseを用いる。

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

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

パターン①
org.apache.tomcat.util.http.ServerCookie.ALLOW_HTTP_SEPARATORS_IN_V0が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 Ver 7.0.47のソースコードであるが、恐らく7系ではこの制約は同じものと思われる。
細かいマイナーバージョンでの動作を確認したい場合は、各自ソースコードを参照されたし。

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

私も技術的には非常に未熟であるため、誤っている点があれば是非ご教示頂きたい。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。