Cookies 詳解及其與 Session 的協同工作

Cookies 詳解及其與 Session 的協同工作

一、Cookies 的本質與作用

1. 什么是 Cookies?

Cookies 是由服務器發送到用戶瀏覽器并存儲在本地的小型文本文件。核心特性:

  • 存儲位置:客戶端瀏覽器
  • 數據形式:鍵值對字符串(最大4KB)
  • 傳輸方式:通過HTTP頭部自動傳遞
  • 生命周期:可設置過期時間(會話級/持久化)
2. 在瀏覽器中的作用:
保持登錄狀態
記錄用戶行為
身份識別
個性化體驗
狀態跟蹤
偏好設置
購物車保存
跨頁面數據傳遞
廣告定向
數據分析
3. 技術實現流程:
BrowserServer首次請求(無Cookie)HTTP響應 + Set-Cookie: id=abc123存儲Cookie后續請求(自動攜帶Cookie)讀取Cookie值提供個性化響應返回定制化內容BrowserServer

二、Cookies 與 Session 的協同機制

1. 經典協作模式:
存儲在
通過
客戶端存儲
每次請求攜帶
Session 數據
服務器數據庫
Session ID
Cookie
瀏覽器
服務器
2. 具體工作流程:
UserBrowserServerSessionDB訪問網站GET /login創建新SessionSessionID=xyz789Set-Cookie: sessionid=xyz789顯示登錄表單提交登錄憑證POST /login (攜帶Cookie)驗證憑證 → 存儲user_id重定向到儀表盤GET /dashboard (攜帶Cookie)用xyz789獲取user_iduser_id=123生成個性化數據返回用戶專屬儀表盤UserBrowserServerSessionDB

三、在 Django 項目中的實現代碼

1. 設置 Session-Cookie(登錄視圖)
# views.py
def user_login(request):if request.method == 'POST':username = request.POST['username']password = request.POST['password']user = authenticate(username=username, password=password)if user:# 核心Session操作request.session['user_id'] = user.id# 顯式設置Cookie參數response = redirect('dashboard')response.set_cookie('user_lang', 'zh-CN', max_age=30*24*3600,  # 30天有效期httponly=False,       # 允許JS訪問secure=True           # 僅HTTPS傳輸)return response
2. 讀取 Cookie(中間件示例)
# middleware.py
class LanguageMiddleware:def __init__(self, get_response):self.get_response = get_responsedef __call__(self, request):# 1. 從Cookie獲取語言偏好lang = request.COOKIES.get('user_lang', 'en')# 2. 設置線程本地語言translation.activate(lang)request.LANGUAGE_CODE = lang# 3. 處理請求response = self.get_response(request)# 4. 回寫Cookie(如需更新)if lang != 'en':response.set_cookie('user_lang', lang)return response
3. Session-Cookie 安全配置(settings.py)
# 防止XSS攻擊
SESSION_COOKIE_HTTPONLY = True  # 禁止JS訪問Session Cookie# 防止中間人攻擊
SESSION_COOKIE_SECURE = True    # 僅通過HTTPS傳輸# 防御CSRF
CSRF_USE_SESSIONS = True        # CSRF token存儲在Session中
CSRF_COOKIE_HTTPONLY = False    # 允許AJAX訪問CSRF token# 同源策略
SESSION_COOKIE_SAMESITE = 'Lax' # 平衡安全與第三方集成

四、Cookie 與 Session 的對比分析

特性CookieSession
存儲位置客戶端瀏覽器服務器端
數據類型僅字符串(最大4KB)任意Python對象
安全性較低(用戶可見可修改)較高(服務器控制)
生命周期可長期保存(設置過期時間)通常短期(會話結束或超時)
性能影響每次請求自動攜帶需要服務器查詢存儲
典型應用場景語言偏好、主題設置、跟蹤ID登錄狀態、購物車、敏感數據

五、實際應用案例:購物車系統

工作流程:
用戶添加商品
存儲商品ID到Session
用戶關閉瀏覽器
Session Cookie過期
用戶重新訪問
Cookie攜帶SessionID
服務器恢復Session
顯示完整購物車
代碼實現:
# views.py
def add_to_cart(request, product_id):# 確保購物車存在if 'cart' not in request.session:request.session['cart'] = {}# 更新購物車cart = request.session['cart']cart[product_id] = cart.get(product_id, 0) + 1# 標記Session已修改request.session.modified = True# 設置跟蹤Cookie(非敏感數據)response = JsonResponse({'status': 'success'})response.set_cookie('cart_updated', datetime.now().isoformat())return response

