クッキーメモ

クッキーまわりではまったので、いろいろまとめておく。

クッキーのバージョン

クッキーの仕様にはバージョン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);