自学软件测试day10——Cookie、Session和Token
本文对比分析了Cookie、Session和Token三种身份验证技术。Cookie是存储在客户端的文本数据(4KB限制),用于解决HTTP无状态问题,但存在安全风险。Session依赖服务器存储会话状态,通过Cookie传递SessionID,存在服务器资源消耗和分布式实现困难的问题。Token采用加密签名验证机制,无需服务器存储,具有无状态、跨域和分布式优势,通过计算时间换取存储空间。三种技术
本文对比分析了Cookie、Session和Token三种身份验证技术。Cookie是存储在客户端的文本数据(4KB限制),用于解决HTTP无状态问题,但存在安全风险。Session依赖服务器存储会话状态,通过Cookie传递SessionID,存在服务器资源消耗和分布式实现困难的问题。Token采用加密签名验证机制,无需服务器存储,具有无状态、跨域和分布式优势,通过计算时间换取存储空间。三种技术各有特点:Cookie简单但受限,Session适合单系统但资源消耗大,Token则更适合现代分布式系统架构。
一、Cookie
1、Cookie介绍
解决的问题
我们用浏览器打开一个网页,用到的是HTTP协议。HTTP协议是无状态的。就是说这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的。无状态的好处是快速
网络早期最大的问题是服务器无法知道2个请求是否来自同一个浏览器
于是出现了Cookie和Session
Session对象的使用离不开Cookie的支持
浏览器会将Cookie的key / value保存到某个目录下的文件内
浏览器Cookie 是分站点的,站点和站点之间的相互独立
浏览器中的Cookie 有个数限制的,大部分浏览器每个站点的Cookie不能超过50个
浏览器中的 Cookie 是大小限制的,大部分浏览器每个站点的Cookie 大小不能超过4KB
2、Cookie产生
由服务器产生——典型例子:sessionID
具体过程如下:
(一)客户端的某次请求——>发送给服务器
(二)服务器产生一个Cookie,附加在HTTP响应头中(Set - Cookie),传递给客户端浏览器→浏览器保存Cookie
(三)客户端之后的所有请求,都会把Cookie附加在HTTP请求头中,传递给服务器→服务器校验有用的Cookie信息


3、Cookie类型
按照过期时间,Cookie分为2类:会话cookie和持久cookie
会话cookie是一种临时cookie,用户退出浏览器,会话cookie就会被删除了
持久cookie则会存储在硬盘里,保留时间更长,关闭浏览器,重启电脑,它依然存在
应用场景:记住用户名密码(自动登录)、购物车功能
4、Cookie安全威胁
Cookie泄露与欺骗——跨站请求伪造
(Cross - Site Request Forgery,简称CSRF)
Cookie 注入可执行代码——跨站脚本攻击XSS
5、Cookie测试点
检查 Cookie 是否能正常工作
是否按预定的时间进行保存
刷新对 Cookies 有什么影响
禁用或删除从哦 cookie 是否友好提示(重新登陆等)
6、浏览器缓存
浏览器缓存(Browser Caching)是为了节约网络的资源加速浏览,浏览器在用户磁盘上对最近请求过的文档进行存储,当访问者再次请求这个页面时,浏览器就可以从本地磁盘显示文档,这样就可以加速页面的阅览。
7、Cookie和缓存的区别
缓存只是对静态资源的处理,Cookie是一种动态机制
缓存大小受资源和磁盘空间的限制
Cookie本身有大小限制,一般浏览器限制大小不能超过4kb
缓存不会发送服务器,cookie会请求一并自动发送
作用不一样,缓存浏览器就可以从本地磁盘显示文档,可以加速页面的阅览。Cookie是服务器辨别用户身份,维护通信传输状态。
二、Session和Token
1、什么是session?
文件Session一般译作会话,进行某些获得持续的一段时间。从打开某个网站到关闭浏览器,这是一个会话。
服务器为了保存用户状态而创建的一个特殊的对象。
当浏览器第一次访问服务器时,服务器创建一个 session 对象(该对象有一个全局唯一的id,一般称之为 sessionId ),服务器会将 sessionId 以 cookie 的方式发送给浏览器。
当浏览器再次访问服务器时,会将 sessionId 发送过来,服务器依据 sessionId 就可以找到对应的 session 对象。

