Django会话技术详解:Cookie、Session与Token实战指南
本文深入解析Django框架中的会话技术,涵盖Cookie、Session与Token三种核心机制。详细阐述客户端与服务端会话的区别、过期时间配置、数据库存储策略及Token生成算法。结合用户注册、登录、登出等典型场景,提供基于Response和Request对象的API操作示例,并探讨利用摘要算法保障数据安全的最佳实践。
Django会话技术概述
本文通过具体实例解析Django框架中的会话技术,旨在为开发者提供清晰的参考与实操指导。
会话技术概述
Cookie客户端会话技术
1、Cookie
- Cookie属于客户端会话技术,其数据直接存储于用户浏览器端。
- 数据以键值对(key-value)的形式进行存储与管理。
- 所有Cookie的操作均需通过Response对象来实现。
- 典型场景回顾
- 典型应用场景包括购物车数据的持久化存储。
- 以及用户登录信息的保持。
- Cookie支持配置过期时间,以控制数据的生命周期。
- Cookie清除策略详解
- 默认情况下,当用户关闭浏览器时,Cookie会被自动清除。
- 可以通过配置来设定Cookie的过期时间。
- 设置max-age=0时,Cookie将在关闭浏览器后失效。
- 设置max-age=None时,Cookie将保持永久有效。
- 设置max-age为整数时,单位为秒,表示经过指定秒数后失效。
- expires属性用于设置过期时间,其功能与max-age基本一致。
- 用户登出操作实质上就是清除存储在客户端的Cookie(如令牌)。
Session服务端会话技术
2、Session
- Session属于服务端会话技术,数据主要存储于服务器端。
- Session依赖于Cookie进行标识传递
- 系统将在数据库中生成的session_key作为sessionid,并存储于客户端的Cookie中,以此建立关联。
- Session数据存储在数据库中,并进行了基础的数据安全处理,例如采用base64编码。
Token手动会话实现
3、Token
- Token同样属于服务端会话技术的一种实现方式。
- 它相当于手动实现的Session机制,由开发者自行控制逻辑。
- Session值应该是唯一的
- 必须通过特定算法确保Token的唯一性。
- 生成Token时可结合时间因素。
- 可结合用户IP地址。
- 可结合域名信息。
- 可结合网卡MAC地址。
- 引入随机数以增加不可预测性。
会话技术解决痛点与用户管理
4、解决痛点
- 会话技术旨在解决HTTP短连接无法保存用户状态的问题。
- 通过会话机制,有效延长了请求的生命周期,实现了状态保持。
- 用户管理实例分析
- 以用户注册为例,流程如下:
- 将用户数据存储到数据库中。
- 数据安全策略实施
- 密码对任何人来说都应当是不透明的,需进行加密处理。
- 用户登录流程:
- 将用户提交的身份信息与数据库内存储的信息进行校验。
- 若返回不成功结果,需刻意模糊错误概念,避免泄露具体失败原因(如区分密码错误与用户不存在)。
- 获取用户信息:
- 根据用户的唯一标识,从数据库中获取对应的用户数据。
- 用户退出流程:
- 清除令牌(Token)。
- 清理Cookie、Session或Token,确保会话彻底结束。
数据安全与摘要算法
5、数据安全
- 具体策略执行
- 服务器的数据对任何人来说都应该是不可见的(不透明)。
- 可以使用常见的摘要算法对数据进行摘要处理,如md5、sha等。
- 在所有数据验证的地方都加上安全保护措施,防止篡改。
6、摘要算法
- hashlib库的使用
- 常用算法包括sha系列。
- 以及md5算法。
- 用来验证数据完整性(不被篡改)
- 核心特性:哪怕【消息原文】被改动一丁点,【篡改版消息生成的消息摘要】都会与【原始消息所生成的消息摘要】大相径庭。
- 统一输出格式规范
- 输出默认都是128位二进制数(针对MD5)。
- 通常表示为32位16进制数。
- 摘要算法具有单向不可逆的特性。
UUID唯一标识生成
7、UUID
- UUID用于生成唯一标识。
- 纳秒级的时间精度
- 支持在1ns内创建1m个id,保证高并发下的唯一性。
- 基于mac地址生成。
- 结合机器编码。
- 引入随机数。
- 最终生成uuid。
常用UUID生成函数包括: uuid1() uuid3() uuid4() uuid5()
常用API操作指南
8、常用API
- 生成消息摘要的API使用。
def generate_password(password):
#定义算法
sha = hashlib.sha512()
#更新算法内容区(密码字节)
sha.update(password.encode("utf-8"))
#使用算法生成摘要
return sha.hexdigest()
- Cookie操作:
response.set_cookie("uname", username)
response.set_cookie("uname", username, max_age=30)
response.set_cookie("uname", username, expires=timedelta(minutes=1))
uname = request.COOKIES.get('uname',None)
response.delete_cookie("uname")
- 助记要点总结
- 操作客户端Cookie唯有通过Response对象。
- 方法无非get、set、delete三种。
- Session操作:
- uname = request.session.get('uname')
- request.session['uname'] = username
- request.session.flush()
- 同时清除cookie 和 session
- del request.session['uname']
- 助记内容回顾
- Session是存在于服务端本地的,而Request的COOKIE当中存有sessionid,因此通过Request对象去关联用户的session。
- 方法无非get、set、del、flush四种。
- Token操作:
response.set_cookie("utoken", token)
utoken = request.COOKIES.get("utoken")
希望本文所述对大家基于Django框架的Python程序设计有所帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













