まず、クライアント側のCookieとサーバー側のセッションを区別することが重要です(すでにご存知だと思います)。
通常、クリーンなログアウトを行うsession.invalidate()
には、サーバー側とCookies.removeCookie(...)
クライアント側で呼び出す必要があります。
しかし、すべての「ログアウト」がクリーンであるとは限りません。
- ログアウト要求がサーバーに到達しない場合があります
- removeCookieを呼び出す前でもブラウザがクラッシュする可能性があるため、ウィンドウを閉じたときにCookieを削除しようとすると信頼性が低下します
サーバー側では、タイムアウトを使用できます(@thinksteepが提供するリンク:ブラウザーのcloseイベントでログアウトサーブレットを呼び出す方法を参照してください)。
クライアント側のCookieには、expiryDate/maxAgeを設定できます。または、「セッションCookie」を使用することもできます。これらは、有効期限またはmaxAgeをまったく設定しないCookieです。ほとんどのブラウザは、ブラウザの再起動時に「セッションCookie」を自動的に削除しますが、 FirefoxセッションCookieを参照してください。
これはすべて、Cookieがユースケースに最適なテクノロジーではない可能性があることを意味している可能性があります。一般に、Cookieはすべてのブラウザタブで利用できるように設計されており、ブラウザセッションの概念はブラウザが常に終了するとは限りません。 / windowが閉じます(とにかくスマートフォンではどういう意味ですか?)。これは現在の多くのWebサイトにとって望ましいことであり(ユーザーは毎回明示的にログインする必要はありません)、多くのユーザーがこの種の動作を期待するようになっています。
「1つのタブ=1つのセッション」ポリシーが必要なサイトの場合、トークンをJavascript(またはGWT)オブジェクトなどに保存し、リクエストごとに送信することをお勧めします。このようにして、複数のブラウザタブから個別にログインできます(ユーザーが異なっていても)。タブを閉じると、トークンは失われます。セッションの復元時に、ブラウザによってタブが復元される場合があることに注意してください。(特定の種類の攻撃を回避するために、私は常にこの手法をhttponly cookieと組み合わせます。)