2、Session和Cookie实现登录
Java项目通常做法
当浏览器发送请求时,服务器会自动判断浏览器是否有带SessionID
如果没有带SessionID,立马生成一个全新的SessionID给它
如果有带SessionID,会校验服务器内存是否存在,如果不存在,则立马生成一个全新的给它;如果存在,则不处理
之后的每次请求,都会刷新服务端SessionID的有效期
到这里为止,不管用户是否已经登录,客户端都有可以用的SessionID
当输入正确的用户名、密码,点击登录按钮,如果登录成功
程序员会把SessionID存入到另外一个【内存变量中2】容器中
之后的每次请求,权限拦截器都会拦截到你的SessionID,并和内存中的【内存变量2】进行查找,如果发现查找不到,则会帮你重定向到登录界面
当客户端主动注销,服务器会调用invalidate方法注销服务器上的Session,并重定向到登录界面,又会产生新的SessionID
其他项目做法
当输入正确的用户名、密码,点击登录按钮,如果登录成功
服务器会生成一个 SessionID 返回给客户端,客户端浏览器存到 Cookie
当用户主动注销,【服务器端】会同时删除【服务器端 SessionID 】和【客户端 Cookie 】
3、什么是token?
Token 认证方式与 session 类似。为了防止客户端伪造 session id 。Token 采用时间戳+签名的方式一起作为 token 发送到服务端,服务端验证签名数据,通过则可以访问,验证失败,则拒绝请求。
在计算机身份认证中是令牌(临时)的意思,在词法分析中是标记的意思。一般作为邀请、登录系统使用。
Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个 Token 便将此 Token 返回给客户端,以后客户端只需带上这个 Token 前来请求数据即可,无需再次带上用户名和密码。
4、Token创建
场景:基于 Token 的身份验证方法,在服务器不需要存储用户的登录记录,完成无状态认证
客户端使用用户名和密码请求登录,对帐号和密码做一个签名,比如说我用 HMAC-SHA256 算法,加上一个只有我才知道的密钥,把这个签名和数据一起作为 token
服务端用同样的 HMAC-SHA256 算法和同样的密钥(盐),对数据计算一次签名,和 token 中的签名做个比较,如果相同,验证成功,返回响应;如果不相同 ,数据部分肯定被人纂改过,我就告诉发送者:对不起,没有认证
CPU 计算时间获取 session 存储空间
5、Token与session的区别?
1) token 和 session 其实都是为了身份验证,session 一般翻译为会话,而 token 更多的时候是翻译为令牌;
2) session 在服务器端会保存一份,可能保存到缓存、文件或数据库;
3)session 和 token 都是有过期时间一说,都需要去管理过期时间;
4)token 的思想是算法验证,session 的思想是信息存储对比。 token 是有多种方案的,可以设计成无需存储,token 同时也是跨域的,session 是要存储的,存储在数据库的思想;
5)其实 token 与 session 的问题是一种时间与空间的博弈问题,session 是空间换时间,而 token 是时间换空间。两者的选择要看具体情况而定;
6)虽然确实都是 “ 客户端记录,每次访问携带 ” ,但 token 很容易设计为自包含的,也就是说,后端不需要记录什么东西,每次一个无状态请求,每次解密验证,每次当场得出合法 /非法的结论。
6、总结
cookie:保存在浏览器中,有大小限制,有状态;
session:保存在服务器中,服务器有资源开销,分布式、跨系统不好实现;
Token:客户端可以将 Token 保存到任何地方,无限制,无状态,利于分布式部署
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)