首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Session 與 Cookie 差異深度解析:儲存位置、生命週期、安全性與實務應用

     編輯:PHP 綜合知識

核心差異一覽表

特性SessionCookie
儲存位置伺服器端(檔案、資料庫、Redis、Memcached)客戶端瀏覽器(記憶體/硬碟)
資料容量無上限(視伺服器儲存空間)單一 Cookie ≤ 4KB,總數 ≤ 300
敏感資料適合(不經網路傳輸資料本身)不適合(明文傳輸,易竊取/竄改)
生命週期瀏覽器關閉或伺服器 gc_maxlifetime 過期可設定 Expires/Max-Age,長期追蹤
識別機制Session ID(透過 Cookie 或 URL 傳遞)直接攜帶 Key-Value
跨瀏覽器/裝置無法共享(Session ID 不同)同域名下自動共享

Session 運作機制

  1. 用戶首次請求,伺服器建立 Session,產生唯一 session_id。
  2. 預設透過 Set-Cookie: PHPSESSID=abc123 將 ID 存入瀏覽器會話 Cookie(無 Expires,關閉瀏覽器即失效)。
  3. 後續請求瀏覽器自動攜帶 Cookie,伺服器讀取 ID 載入對應 Session 資料。
  4. 若瀏覽器禁用 Cookie,PHP 可啟用 session.use_trans_sid=1 自動在 URL 附加 ?PHPSESSID=...(需重新編譯或設定)。

Cookie 運作機制

  1. 伺服器回應 Set-Cookie: name=value; Expires=...; Path=/; Domain=.example.com; Secure; HttpOnly; SameSite=Lax。
  2. 瀏覽器依 Domain/Path/Secure/SameSite 規則決定是否儲存、攜帶。
  3. 持久 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。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved