Session 與 Cookie 是 Web 開發中維持用戶狀態的兩大核心機制。本文系統梳理 PHP 中兩者的操作方法、底層差異、安全考量與最佳實踐,適合初學者建立正確認知,也供進階開發者查漏補缺。
session_idsession_id 儲存於客戶端 Cookie(預設名 PHPSESSID)session_id,伺服端識別用戶並載入資料鐵律:session_start() 之前不能有任何輸出(含空白、BOM、HTML),否則拋出 headers already sent 錯誤。
'Hello',
'url' => 'https://example.com',
'type' => 'website'
];
?>
// 刪除單個鍵
unset($_SESSION["name"]);
// 清空當前會話所有資料(保留 session_id)
$_SESSION = array();
// 或
session_unset();
// 徹底銷毀會話(含伺服端資料、session_id、客戶端 Cookie)
session_destroy();
// 完整銷毀流程(官方推薦)
session_start();
$_SESSION = array();
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
session_destroy();
Set-Cookie 寫入客戶端Cookie 標頭| 維度 | Session | Cookie |
|---|---|---|
| 儲存位置 | 伺服端 | 客戶端 |
| 資料大小 | 無實質限制 | ≤ 4KB |
| 安全性 | 高(資料不暴露) | 低(可被竄改/竊取) |
| 生命週期 | 瀏覽器關閉或 gc_maxlifetime | 可設定長期有效 |
| 跨域支援 | 需額外配置 | 受同源策略限制 |
session_regenerate_id(true) 防止 Session Fixation 攻擊Secure、HttpOnly、SameSite=Strict/Laxsession.save_handler)session.gc_maxlifetime 與 session.gc_probabilitysession_start() 位置、Cookie 是否被瀏覽器阻擋、磁碟空間是否滿、session.save_path 權限session.cookie_domain = ".example.com"Session 負責伺服端業務狀態,Cookie 負責客戶端識別與持久化偏好。理解兩者機制差異、正確配置安全屬性、選擇適合架構的儲存後端,是構建穩健 Web 應用的基石。