HttpCookieおさらい

Webアプリケーションを動作させる際にCookieって奴はとても重要で。
例えば、SessionIDを個々のブラウザで管理することで
Serverサイドでクライアント毎のデータを保持させることができるわけです。


最近の一般的なWebアプリケーションの場合は、
Cookieを使うと言っても、上記のSessionIDくらいで
その値もAPサーバーが作成してくれるので実際の開発では
意識することは無いと思います。


昔のWebアプリケーションなんかはそれこそ
検索条件だとか、前画面で入力した情報とか
Cookieに入れとけ的な使い方をしていた記憶がありますが。



で、そのCookie
name=value
の形で格納されるのですが、
規約上、valueに含んではいけない文字があります(RFC 2109より抜粋)。
ex.) ()<>@,;:\"/[]?={}


昔のTomcatはvalueに「@」とか「=」が設定されていても問題なく読み込めるのに
最近のTomcat(5.5.26〜、6.0.16〜)だと「@」や「=」が含まれていると、無効なデータとしてぶった切られてしまいます。
ex.) 「ABCD@1234」とServlet側で設定してもブラウザには「ABCD」と渡ってしまう
それを回避する為には、valueをダブルクォートでくくらなければなりません。


TomcatをバージョンUPしたことでRFC準拠になるものの、RFCから外れてしまうCookieを設定するアプリの場合は
改修の必要があります。



valueに日本語を入れようとする場合や半角SP等を設定する場合、
URLエンコードしないと化けてしまう、
というのはお約束なのでURLエンコードすることを忘れないでしょうけど。
ですが、全てそれ以外の半角文字だからということで
URLエンコードしないのはまずい。


そもそも
Cookieのvalueをセットする箇所でURLエンコード
Cookieのvalueを参照する箇所でURLデコード
を行うことで何の問題も無くなるわけですが。


事の発端は、google.comから設定されるCookieの値に「=」が設定されてて、
この辺の文字ってCookieに使えたんだっけ?という所から
Tomcat上でアプリ作って検証し始めたらこんなことになったのですが・・・。
(GAE上でのCookieの設定はどうなるんだろ?)

【参考】
Apache TomcatとHTTPクッキーにまつわる騒動 - GeekFactory