Cookie與Session的區(qū)別與聯(lián)系(收藏篇)
Cookie vs. Session 詳解
在 Web 開發(fā)中,Cookie 和 Session 都用于存儲用戶狀態(tài),解決 HTTP 協(xié)議的無狀態(tài)性問題(即每次請求都是獨立的,不會記住之前的狀態(tài))。但它們在 存儲位置、數(shù)據(jù)安全性、使用場景 等方面存在明顯區(qū)別。
1. Cookie 和 Session 的基本概念
?? Cookie(客戶端存儲)
- 存儲位置:存放在客戶端瀏覽器。
- 存儲方式:以 鍵值對(key-value) 形式存儲在瀏覽器。
- 生命周期:可設(shè)置 過期時間,默認(rèn)隨瀏覽器會話結(jié)束而刪除。
- 用途:
- 記錄用戶信息(如用戶名、購物車)。
- 保存登錄狀態(tài)(如"記住我"功能)。
- 跨頁面、跨網(wǎng)站跟蹤用戶行為(如廣告追蹤)。
?? Session(服務(wù)器端存儲)
- 存儲位置:存放在服務(wù)器。
- 存儲方式:Session 數(shù)據(jù)存儲在服務(wù)器內(nèi)存或數(shù)據(jù)庫,客戶端僅保存 Session ID(通常存放在 Cookie 中)。
- 生命周期:
- 默認(rèn)隨用戶會話(Session)結(jié)束后刪除(如關(guān)閉瀏覽器)。
- 服務(wù)器可設(shè)置 Session 過期時間。
- 用途:
- 存儲敏感信息(如用戶登錄狀態(tài)、權(quán)限)。
- 維護用戶會話,如在線聊天、購物車等。
- 適用于需要高安全性的場景。
2. Cookie vs. Session 的主要區(qū)別
| 對比項 | Cookie | Session |
|---|---|---|
| 存儲位置 | 客戶端(瀏覽器) | 服務(wù)器端 |
| 安全性 | 低(容易被篡改/劫持) | 高(僅存 Session ID,數(shù)據(jù)在服務(wù)器端) |
| 數(shù)據(jù)大小 | 4KB 限制 | 無大小限制(取決于服務(wù)器) |
| 生命周期 | 可自定義,默認(rèn)隨瀏覽器關(guān)閉刪除 | 默認(rèn)隨會話結(jié)束,服務(wù)器可設(shè)定過期時間 |
| 訪問方式 | 通過瀏覽器發(fā)送,所有請求自動攜帶 | 服務(wù)器端存取,客戶端只存 ID |
| 存儲敏感信息 | 不安全,不能存儲敏感信息 | 安全,可存儲用戶登錄狀態(tài)、權(quán)限等 |
| 服務(wù)器負(fù)擔(dān) | 低(數(shù)據(jù)存儲在客戶端) | 高(每個用戶的 Session 都占用服務(wù)器資源) |
| 跨域支持 | 可以跨域(需設(shè)置 SameSite=None; Secure) | 不能跨域(僅在當(dāng)前域名有效) |
3. Cookie 的詳細機制
?? Cookie 的工作流程
- 服務(wù)器向客戶端發(fā)送 Cookie
- 服務(wù)器響應(yīng)
Set-Cookie頭,客戶端瀏覽器存儲 Cookie。
- 服務(wù)器響應(yīng)
- 客戶端每次請求都會攜帶 Cookie
- 瀏覽器會自動在
Cookie頭中攜帶 Cookie 數(shù)據(jù)發(fā)送給服務(wù)器。
- 瀏覽器會自動在
?? Cookie 示例
(1) 服務(wù)器設(shè)置 Cookie
Set-Cookie: user=Alice; Expires=Wed, 10 Jul 2024 23:59:59 GMT; HttpOnly; Secure; SameSite=Strict
user=Alice→ 存儲的鍵值對。Expires→ 過期時間(如果未設(shè)置,則隨會話結(jié)束)。HttpOnly→ 僅能通過 HTTP 訪問,JavaScript 無法讀取,防止 XSS 攻擊。Secure→ 僅在 HTTPS 傳輸,防止被竊聽。SameSite=Strict→ 防止跨站請求偽造(CSRF)攻擊。
(2) 客戶端自動攜帶 Cookie
Cookie: user=Alice
4. Session 的詳細機制
?? Session 的工作流程
- 用戶訪問服務(wù)器,服務(wù)器創(chuàng)建 Session 并生成 Session ID。
- Session ID 存儲在 Cookie 中,返回給客戶端。
- 客戶端請求時自動攜帶 Session ID,服務(wù)器查找對應(yīng) Session 數(shù)據(jù)。
?? Session 示例
(1) 服務(wù)器創(chuàng)建 Session
# Flask 示例
from flask import Flask, session
app = Flask(__name__)
app.secret_key = 'super_secret_key' # 用于加密 Session
@app.route('/')
def index():
session['user'] = 'Alice' # 存儲用戶信息
return 'Session set!'(2) 瀏覽器請求時自動攜帶 Session ID
Cookie: sessionid=abc123
- 服務(wù)器根據(jù)
sessionid=abc123查找對應(yīng)的 Session 數(shù)據(jù)。
5. Cookie vs. Session 的適用場景
| 場景 | 推薦方案 | 原因 |
|---|---|---|
| 記錄用戶偏好(如主題顏色) | ? Cookie | 無需存儲敏感信息,存儲在客戶端更輕量 |
| 保持用戶登錄狀態(tài) | ? Session | 更安全,防止用戶篡改數(shù)據(jù) |
| 跨站點跟蹤(如廣告投放) | ? Cookie | Cookie 可跨域共享(帶 SameSite=None) |
| 存儲購物車數(shù)據(jù)(非登錄用戶) | ? Cookie | 服務(wù)器不需要存儲每個游客的數(shù)據(jù) |
| 存儲購物車數(shù)據(jù)(登錄用戶) | ? Session | 服務(wù)器端更安全,防止篡改 |
| 大數(shù)據(jù)存儲 | ? 都不適合 | 需使用數(shù)據(jù)庫存儲 |
6. Cookie 和 Session 的安全風(fēng)險
| 安全風(fēng)險 | Cookie | Session | 解決方案 |
|---|---|---|---|
| 數(shù)據(jù)竊取(竊聽) | ? 高風(fēng)險(明文傳輸) | ? 低風(fēng)險(僅存 Session ID) | 使用 HTTPS 保護傳輸 |
| XSS(跨站腳本攻擊) | ? 高風(fēng)險(JavaScript 可讀取 Cookie) | ? 低風(fēng)險 | 設(shè)置 HttpOnly 防止 JavaScript 讀取 |
| CSRF(跨站請求偽造) | ? 高風(fēng)險(自動攜帶) | ? 中等 | 使用 SameSite=Strict 保護 Cookie |
| Session 偽造(Session Fixation) | ? 無影響 | ? 高風(fēng)險(Session ID 被竊?。?/td> | 定期刷新 Session ID |
7. 結(jié)合使用 Cookie 和 Session(最佳實踐)
- Session 主要存儲敏感信息,客戶端僅存 Session ID:
Cookie: sessionid=xyz123(只存 ID,不存用戶信息)。- 服務(wù)器端查找
xyz123關(guān)聯(lián)的 Session 數(shù)據(jù)。
- Cookie 存儲非敏感信息(如用戶設(shè)置):
- 主題、語言、訪問歷史等。
- 確保安全(防止 XSS & CSRF):
- HttpOnly:防止 JavaScript 讀取 Cookie。
- Secure:僅 HTTPS 傳輸 Cookie,防止竊聽。
- SameSite:防止 CSRF 攻擊。
8. 總結(jié)
| 對比項 | Cookie | Session |
|---|---|---|
| 存儲位置 | 客戶端(瀏覽器) | 服務(wù)器 |
| 安全性 | 低(容易篡改) | 高(僅存 Session ID) |
| 適用場景 | 記錄用戶偏好、廣告追蹤 | 登錄狀態(tài)、權(quán)限管理 |
| 存儲方式 | 瀏覽器 Cookie | 服務(wù)器 Session ID |
? 推薦方案:
- 非敏感數(shù)據(jù)(如用戶設(shè)置) → Cookie
- 敏感數(shù)據(jù)(如登錄狀態(tài)) → Session
- 加強安全性 → 使用 HTTPS、HttpOnly、SameSite
總結(jié)一句話:Cookie 適合存小數(shù)據(jù),Session 適合存安全數(shù)據(jù),實際開發(fā)中兩者結(jié)合使用!
到此這篇關(guān)于Cookie與Session的區(qū)別與聯(lián)系的文章就介紹到這了,更多相關(guān)Cookie與Session區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
聯(lián)邦學(xué)習(xí)FedAvg中模型聚合過程的理解分析
這篇文章主要為大家介紹了FedAvg中模型聚合過程的理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05
matlab中乘法“*”和點乘“.*”;除法“/”和點除“./”的聯(lián)系和區(qū)別
這篇文章主要介紹了matlab中乘法“*”和點乘“.*”;除法“/”和點除“./”的聯(lián)系和區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
使用roolup構(gòu)建你的lib(實現(xiàn)步驟)
大家都知道Rollup更加適合用于構(gòu)建lib 而 Webpack, Precel 更加適合開發(fā)應(yīng)用。本文,將結(jié)合一個簡單的例子說說如何使用Rollup構(gòu)建自己的lib,感興趣的朋友一起看看吧2021-08-08

