Webアプリ開発で頻出する「セッション」と「クッキー」
本記事ではその違いを整理します。
クッキーとは?
クッキーは ブラウザ(クライアント側)に保存される小さなデータ です。
サーバーがレスポンスヘッダで送信し、次回以降のリクエスト時に自動で送信されます。
特徴
- 保存場所:ユーザーのPC / ブラウザ
- 有効期限を設定できる(短期〜長期)
- 主に「状態を保持する」ために利用される
例:HTTPレスポンスで送られるクッキー
Set-Cookie: userId=12345; Max-Age=3600; Path=/; HttpOnly; Secure
セッションとは?
セッションは サーバー側で保持するユーザーごとの状態情報 です。
クライアントから送られてくる識別子(セッションID)をもとに、サーバーが状態を参照します。
特徴
- 保存場所:サーバーメモリ、DB、Redisなど
- 識別方法:セッションID(通常はクッキーで渡す)
- 用途:ログイン情報、カート情報、一時的な画面状態など
- 有効期間:サーバー側でタイムアウト制御
セッションとクッキーの違い(比較表)
| 項目 | セッション | クッキー |
|---|---|---|
| 保存場所 | サーバー(メモリ/DB/Redis) | クライアント(ブラウザ) |
| 識別方法 | セッションID(サーバー側でマッピング) | 名前=値 のペア |
| データ量 | 多めに保持可能(サーバー制約) | 小さい(一般に4KB程度) |
| 有効期限 | サーバー側のタイムアウトで管理 | Max-Age/Expiresでクライアント側に保存 |
| セキュリティ | セッションIDのみクッキーで渡す設計が一般的 | 直接保存するため改ざんや漏洩に注意 |
| スケーラビリティ | 外部セッションストアで共有が必要 | スケーリングに直接影響しないがサイズ制限あり |
| 用途 | 機密情報、複雑な状態保持 | 永続設定、トラッキング、簡易識別 |
Tomcatでのセッション管理
セッションタイムアウト設定(web.xml)
<web-app>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
</web-app>
JSESSIONIDのやり取り
- サーバーがセッションを作成すると、レスポンスヘッダでセッションIDを返します:
Set-Cookie: JSESSIONID=abc123; Path=/; HttpOnly
- ブラウザはこのクッキーを次回リクエストで送信し、Tomcatは対応するセッションを参照します
クッキーを直接操作する例
@RestController
public class CookieController {
@GetMapping("/set-cookie")
public String setCookie(HttpServletResponse response) {
Cookie cookie = new Cookie("theme", "dark");
cookie.setMaxAge(60 * 60 * 24 * 30); // 30日
cookie.setPath("/");
cookie.setHttpOnly(true);
response.addCookie(cookie);
return "cookie set";
}
}
設計時のポイント
- 機密情報や大量データ → セッションで管理
- ユーザー設定や識別 → クッキーで保存(署名や暗号化推奨)
- スケーラビリティ → Redis等でセッション外部化
-
セキュリティ →
HttpOnly/Secure属性、CSRF対策を実装 - セッション固定化攻撃対策 → ログイン時にセッション再生成
まとめ
- セッション:サーバー側の状態管理
- クッキー:クライアント側の小さなデータ保存
- 多くの実装では「セッションIDをクッキーで渡す」組み合わせが主流