| 特性 | Session | Cookie |
|---|---|---|
| 儲存位置 | 伺服器端(檔案/Redis/Memcached/DB) | 客戶端瀏覽器 |
| 安全性 | 較高(資料不曝露給用戶) | 較低(可被竄改、攔截) |
| 資料類型 | 支援陣列、物件、任意序列化資料 | 僅字串(需自行序列化) |
| 生命週期 | 瀏覽器關閉或 gc_maxlifetime 過期 | 可設定持久過期時間 |
| 容量限制 | 受伺服器記憶體/磁碟限制 | 單一 Cookie ≤ 4KB |
<?php
// 1. 啟動 Session(必須在任何輸出前呼叫)
session_start();
// 2. 設定資料(支援多維陣列、物件)
$_SESSION['user'] = [
'id' => 123,
'name' => 'Alice',
'roles' => ['admin', 'editor'],
'login_at' => time(),
];
// 3. 讀取資料
if (isset($_SESSION['user'])) {
echo "歡迎, {$_SESSION['user']['name']}<br>";
print_r($_SESSION['user']);
}
// 4. 刪除單一鍵
unset($_SESSION['user']['roles']);
// 5. 銷毀整個 Session(登出)
// session_unset(); // 僅清空 $_SESSION 陣列
// session_destroy(); // 刪除伺服器端 Session 檔案與客戶端 Cookie
?>
session.save_handler = files(預設)、redis、memcached、databasesession.gc_maxlifetime = 1440(秒,預設 24 分鐘)session.cookie_lifetime = 0(0 = 瀏覽器關閉即過期)session.use_strict_mode = 1(防止 Session Fixation 攻擊)session.cookie_httponly = 1(防止 JS 存取 Session ID)session.cookie_secure = 1(僅 HTTPS 傳輸,生產環境必開)多伺服器叢集需共享 Session,請改用 Redis 或 資料庫 作為儲存後端:
# php.ini (需安裝 php-redis)
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379?auth=yourpass"
session_regenerate_id(true);session.cookie_samesite = 'Lax' 或 'Strict' 防禦 CSRF。