六、安全最佳實踐

  1. 敏感數據絕不存Cookie

    # 錯誤示例(密碼存Cookie)
    response.set_cookie('password', user.password) # 正確做法
    request.session['user_id'] = user.id
    
  2. Cookie簽名驗證

    # 設置簽名Cookie
    response.set_signed_cookie('preferences', 'dark_theme', salt='ui_settings',max_age=3600
    )# 讀取驗證
    request.get_signed_cookie('preferences', salt='ui_settings')
    
  3. Session劫持防護

    # 每次登錄更換Session ID
    def login_view(request):# ...驗證邏輯...request.session.cycle_key()  # 關鍵防護!
    
  4. 瀏覽器指紋綁定

    # 存儲用戶特征哈希
    fingerprint = hashlib.sha256(f"{request.META['HTTP_USER_AGENT']}{ip_address}".encode()
    ).hexdigest()
    request.session['browser_fp'] = fingerprint# 每次請求驗證
    if request.session.get('browser_fp') != current_fingerprint:request.session.flush()  # 強制重新登錄
    

總結回答

Cookies是瀏覽器存儲的小型文本數據,核心作用是:

  1. 在客戶端保存非敏感狀態信息(如語言/主題偏好)
  2. 作為Session ID的載體實現身份保持
  3. 跟蹤用戶行為(需符合隱私法規)

與Session的協同方式

  • Session在服務器端存儲核心狀態(如用戶ID、權限)
  • Cookies在瀏覽器端安全存儲Session ID(通常為HttpOnly+Secure)
  • 每次請求自動攜帶Session ID Cookie → 服務器恢復完整Session

這種設計實現了安全與用戶體驗的平衡:敏感數據受服務器保護,非敏感設置由客戶端高效存儲,共同構建了有狀態的Web體驗。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/90347.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/90347.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/90347.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DeepSeek Janus Pro本地部署與調用

step1、Janus模型下載與項目部署 創建文件夾autodl-tmp https://github.com/deepseek-ai/Janus?tabreadme-ov-file# janusflow 查看是否安裝了git,沒有安裝的話安裝一下,或者是直接github上下載,上傳到服務器,然后解壓 git --v…

【Elasticsearch】BM25的discount_overlaps參數

