Python学习
一、学前花絮
我们在开发前后端程序,或者直接访问浏览器的时候,经常会遇到三个词:Cookie、Session、Token。它们似乎都和用户身份认证相关,但又有很多不同。本文尝试探讨这个话题。
应该说这三者都是 Web 开发中用来解决 “HTTP 是无状态协议” 这一核心问题的方案。简单来说,HTTP 协议本身无法记住用户是谁,所以需要这些机制来帮服务器“认出”你。
虽然它们的目的相似(身份验证和状态管理),但实现原理和应用场景有很大区别。为了更直观地理解,下面是一个三者特性对比表:
二、Python的flask编程详解cookie 与 tocken 以及session
2.1 三者分别都是什么
1. Cookie:客户端的“小纸条”
① 是什么?
Cookie 是服务器发送给浏览器的一小段文本数据(键值对),浏览器会将其保存在本地。之后每次访问同一域名时,浏览器都会自动把这个 Cookie 携带发送给服务器。
形象比喻:就像你去超市办了一张会员卡(Cookie),上面写着你的卡号。每次去结账,你出示这张卡,收银员就知道你是谁。
② 特点:
存储在客户端:数据存在用户的电脑/手机里。
自动发送:浏览器会自动处理,无需开发者手动干预。
容量限制:很小,通常只有 4KB 左右。
不安全:因为存在客户端,用户可以查看甚至修改(除非加密),容易遭受 XSS 或 CSRF 攻击。
③ 应用场景:
保存用户的偏好设置(如主题颜色、语言)。
跟踪用户行为(广告追踪)。
作为 Session ID 或 Token 的载体。
2. Session:服务器端的“档案柜”
① 是什么?
Session 是一种服务器端的机制。当用户登录时,服务器会在内存或数据库中创建一个“会话记录”(Session),里面存着用户的信息(如用户ID、权限)。然后,服务器会把该记录的唯一编号(Session ID)发给浏览器(通常放在 Cookie 里)。
形象比喻:你去图书馆办了一张临时阅览证(Session ID)。图书馆(服务器)的后台系统里存着你的借阅记录和身份信息(Session Data)。你只需要带着这张证(Session ID),管理员一扫就知道你是谁,以及你借了什么书。
② 特点:
数据在服务器:真正的用户数据是安全的,只有 Session ID 暴露给客户端。
有状态:服务器必须维护一个 Session 列表。
依赖 Cookie:通常依赖 Cookie 来传递 Session ID(也可以通过 URL 传递,但不安全)。
扩展性差:在分布式系统(多台服务器)中,需要专门的机制(如 Redis)来共享 Session 数据,否则用户刷新页面可能会“掉线”。
③ 应用场景:
传统的后台管理系统。
电商网站的购物车(如果涉及敏感计算)。
需要严格控制用户状态的场景(因为服务器可以主动销毁 Session)。
3. Token (令牌):自包含的“身份证”
① 是什么?
Token(通常指 JWT - JSON Web Token)是一种无状态的身份验证机制。用户登录后,服务器生成一个字符串(Token),这个字符串本身包含了用户信息(如用户ID)和签名。服务器不需要存储它,直接发给客户端。
客户端(如前端网页或 App)需要自己保存这个 Token(通常在 LocalStorage 或 Cookie 中),并在每次请求时手动把它放在 HTTP 请求头里。
形象比喻:就像你出国旅游拿到的护照(Token)。护照里印着你的照片、名字和签证信息(自包含)。海关(服务器)不需要打电话回你的国家数据库查询,只需要验证护照上的防伪印章(签名)是真的,就能放行。
② 特点:
无状态:服务器不保存 Token 状态,减轻了服务器压力。
自包含:Token 里本身就包含了用户信息(Payload)。
跨域友好:不依赖 Cookie,通过 HTTP 头传输,天然支持跨域请求。
难以注销:一旦签发,在过期时间之前,服务器很难主动让它失效(除非引入黑名单机制)。
防篡改:通过数字签名(Signature),服务器能验证 Token 是否被修改过。
③ 应用场景:
前后端分离项目(前后端部署在不同域名)。
移动端 App(原生 App 没有 Cookie 概念,通常用 Token)。
单点登录 (SSO) 和 微服务架构。
4.总结与建议
① Cookie vs Session:通常它们是配合使用的。Session 是服务器存数据的机制,而 Cookie 是传输 Session ID 的载体。
② Token vs Session:这是目前最常争论的点。
l如果你做的是传统网站,且对安全性要求极高(需要随时能踢出用户),用 Session。
l如果你做的是App、API 接口、或者前后端分离的大型分布式系统,用 Token (JWT)。
一句话总结:
Cookie 是存在浏览器里的小纸条;Session 是服务器里的档案柜,靠纸条上的编号来查;Token 则是把档案内容加密后直接发给用户,让服务器不再需要查档案柜。
2.2Python 代码(配合 Flask 框架)来模拟这三种机制
准备工作
需要安装 Flask 和 itsdangerous (用于生成 Token):
pip install flask itsdangerous |
1. Cookie 示例:存一个“访客名字”
原理:服务器直接在浏览器里存一个键值对。
操作流程:
① 访问 http://127.0.0.1:5000/set_cookie,显示如下:
② 访问 http://127.0.0.1:5000/get_cookie -> 显示如下:
2. Session 示例:服务器“档案柜”
原理:服务器在内存里存数据,只给浏览器发一个“钥匙”(Session ID)。
以上为模块导入和信息设置,下面是主要程序:
操作流程:
① 访问 http://127.0.0.1:5001/login -> 浏览器 Cookie 里多了一个 session 字段。网页显示如下:
② 访问 http://127.0.0.1:5001/profile -> 显示 "用户 123 的个人资料..."。网页显示如下:
3. Token (JWT) 示例:自包含“身份证”
原理:服务器把数据打包加密成一串字符串,发给客户端,客户端自己存,每次请求手动带上。
操作流程:
① 先访问 http://127.0.0.1:5002/login_token,复制返回的 token 字符串。浏览器显示如下:
② 使用 Postman 或 curl 访问数据接口,手动添加请求头:
Key: Authorization
Value: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.xxxxx (刚才复制的 Token)
如果带了正确的头,服务器就会返回数据。
输出结果:
其实,从另外一个层面理解token的作用会更直观,当我们直接:http://127.0.0.1:5002/api_data的时候会出现错误。这就是token的作用!Token 的核心作用之一就是访问控制(Access Control)。在没有 Token 的情况下直接访问 http://127.0.0.1:5002/api_data,服务器会拒绝你的请求。
2.3总结对比
运行这三个简单的程序,可以直观地看到区别:
三、小结
通过python编写的cookie、session和token程序,三者都是对用户访问网页的身份认证,是一种安全访问机制。但三者的实现原理都不相同。分析这几个程序,我们对flask的认识也是逐渐深入了。
让我们保持学习热情,多做练习。我们下期再见!