HTTP 無狀態,Cookie 與 Session 是維持會話的兩大基石。本文系統講解原理、API、配置、存儲介質、安全防範、跨域共享、銷毀策略。
Set-Cookie 標頭寫入瀏覽器,瀏覽器後續請求自動攜帶 Cookie 標頭。setcookie('name', 'value', time()+86400, '/', 'example.com', false, true); 參數依次:名、值、過期時間戳、路徑、域名、僅 HTTPS、HttpOnly。$_COOKIE['name'](超全局)。setcookie('name', '', time()-3600) 或 setcookie('name', '')。PHPSESSID 作為索引鍵。session_start() 必須在輸出前調用。$_SESSION['user'] = $data; $name = $_SESSION['user']['name'];。session_unset() 清空變量,session_destroy() 刪除存儲文件/記錄。session.save_handler = files|redis|memcachedsession.save_path = "/tmp" 或 "tcp://127.0.0.1:6379"session.gc_maxlifetime = 1440(垃圾回收壽命)session.cookie_httponly = 1、session.cookie_secure = 1(HTTPS)| 項目 | Cookie | Session |
|---|---|---|
| 存儲位置 | 客戶端瀏覽器 | 服務端(文件/內存/DB) |
| 容量 | ~4KB | 受限於服務端記憶體/磁盤 |
| 安全性 | 可被竄改、偷取(XSS/CSRF) | 數據不暴露,僅 ID 傳輸 |
| 生命週期 | 可設定長期 | 通常短期,瀏覽器關閉即失效(除非設定持久 Cookie) |
| 跨域 | 需 domain 設置 | 需共享存儲 + 同域 Cookie |
session_regenerate_id(true) 防固定攻擊。headers already sent:session_start()/setcookie() 前有輸出(空白、BOM、echo),用 ob_start() 緩衝。session.save_path 權限、磁盤滿、session.auto_start 衝突。session.cookie_domain = ".example.com",子域同樣 session_start()。