Laravel Session vs Cookie

介紹

說明

  • Session 是用來「識別使用者」並「保存狀態」的機制,儲存位置依設定可為檔案、資料庫、RedisMemcached 等。Laravel 預設使用檔案儲存,位置為 storage/framework/sessions/

  • Cookie 是一種瀏覽器端的儲存機制,適合用來保存非敏感的使用者偏好資料,如語系、主題等。

比較

比較項目 Session (檔案儲存) Cookie
儲存位置 伺服器端 (storage/framework/sessions/) 使用者瀏覽器端
安全性 僅儲存 Session ID,實際資料在伺服器,較安全 整份資料在瀏覽器中,易被竄改
資料大小 依儲存媒介而定,理論上無明確限制 最多約 4KB
存取方式 Laravel 透過 Session ID 存取伺服器端資料 瀏覽器直接附帶 Cookie 資料
生命週期 由 Laravel 設定 SESSION_LIFETIME 控制 可自訂 expiresmax-age
適用場景 儲存登入資訊、購物車、權限資訊等敏感資料 儲存語言、佈景主題等非敏感資料

運作方式

Session(檔案)運作方式

  1. 使用者首次造訪網站:

    • Laravel 產生一組 Session ID,例如 abcdef123456
    • 將該 Session ID 寫入瀏覽器的 Cookie(名稱通常為 laravel_session)。
    • Laravel 將對應資料寫入 storage/framework/sessions/abcdef123456
  2. 使用者再次發送請求:

    • 瀏覽器自動附帶 laravel_session=abcdef123456
    • Laravel 擷取此 ID,讀取對應的 session 檔案內容以取得使用者狀態資料。

🚀 實際的資料存於伺服器,Cookie 僅用來儲存識別碼,因此較安全且使用者無法竄改。

// Laravel 設定 Cookie(Queue 方式會在回應時設定)
Cookie::queue('user_lang', 'zh-TW', 60); // 存放 60 分鐘
// 瀏覽器接收到的 Set-Cookie 標頭:
Set-Cookie: user_lang=zh-TW; expires=Wed, 20 Mar 2025 12:00:00 GMT;
// 使用者下一次請求時會自動帶上:
Cookie: user_lang=zh-TW

🚨 Cookie 資料完全儲存在使用者瀏覽器中,容易被修改,因此不建議儲存登入狀態、權限或敏感資料

延伸補充

  • Laravel 使用 EncryptCookies 中介層會自動加密與解密 Cookie,使其內容在用戶端無法直接讀取,但仍可能被竄改並重新加密,因此安全性不如 Session。
  • 若需跨請求維持狀態,推薦使用 Session;若為個人化 UI 偏好,則可使用 Cookie

🧠 參考文件: