| 特性 | Cookie | Session |
|---|---|---|
| 儲存位置 | 用戶端 (瀏覽器記憶體/硬碟) | 伺服器端 (記憶體/StateServer/SQL) |
| 容量限制 | 單一 Cookie ≤ 4KB,每域名約 20-50 個 | 視伺服器記憶體/設定而定,單一物件建議 < 100KB |
| 生命週期 | 可設定 Expires 持久化,或 Session Cookie (瀏覽器關閉失效) | 預設 20 分鐘閒置逾時,可在 web.config 設定 |
| 安全性 | 可被竄改/攔截,需加密敏感資料 | 資料不離開伺服器,相對安全 |
| 跨域 | 受同源策略限制,可設定 Domain 屬性跨子域 | 僅限同一應用程式 (除非共享 Session State) |
| 效能影響 | 每次請求自動隨 Header 送出,增加頻寬 | 伺服器記憶體佔用,需序列化/反序列化 |
HttpCookie cookie = new HttpCookie("user");
cookie.Value = "chenxiaomei"; // 單一值
cookie["sex"] = "女"; // 多鍵值對
cookie.Values.Add("age", "18"); // 另一種寫法
cookie.Expires = DateTime.Now.AddDays(7); // 持久化 7 天
cookie.HttpOnly = true; // 防止 JS 讀取 (防 XSS)
cookie.Secure = Request.IsSecureConnection; // 僅 HTTPS 傳輸
Response.Cookies.Add(cookie);
HttpCookie cookie = Request.Cookies["user"];
if (cookie == null)
{
Response.Write("找不到指定 Cookie");
}
else
{
Response.Write("全部值:" + cookie.Value + "<br/>");
Response.Write("sex:" + cookie["sex"] + "<br/>");
Response.Write("age:" + cookie["age"] + "<br/>");
}
// 設定過期時間為過去
HttpCookie cookie = new HttpCookie("user");
cookie.Expires = DateTime.Now.AddDays(-1);
Response.Cookies.Add(cookie);
// 寫入
Session["myname"] = "chenxiaomei";
// 讀取 (需檢查 null)
string myname = Session["myname"] as string;
// 移除特定鍵
Session.Remove("myname");
// 清除所有 Session 變數 (保留 SessionID)
Session.Clear();
// 完全放棄目前 Session (產生新 SessionID)
Session.Abandon();
// 使用 MachineKey 加密 (需在 web.config 設定 machineKey)
string encrypted = MachineKey.Encode(Encoding.UTF8.GetBytes(value), MachineKeyProtection.All);
// 解密
byte[] decrypted = MachineKey.Decode(encrypted, MachineKeyProtection.All);
value = Encoding.UTF8.GetString(decrypted);
<sessionState mode="InProc" /> // 預設,效能最好,重啟丟失
<sessionState mode="StateServer" ... /> // 進程外,支援 Web Farm
<sessionState mode="SQLServer" ... /> // 持久化,高可用
<sessionState mode="Custom" provider="MyRedisProvider" /> // 自訂 (如 Redis)
<sessionState cookieless="UseUri" /> // URL 中內嵌 SessionID,如 /(S(xxxx))/page.aspx
⚠️ 安全風險:SessionID 暴露在 URL,易遭 Session Fixation 攻擊,建議搭配 SSL 且僅在必要時啟用。