3秒でわかる
サーバー側が持っているセッションを明示的に破棄する処理。ログアウトやログイン直後の張り替えで呼び、なりすましを断ち切るために使います。
もう少し詳しく
どういうものか
session.invalidate() は、サーバーが保持しているセッションの実体と、そこに入れたすべての属性を破棄する呼び出しです。Java のサーブレット API では HttpSession#invalidate、Express の express-session では req.session.destroy が同じ役割を担います。
破棄されるのはサーバー側の記録です。呼んだ後は、そのセッション ID を持ったリクエストが来ても「知らない ID」として扱われます。
なぜ必要か
ログアウトのときに画面遷移だけして中身を消さないと、セッション ID は生き続けます。共用 PC でブラウザの戻るボタンを押されたり、ログ等から ID を拾われたりすれば、その ID でログイン済みとして扱われてしまいます。破棄はログアウトを成立させる本体です。
もう1つの用途がセッション固定攻撃への対処です。攻撃者が用意した ID を利用者に使わせておき、ログイン成功後にその ID で入り込む、という手口があります。ログインが通った直後に一度破棄して新しい ID を発行すれば、攻撃者の手元の ID は無効になります。
具体例
@PostMapping("/logout")
public String logout(HttpServletRequest request, HttpServletResponse response) {
<a href="/glossary/httpsession" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">HttpSession</a> session = request.getSession(false); // 無ければ作らない
if (session != null) {
session.invalidate();
}
Cookie cookie = new Cookie("JSESSIONID", null);
cookie.setMaxAge(0);
cookie.setPath("/");
response.addCookie(cookie); // ブラウザ側の残骸も消す
return "redirect:/login";
}つまずきやすいところ
invalidate 済みのセッションに getAttribute すると IllegalStateException が飛びますgetSession() を引数無しで呼ぶ。無ければ新しく作ってしまうので、ログアウト処理で空のセッションが増えます似た用語との違い
| 操作 | 消えるもの |
|---|---|
| invalidate | サーバー側のセッション実体と全属性 |
| removeAttribute | 指定した1つの値だけ。セッションは生きたまま |
| Cookie の削除 | ブラウザが送る ID だけ。サーバー側は残る |
覚え方
ログアウトは「画面を戻すこと」ではなく「サーバーの記憶を消すこと」。記憶を消す呼び出しが invalidate です。