Cookie(客戶端)與 Session(伺服器端)是 Web 狀態管理的兩大基石,本文系統整理原理、設定、傳遞機制與常見問題。
| 特性 | Cookie | Session |
|---|---|---|
| 儲存位置 | 客戶端瀏覽器 | 伺服器端(記憶體/State Server/SQL Server) |
| 資料型別 | 字串 | Object(需型別轉換) |
| 容量 | ~4KB/域名 | 視伺服器記憶體/資料庫而定 |
| 安全性 | 明文,不宜存敏感資訊 | 較高,不直接暴露給用戶端 |
| 生命週期 | 可設定過期日 | 會話結束或 Timeout (預設 20 分鐘) |
| 典型用途 | 「記住我」、用戶偏好設定 | 購物車、使用者權限、多步驟精靈 |
<sessionState mode="InProc" timeout="20" cookieless="true"
stateConnectionString="tcpip=localhost:42424"
sqlConnectionString="" />
mode:InProc(進程內)、StateServer、SQLServer、Customcookieless:true 將 SessionID 嵌入 URL,支援禁用 Cookie 的瀏覽器能。設定 cookieless="true",SessionID 透過 URL 或 Form 傳遞。但 URL 暴露 SessionID 有安全風險,建議搭配 SSL。
雙向透過 HTTP Header:
Request.Headers["Cookie"] 包含所有 Cookie 鍵值對Response.Headers["Set-Cookie"] 設定單一 Cookie 屬性(值、過期、Domain、Path、HttpOnly、Secure)可用 Fiddler、HttpWatch、Firebug 開發者工具觀察 Header 內容。
預設 SessionID 存於 Cookie ASP.NET_SessionId,伺服器以此關聯 Session 狀態。若 cookieless=true,SessionID 改嵌入 URL 路徑(如 /(S(xyz))/page.aspx)。