discount_overlaps 是 Elasticsearch/Lucene 相似度模型(Similarity)里的一個布爾參數,用來決定:> 在計算文檔長度歸一化因子(norm)時,是否忽略“重疊 token”(即位置增量 positi…

Linux | LVS--Linux虛擬服務器知識點(上)

一. 集群與分布式1.1 系統性能擴展方式當系統面臨性能瓶頸時,通常有以下兩種主流擴展思路:Scale Up(向上擴展):通過增強單臺服務器的硬件配置來提升性能,這種方式簡單直接,但受限于硬件物理極限…

【Linux-云原生-筆記】keepalived相關

一、概念Keepalived 是一個用 C 語言編寫的、輕量級的高可用性和負載均衡解決方案軟件。 它的主要目標是在基于 Linux 的系統上提供簡單而強大的故障轉移功能,并可以結合 Linux Virtual Server 提供負載均衡。1、Keepalived 主要提供兩大功能:高可用性&a…

計算機網絡:概述層---計算機網絡的組成和功能

🌐 計算機網絡基礎全景梳理:組成、功能與核心機制 📅 更新時間:2025年7月21日 🏷? 標簽:計算機網絡 | 網絡組成 | 分布式 | 負載均衡 | 資源共享 | 網絡可靠性 | 計網基礎 文章目錄前言一、組成1.從組成部…

Linux中scp命令傳輸文件到服務器報錯

上傳本地文件到Linux服務器使用scp命令報錯解決辦法使用scp命令報錯 Could not resolve hostname e: Name or service not known 解決辦法 不使用登錄服務器的工具傳輸,打開本地cmd,使用scp命令傳輸即可。 scp E:\dcm-admin.jar root127.0.0.1:/

歷史數據分析——國藥現代

醫藥板塊走勢分析: 從月線級別來看 2008年11月到2021年2月,月線上走出了兩個震蕩中樞的月線級別2085-20349的上漲段; 2021年2月到2024年9月,月線上走出了20349-6702的下跌段; 目前月線級別放巨量,總體還在震蕩區間內,后續還有震蕩和上漲的概率。 從周線級別來看 從…

#Linux內存管理# 在一個播放系統中同時打開幾十個不同的高清視頻文件,發現播放有些卡頓,打開視頻文件是用mmap函數,請簡單分析原因。

在播放系統中同時使用mmap打開幾十個高清視頻文件出現卡頓,主要原因如下:1. 內存映射(mmap)的缺頁中斷開銷按需加載機制:mmap將文件映射到虛擬地址空間,但實際數據加載由“缺頁中斷(Page Fault&…

AI黑科技:GAN如何生成逼真人臉

GAN的概念 GAN(Generative Adversarial Network,生成對抗網絡)是一種深度學習模型,由生成器(Generator)和判別器(Discriminator)兩部分組成。生成器負責生成 synthetic data(如假圖像、文本等),判別器則試圖區分生成數據和真實數據。兩者通過對抗訓練不斷優化,最終…

FireFox一些設置

firefox后臺打開新的鏈接,例如中鍵打開一個鏈接 地址欄輸入about:config 找到下面三項,全部設為true browser.tabs.loadInBackground browser.tabs.loadDivertedInBackground browser.tabs.loadBookmarksInBackground 參考:FireFox/chrome…

【黑馬SpringCloud微服務開發與實戰】(六)分布式事務

1. 什么是分布式事務下單失敗,購物車還被清理了。不符合一致性。2. seata的架構和原理3. 部署TC服務docker network ls docker inspect mysql mysql 在hm-net下,這里我的ncaos不是跟著視頻配的,因此需要。 docker network connect hm-net nac…

【力扣】第15題:三數之和

原文鏈接:15. 三數之和 - 力扣(LeetCode) 思路解析 雙指針: (1)頭尾指針對應值相加如果大于目標值(target),那么只能尾指針-1;如果小于target,那么只能頭指針1。 &#x…

Linux PCI總線子系統

The Linux Kernel Archives Linux PCI總線子系統 — The Linux Kernel documentation

LeetCode熱題100--24. 兩兩交換鏈表中的節點--中等

1. 題目 給你一個鏈表,兩兩交換其中相鄰的節點,并返回交換后鏈表的頭節點。你必須在不修改節點內部的值的情況下完成本題(即,只能進行節點交換)。 示例 1: 輸入:head [1,2,3,4] 輸出&#x…

京東視覺算法面試30問全景精解

京東視覺算法面試30問全景精解 ——零售智能 供應鏈創新 工業落地:京東視覺算法面試核心考點全覽 前言 京東作為中國領先的零售科技企業,在智能物流、供應鏈管理、智能倉儲、商品識別、工業質檢等領域持續推動視覺AI的創新與大規模落地。京東視覺算法崗位面試不僅關注候…

【設計模式】觀察者模式 (發布-訂閱模式,模型-視圖模式,源-監聽器模式,從屬者模式)

觀察者模式(Observer Pattern)詳解一、觀察者模式簡介 觀察者模式(Observer Pattern) 是一種 行為型設計模式(對象行為型模式),它定義了一種一對多的依賴關系,讓多個觀察者對象同時監…

Linux的`<< EOF`(Here-Document)詳解多回答筆記250722

Linux的<< EOF(Here-Document)詳解多回答筆記250722 Linux 中的 << EOF 結構稱為 Here Document&#xff08;立即文檔或嵌入文檔&#xff09;&#xff0c;它是一種在 Shell 腳本中直接嵌入多行文本輸入流&#xff08;通常作為命令的標準輸入&#xff09;的方式。E…

Go語言實戰案例-簡單配置文件(INI格式)解析器

以下是《Go語言100個實戰案例》中的 文件與IO操作篇 - 案例20&#xff1a;簡單配置文件&#xff08;INI格式&#xff09;解析器 的完整內容&#xff0c;適合入門學習如何用 Go 語言解析常見的 .ini 配置文件格式。&#x1f3af; 案例目標使用 Go 語言解析一個 .ini 格式的配置文…

用 PyTorch 實現全連接網絡識別 MNIST 手寫數字

目錄 一、什么是全連接網絡 二、代碼實現步驟 1. 導入必要的庫 2. 數據準備 3. 定義網絡結構 4. 模型訓練 5. 模型保存和加載 6. 預測單張圖片 7. 主函數 三、運行結果說明 四、小結 一、什么是全連接網絡 全連接神經網絡&#xff08;Fully Connected Neural Networ…

vscode怎么安裝MINGW

下載&#xff1a; 第一步選擇MINGW官網&#xff1a;MinGW-w64 - for 32 and 64 bit Windows - SourceForge.net 點擊Files 點擊Toolchains targetting Win64 點擊第一個 Personal Builds 點擊mingw-builds 選擇8.1.0 點擊第二個 threads-posix 點擊第二個seh 最后左鍵點擊下…