クッキーまわりではまったので、いろいろまとめておく。
クッキーのバージョン
クッキーの仕様にはバージョン0-2まである
- ver0. ネスケが策定したもの
- ver1. ネスケの仕様をもとに厳密にしたもの。多くのブラウザがサポートしてる(RFC2019)
- ver2. さらに整理したもの?あまりサポートされてない(RFC2965)
javaの場合、v0とv1に対応しており、特にしてしなければv0の仕様に従う。
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の場合大丈夫のようだが)
余談2
RFC2019に準拠するのであれば、domain属性が.foo.comの場合、www.foo.com はクッキーを参照できるが、a.b.foo.com はクッキーを参照できない。ただし、firefoxほか多くのブラウザでは、これに準拠しておらず(ネスケ仕様のバージョン0に準拠)普通にクッキーを送ってしまう。
余談3
ネスケの仕様では、ホスト名には少なくとも3つのドットが含まれてる必要があるとある。host.hoge.ne.jpのように通常は3つあるので納得。
ヘッダについて
- ネスケ仕様によると、Set-Cookieヘッダは一度のレスポンスで何度も発行できる。
- 同じパス、同じクッキー名であってもドメイン属性が違えば違うクッキーとして扱われる。
- クライントからサーバへはクッキー本体以外の情報(属性?)は送られない。
Cookie test=hoge;
↑ max-age, secureなどの情報はない。
- Set-Cookieヘッダで削除できるのは、実際にそのクッキーが持っているドメイン情報のホストだけである。
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);
0 件のコメント:
コメントを投稿