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

ASP.NET 狀態管理全解析:Cookie 與 Session 差異、操作技巧與安全考量

     編輯:ASP.NET 基礎

核心差異速查表

特性CookieSession
儲存位置用戶端 (瀏覽器記憶體/硬碟)伺服器端 (記憶體/StateServer/SQL)
容量限制單一 Cookie ≤ 4KB,每域名約 20-50 個視伺服器記憶體/設定而定,單一物件建議 < 100KB
生命週期可設定 Expires 持久化,或 Session Cookie (瀏覽器關閉失效)預設 20 分鐘閒置逾時,可在 web.config 設定
安全性可被竄改/攔截,需加密敏感資料資料不離開伺服器,相對安全
跨域受同源策略限制,可設定 Domain 屬性跨子域僅限同一應用程式 (除非共享 Session State)
效能影響每次請求自動隨 Header 送出,增加頻寬伺服器記憶體佔用,需序列化/反序列化

Cookie 操作完整範例

寫入 Cookie

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);

讀取 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/>");
}

刪除 Cookie

// 設定過期時間為過去
HttpCookie cookie = new HttpCookie("user");
cookie.Expires = DateTime.Now.AddDays(-1);
Response.Cookies.Add(cookie);

Session 操作完整範例

// 寫入
Session["myname"] = "chenxiaomei";

// 讀取 (需檢查 null)
string myname = Session["myname"] as string;

// 移除特定鍵
Session.Remove("myname");

// 清除所有 Session 變數 (保留 SessionID)
Session.Clear();

// 完全放棄目前 Session (產生新 SessionID)
Session.Abandon();

進階主題

1. Cookie 加密與簽章

// 使用 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);

2. Session 狀態模式選擇

<sessionState mode="InProc" />           // 預設,效能最好,重啟丟失
<sessionState mode="StateServer" ... />  // 進程外,支援 Web Farm
<sessionState mode="SQLServer" ... />    // 持久化,高可用
<sessionState mode="Custom" provider="MyRedisProvider" /> // 自訂 (如 Redis)

3. 無 Cookie 環境下的 Session (Cookieless)

<sessionState cookieless="UseUri" /> // URL 中內嵌 SessionID,如 /(S(xxxx))/page.aspx

⚠️ 安全風險:SessionID 暴露在 URL,易遭 Session Fixation 攻擊,建議搭配 SSL 且僅在必要時啟用。

最佳實務建議

  1. 敏感資料勿存 Cookie:密碼、Token、個資請用 Session 或加密 Token (JWT)。
  2. 設定 HttpOnly + Secure:防 XSS 竊取、強制 HTTPS 傳輸。
  3. Session 存放精簡物件:避免存放大型 DataSet、Entity 物件,導致記憶體壓力與序列化失敗。
  4. 定期清理過期 Session:StateServer/SQLServer 需配合 Agent 作業清理。
  5. 驗證票據分離:使用 FormsAuthentication Ticket 或 IdentityServer/OpenID Connect,不要自行在 Cookie/Session 實作認證。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved