クッキーメモ
クッキーまわりではまったので、いろいろまとめておく。
クッキーのバージョン
クッキーの仕様にはバージョン0−2まである
- ver0. ネスケが策定したもの
- ver1. ネスケの仕様をもとに厳密にしたもの。多くのブラウザがサポートしてる(RFC2019)
- ver2. さらに整理したもの?あまりサポートされてない(RFC2965)
domain値について
- domain属性を省略した場合は、そのクッキーをセットしたサーバのホスト名がブラウザに設定される。
- domain属性にホスト名を設定した場合、ブラウザ側で勝手にドットがつく。これはRFCに準拠してると思われる。
- 普通はdomain属性は設定してはいけない。domain属性を設定するのは、共通ドメインでクッキーを共用したいときのみである。
通常明示的にdomain属性を指定するのは、host.hoge.ne.jp など、hoge.ne.jpドメインのすべてのホストでクッキーを利用したい場合などに限るようである。したがって、host.hoge.ne.jpのCGIが
と設定した場合、保存されるクッキーは
domain=host.hoge.ne.jp
.host.hoge.ne.jp
となる。このため、クッキーはホスト名として保存されるのではなく、ドメイン名として保存される。
このように、特にクッキーを共用するのでなければdomain属性は省略すべきである。
余談1
最新の仕様であるRFC2965でもdomain属性を省略したときは、ホスト名となっている(ドットではじまらない)。
domain属性に設定するべきは、フルスペルのホスト名ではなくドメインのみである(host.hoge.comであれば.hoge.com)。
domain属性にホスト名をそのまま送ってしまうと、RFC2965に準拠している場合、次回から受け取れなくなってしまう。
(firefoxの場合大丈夫のようだが)
ヘッダについて
- ネスケ仕様によると、Set-Cookieヘッダは一度のレスポンスで何度も発行できる。
- 同じパス、同じクッキー名であってもドメイン属性が違えば違うクッキーとして扱われる。
- クライントからサーバへはクッキー本体以外の情報(属性?)は送られない。
↑ max-age, secureなどの情報はない。
Cookie test=hoge;
hoge.com のクッキーであれば、aaa.hoge.com, bbb.hoge.com の各ホストでクッキーを削除できるが、
aaa.hoge.com のクッキーは bbb.hoge.com のクッキーは削除できない。そもそもクライアントからクッキーが送られてこない。
Java Tips
下記のように、同じクッキオブジェクトで2回addCookieしすると最後のaddCookieのみ有効になり、2つクッキーは発行されないので注意
Cookie cookie = new Cookie("test", "hoge");
cookie.setMaxAge(COOKIE_AGE);
cookie.setDomain(request.getHeader("Host"));
response.addCookie(cookie);cookie.setValue("fuga");
cookie.setMaxAge(COOKIE_AGE);
cookie.setDomain(null);
response.addCookie(cookie);