by WebSurfer
2012年1月21日 20:23
クッキーは同名でもパスが違うと別々に保存されるようです。実は、同じ名前を付けると上書きされると誤解していて、先日、半日ぐらいハマってしまいました。(笑)
クッキーについては ASP.NET の Cookie の概要 に詳しく書いてあって、参考にしていましたが、そのあたりのことは書いてないんですよね。(逆に、名前は一意で、同じだと上書きされると書いてあったりします)
クッキーはサーバーからの応答ヘッダーの Set-Cookie: で指定してブラウザに保存させる手段と、クライアントスクリプトの document.cookie で設定する手段があります。
ASP.NET で、サーバー側から応答ヘッダーの Set-Cookie: を使ってクッキーを設定する場合は以下のようにします。
HttpCookie aCookie = new HttpCookie("TestCookie");
aCookie.Value = "Server side";
aCookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(aCookie);
この時、HttpCookie.Path を設定しないと Set-Cookie: に含まれるパス情報は path=/ となります。Path を設定するのは、フォルダまたはアプリケーションに Cookie を制限する場合のみで、普通は設定しないというのが自分の理解です。
クライアントスクリプトでクッキーを設定する場合は document.cookie を利用しますが、このとき path を省略すると、クッキーがブラウザに保存される時そのページのディレクトリがパスに設定されます。
例えば、surferonwww.info/test/abc.aspx というページでクッキーを設定するとパスは /test/ になります(/test ではないところに注意。IE9 の開発者ツールを起動して、[キャッシュ(C)]⇒[Cookie 情報を表示する(I)]で調べられます)。
今回、クライアントスクリプトで設定したクッキーを書き換えまたは削除するため、サーバーから同名のクッキーを応答ヘッダーの Set-Cookie: に設定してやりました。
ハマったのはここのところです。同名だから上書きされると思っていたところ、パスが違うので上書きされず、既存のクッキーはそのままで、Set-Cookie: で送ったクッキーが追加されただけでした。結果、書き換えも削除もできませんでした。
解決策はパスを一致させることです。path=/ とすると、そのドメインのすべてのページ要求でクッキーがサーバーに送られますが、それで問題なければ ASP.NET のデフォルト(?)の path=/ にしておくのがよさそうです。
何故なら、同名でパスが異なるクッキーが複数保存されてしまうと、消去したり内容を書き換えるためクッキーを上書きするには、当該クッキーのパスを指定しなければならず、それは結構大変だからです。また、そういう状態になってしまうと、テスト中にも想定外の動作になって混乱すると思います。