🍪 Cookie和Session
📖 定義
**Cookie(cookie)**是伺服器儲存在用戶端瀏覽器中的小塊資料。**Session(會話)**是伺服器為了維護用戶端狀態而在伺服器端儲存的資訊。兩者都用於克服HTTP的無狀態性(Stateless)。
🎯 透過比喻理解
飯店系統
Cookie = 房間卡片
├─ 住客自己持有
├─ 卡片記錄房間號
├─ 遺失可重新發放
└─ 可能被他人竊走
Session = 飯店帳簿
├─ 飯店保管
├─ 詳細記錄住客資訊
├─ 透過房間卡片查詢帳簿
└─ 安全管理
流程:
1. 入住(登入)
├─ 飯店:在帳簿記錄住客資訊(Session)
└─ 住客:獲得房間卡片(Cookie)
2. 使用服務
├─ 住客:出示房間卡片
├─ 飯店:在帳簿查詢資訊
└─ 提供服務
3. 退房(登出)
├─ 歸還房間卡片
└─ 整理帳簿
🌐 HTTP的無狀態性限制
為什麼需要Cookie和Session?
HTTP協定本身是無狀態的,這意味著:
- 伺服器不記得之前的互動
- 每次請求都是獨立的
- 無法自動識別用戶
無狀態的挑戰
-
用戶登入
- 沒有狀態管理:每次請求都需要重新登入
- 使用者體驗極差
-
購物車
- 沒有持久性:加入購物車的商品會立即消失
- 無法追蹤用戶購買意圖
🔑 Cookie和Session工作原理
Cookie的工作原理
-
建立
Set-Cookie: username=johndoe; Path=/; Expires=Wed, 21 Oct 2023 07:28:00 GMT -
傳送
- 瀏覽器自動在每次請求攜帶Cookie
Cookie: username=johndoe
Session的工作原理
-
伺服器建立Session
- 產生唯一Session ID
- 在伺服器端儲存用戶資訊
-
透過Cookie傳遞Session ID
Set-Cookie: SESSIONID=abc123; Path=/
🛡️ 安全性考量
Cookie安全性
-
敏感資訊
- 不要儲存密碼
- 避免儲存個人識別資訊
-
Cookie屬性
HttpOnly:防止JavaScript存取Secure:僅在HTTPS傳輸SameSite:防止跨站請求偽造(CSRF)
Session安全性
-
Session劫持
- 使用HTTPS
- 定期重新產生Session ID
- 設定合理的逾時時間
-
伺服器端管理
- 安全儲存Session資訊
- 限制Session持續時間
🚀 實際應用場景
-
使用者認證
- 登入狀態維持
- 存取控制
-
個人化體驗
- 購物車
- 推薦系統
- 語言偏好設定
-
遊戲和互動應用
- 遊戲進度儲存
- 即時多人互動
💡 最佳實踐
- 最小化Cookie大小
- 設定適當的過期時間
- 使用加密和簽名
- 遵守隱私法規
- 提供選擇退出機制
🔬 技術實現
不同框架和語言的實現方式:
PHP
// 設定Cookie
setcookie("username", "johndoe", time() + 3600);
// 建立Session
session_start();
$_SESSION['user_id'] = 123;
Python (Flask)
from flask import Flask, session
app = Flask(__name__)
app.secret_key = 'your_secret_key'
@app.route('/login')
def login():
session['username'] = 'johndoe'
JavaScript (Express)
const express = require('express');
const session = require('express-session');
app.use(session({
secret: 'your_secret_key',
resave: false,
saveUninitialized: true
}));
🎓 結論
Cookie和Session是現代Web應用中不可或缺的技術,它們解決了HTTP協定的固有限制,提供了狀態管理和個人化體驗的關鍵機制。
理解和正確使用這些技術,對於建立安全、高效且用戶友善的Web應用至關重要。