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 最后左键点击下…