核心差異一覽表
| 特性 | Session | Cookie |
| 儲存位置 | 伺服器端(檔案、資料庫、Redis、Memcached) | 客戶端瀏覽器(記憶體/硬碟) |
| 資料容量 | 無上限(視伺服器儲存空間) | 單一 Cookie ≤ 4KB,總數 ≤ 300 |
| 敏感資料 | 適合(不經網路傳輸資料本身) | 不適合(明文傳輸,易竊取/竄改) |
| 生命週期 | 瀏覽器關閉或伺服器 gc_maxlifetime 過期 | 可設定 Expires/Max-Age,長期追蹤 |
| 識別機制 | Session ID(透過 Cookie 或 URL 傳遞) | 直接攜帶 Key-Value |
| 跨瀏覽器/裝置 | 無法共享(Session ID 不同) | 同域名下自動共享 |
Session 運作機制
- 用戶首次請求,伺服器建立 Session,產生唯一
session_id。
- 預設透過
Set-Cookie: PHPSESSID=abc123 將 ID 存入瀏覽器會話 Cookie(無 Expires,關閉瀏覽器即失效)。
- 後續請求瀏覽器自動攜帶 Cookie,伺服器讀取 ID 載入對應 Session 資料。
- 若瀏覽器禁用 Cookie,PHP 可啟用
session.use_trans_sid=1 自動在 URL 附加 ?PHPSESSID=...(需重新編譯或設定)。
Cookie 運作機制
- 伺服器回應
Set-Cookie: name=value; Expires=...; Path=/; Domain=.example.com; Secure; HttpOnly; SameSite=Lax。
- 瀏覽器依 Domain/Path/Secure/SameSite 規則決定是否儲存、攜帶。
- 持久 Cookie(有 Expires/Max-Age)寫入硬碟,關閉瀏覽器仍保留;會話 Cookie 僅存記憶體。
Session 失效時間的雙重控制
- 客戶端:關閉瀏覽器 → 會話 Cookie 消失 → 無法再取得 Session ID → 視為 Session 結束。
- 伺服器端:
session.gc_maxlifetime(預設 1440 秒)控制資料檔案最長存活;GC 機率 gc_probability/gc_divisor 觸發清理。
- 不一致風險:用戶關閉瀏覽器 10 分鐘後重開,Session ID 已無,但伺服器資料可能尚未被 GC 清除。Google Analytics 等分析工具定義「30 分鐘無活動 = 新 Session」。
現代瀏覽器的 Session Cookie 共享行為
- Chrome、Firefox、Edge:同一瀏覽器視窗下的所有分頁/視窗共享會話 Cookie(同進程)。
- IE/Edge 舊版:可透過「檔案 → 新工作階段」建立獨立 Session。
- 隱私模式:獨立 Cookie 容器,關閉視窗即銷毀。
安全性最佳實務
<?php
// 1. 強制 HTTPS 環境下的 Session Cookie
ini_set('session.cookie_secure', 1);
ini_set('session.cookie_httponly', 1); // 防 XSS 竊取
ini_set('session.cookie_samesite', 'Lax'); // CSRF 防護
// 2. 定期重新產生 Session ID(防 Session Fixation)
session_start();
if (!isset($_SESSION['initiated'])) {
session_regenerate_id(true);
$_SESSION['initiated'] = true;
}
// 3. 敏感操作前驗證 Session 狀態
if (empty($_SESSION['user_id'])) {
header('Location: /login.php');
exit;
}
?>
Cookie 設定範例(跨子域共享)
<?php
// 允許 *.example.com 所有子域存取
setcookie('token', $jwt, [
'expires' => time() + 86400 * 30,
'path' => '/',
'domain' => '.example.com', // 開頭點號 = 含所有子域
'secure' => true, // 僅 HTTPS
'httponly' => true, // JS 不可讀
'samesite' => 'Lax', // CSRF 保護
]);
?>
選擇指南
- 用戶登入狀態、權限、購物車 → Session(安全、容量大)。
- 記住我、偏好設定、追蹤 ID、多裝置同步 → Cookie(持久、跨 Session)。
- 極敏感資料(信用卡、身分證) → 僅存在伺服器 Session,前端只存 Token。