2007年10月16日火曜日

クッキーメモ



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


クッキーのバージョン


クッキーの仕様にはバージョン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 件のコメント: