Cookieに記録されているJSESSIONID

Tomcat6.0.18での話。

セッションをinvalidateするとCookieに記録されているJSESSIONIDが自動的に削除されるかと思っていたが、どうも削除されないようだ。以前のセッションIDが残ったままになっている。

なんか気持ち悪いので、セッションをinvalidateした後に明示的にCookieからJSESSIONIDを削除してみた。これは一見うまくいくのだが、こうしてしまうといわゆる「最初の画面でリンクのURLにセッションIDが埋め込まれてしまう問題」が発生してしまうことがある。

例えばlogout.htmlにアクセスした時にセッションをinvalidateしCookieからJSESSIONIDを削除し、login.htmlにリダイレクトするようになっているものとする。そしてlogin.htmlにアクセスした時にセッションが新たに作成されるものとする。

この場合logout.htmlにアクセスすると、そのレスポンスでCookieが削除され、かつlogin.htmlにリダイレクトされる。

次にブラウザがlogin.htmlにアクセスするのだが、Cookieは削除済みなので、JSESSIONIDがCookieとして渡されずにlogin.htmlにアクセスされることになる。なおこのアクセスによって新たにセッションが作成される。

すると、Cookieがないことから、Tomcatは「このクライアントはCookieが使えないんだ」と判断し、login.htmlをレンダリングする際に画面中のリンク(のうちHttpServletResponse#encodeURL()でエンコードされたもの)にセッションIDを埋め込むようになる。この結果、表示されたlogin.html中のリンクにはいちいちセッションIDが埋め込まれていることになるのである。

というわけで、自前でCookieからセッションIDを削除するのは止めた。うーん、あちらを立てればこちらが立たず、である。