一、学前花絮
应该说这三者都是 Web 开发中用来解决 “HTTP 是无状态协议” 这一核心问题的方案。简单来说,HTTP 协议本身无法记住用户是谁,所以需要这些机制来帮服务器“认出”你。
1. cookie:客户端的“小纸条”
- 是什么?
形象比喻:就像你去超市办了一张会员卡(cookie),上面写着你的卡号。每次去结账,你出示这张卡,收银员就知道你是谁。
- 特点:
自动发送:浏览器会自动处理,无需开发者手动干预。
不安全:因为存在客户端,用户可以查看甚至修改(除非加密),容易遭受 XSS 或 CSRF 攻击。
- 应用场景:
跟踪用户行为(广告追踪)。
2. Session:服务器端的“档案柜”
- 是什么?
形象比喻:你去图书馆办了一张临时阅览证(Session ID)。图书馆(服务器)的后台系统里存着你的借阅记录和身份信息(Session Data)。你只需要带着这张证(Session ID),管理员一扫就知道你是谁,以及你借了什么书。
- 特点:
有状态:服务器必须维护一个 Session 列表。
扩展性差:在分布式系统(多台服务器)中,需要专门的机制(如 Redis)来共享 Session 数据,否则用户刷新页面可能会“掉线”。
- 应用场景:
电商网站的购物车(如果涉及敏感计算)。
3. Token (令牌):自包含的“身份证”
- 是什么?
客户端(如前端网页或 App)需要自己保存这个 Token(通常在 LocalStorage 或 cookie 中),并在每次请求时手动把它放在 HTTP 请求头里。
无状态:服务器不保存 Token 状态,减轻了服务器压力。
跨域友好:不依赖 cookie,通过 HTTP 头传输,天然支持跨域请求。
防篡改:通过数字签名(Signature),服务器能验证 Token 是否被修改过。
- 应用场景:
移动端 App(原生 App 没有 cookie 概念,通常用 Token)。
4.总结与建议
- cookie vs Session:通常它们是配合使用的。Session 是服务器存数据的机制,而 cookie 是传输 Session ID 的载体。
- Token vs Session:这是目前最常争论的点。
- 如果你做的是传统网站,且对安全性要求极高(需要随时能踢出用户),用 Session。
- 如果你做的是App、API 接口、或者前后端分离的大型分布式系统,用 Token (JWT)。
cookie 是存在浏览器里的小纸条;Session 是服务器里的档案柜,靠纸条上的编号来查;Token 则是把档案内容加密后直接发给用户,让服务器不再需要查档案柜。
2.2 Python 代码(配合 Flask 框架)来模拟这三种机制
需要安装 Flask 和 itsdangerous (用于生成 Token):
1. cookie 示例:存一个“访客名字” 操作流程: 2.访问 http://127.0.0.1:5000/set_cookie,显示如下: 3.访问 http://127.0.0.1:5000/get_cookie -> 显示如下: 原理:服务器在内存里存数据,只给浏览器发一个“钥匙”(Session ID)。 操作流程:
原理:服务器把数据打包加密成一串字符串,发给客户端,客户端自己存,每次请求手动带上。 Key: Authorization 如果带了正确的头,服务器就会返回数据。 其实,从另外一个层面理解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的认识也是逐渐深入了。 让我们保持学习热情,多做练习。我们下期再见! 快乐男孩 热门推荐 |
