当前位置: 首页 > news >正文

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.dtcms.com/a/292805.html

相关文章:

  • AWS OpenSearch 搜索排序常见用法
  • 2️⃣tuple(元组)速查表
  • C语言面向对象编程
  • Java函数式编程深度解析:从基础到高阶应用
  • Leetcode题解:209长度最小的子数组,掌握滑动窗口从此开始!!!
  • 光伏电站智能数据采集系统解决方案
  • SpringBoot PO VO BO POJO实战指南
  • 十进制小数转换为二进制表示 ← 除2取余法+乘2取整法
  • csp基础知识——递推
  • SMTP+VRRP实验
  • Markdown 转 PDF API 数据接口
  • REASONING ELICITATION IN LANGUAGE MODELSVIA COUNTERFACTUAL FEEDBACK
  • 高性能线程安全的时间有序 UUID 生成器 —— 基于 ThreadLocal 的实现
  • 实操:AWS CloudFront的动态图像转换
  • Cadence 原理图如何给网络名称添加页码
  • 『React』条件渲染的7种方法
  • 基于Prompt 的DevOps 与终端重塑
  • 装备数字孪生底座平台探索
  • HTTP 协议常见字段(请求头/响应头)
  • 虚幻5入门教程:如何在虚幻5中创建一个C++的Plugin
  • android 12 的 aidl for HAL 开发示例
  • VR技术在元宇宙游戏中的作用及发展前景深度分析
  • Fluent许可与网络安全策略
  • 基于JSP的快递管理系统/快递寄出管理系统
  • 初识opencv01——基本api操作
  • Transactional事务不生效案例与解决方案?
  • 基于深度学习Transform的steam游戏特征分析与可视化【词云-情感词典分析-主题分析-词频分析-关联分析】
  • Android 自动的文件管理器存在以下问题,文件管理器横竖屏切换会停止运行,如何解决
  • 多维基分析求导法则
  • DNS应用层协议