课程大纲
Cookie、Session和Token是Web应用中常用的身份验证和会话管理机制,各有特点,适用于不同的应用场景。
一、Cookie
1.1 什么是Cookie
Cookie是存储在客户端浏览器中的小段数据,通常用于存储用户偏好设置或用于跟踪用户活动。
Cookie可以包含用户身份验证的信息,如会话ID,但存储在客户端的Cookie信息可能会被用户清除或被第三方拦截。
优点:易于实现和设置。
缺点:安全性较低,因为数据存储在客户端,容易被篡改或窃取。
1.2 Cookie的组成
(Chrome浏览器查看Cookie)
1.Name:Cookie的名称。
2.Value:对应名称的值。
3.Domain:Cookie的域名。
4.Path:Cookie生效的路径(和Domain组合)。
5.Expires:过期时间,过了这个时间后Cookie失效。3种取值:
① 整数数值:秒数,超时后过期。
② UTC时间字符串。例如:2024-08-25T04:36:07.006Z。
(T是一个分隔符,Z代表UTC即世界标准时间,是格林尼治时间时间,即北京时间减8h)
③ Session:浏览器会话结束,清除cookie。
一般用户关闭浏览器窗口或标签页时,cookie将不再存在;而一些浏览器重启时,也会将会话恢复,此时Cookie并不会失效。
6. Max-age:生效时间,表示Cookie在多长时间后失效。(整数数值:秒数,超时后过期。)
7. Size:Cookie的长度,name和value的长度和(字节数)。
(不同浏览器cookie个数和大小的限制)
8.HttpOnly:True/False。只允许http请求访问使用cookie,禁止JavaScript读取或修改Cookie。
9.Secure:True/False。是否只允许加密协议HTTPS协议传输Cookie。
10.SameSite:是否允许跨站请求时发送Cookie。
是否跨域 | 是否跨站 | |
子域名不同, 如:a.txm.com与b.txm.com | √ | × |
端口不同, 如:txm.com:8000与txm.com:9000 | √ | × |
IP不同(直接使用IP访问网站) | √ | √ |
11.Partitioned:第三方Cookie分区。
12.Priority:优先级。
详见参考文章《浏览器中Cookie的全面介绍》:
https://blog.csdn.net/qq278672818/article/details/131753651
1.3 Cookie的传递方式
Cookie通过请求头和响应头传输。
(请求header里的Cookie)
客户端请求头中Cookie格式 |
Cookie:’key1=value1;key2=value2…;key100=value100’ |
服务器响应头设置Cookie |
Set-Cookie:`name=value` [; expires=`date`] [; domain=`domain`] [; path=`path`] [; secure] [; httponly] [; samesite=`strict`/`lax`/`none`] |
二、Session
2.1 什么是Session
Session是服务器端用来跟踪用户会话状态的一种机制。
用户首次访问网站时,服务器会创建一个唯一的会话标识(session ID),并将其存储在用户的Cookie中。服务器通过这个会话标识来识别用户,并保持用户的会话状态。
优点:安全性较高,因为会话数据存储在服务器端,不易被篡改或窃取。
缺点:
① 访问用户多时,可能会造成服务器压力;
② 如果网站架构涉及多个服务器,需要解决Session共享的问题,增加实现的复杂性和成本。
2.2 Session的传递方式
① 使用服务器端的session对象:将要传递的值存储在服务器端的session对象中,然后在不同的页面中读取该session对象获取传递的值。
② 使用URL参数:将要传递的值作为URL的参数传递给下一个页面,下一个页面可以通过获取URL参数来获取传递的值。
③ 使用表单或链接:将要传递的值放在表单的隐藏字段中或者作为链接的参数,在提交表单或点击链接时将值传递给下一个页面。
举例:写一个隐藏的输入框,用户无法看到。
<form id="hiddenForm" action="your-server-endpoint" method="post" style="display: none;">
<input type="text" name="username" />
<input type="password" name="password" />
<input type="hidden" name="csrf_token" value="your_csrf_token" />
</form>
④ 使用cookie:将要传递的值存储在cookie中,在下一个页面读取cookie获取传递的值。
举例:
Cookie: session_id=txm001;user=tuxiaomao
三、Token
3.1 什么是Token
Token是一种认证令牌,通常是一小段加密字符串,可以存储在Cookie中或直接作为HTTP请求头的一部分发送。
Token的认证方式类似于临时的证书签名,是一种服务端无状态的认证方式,服务端不会保存与用户相关的任何状态信息,每次请求时只需验证Token的有效性。
优点:安全性较高,因为Token不会被浏览器自动发送到不安全的域,且可以通过加密算法确保其不可伪造性。
缺点:如果Token被泄露,可能会导致安全问题。
3.2 Token的传输方式
① 存储在Cookie中或直接发送。
格式:
Cookie:token=Basic [编码后的字符串]
或
Cookie:token=Bearer [编码后的字符串]
举例:
Cookie:token=Basic dHV4aWFvbWExMjM0NTY=
② HTTP请求头的一部分发送(使用Authorization字段)。
格式:
Authorization:Basic [编码后的字符串]
或
Authorization:Bearer [编码后的字符串]
举例:
Authorization: Bearer sfakgnkasnfdaoie=
3.3 Basic token和Bearer token
Basic token和Bearer token是两种不同的身份验证方式。
Basic token:用户名和密码使用base64编码后,加前缀“Basic [token字符串]”(注意有空格)。
举例:tuxiaomao123456经过base64编码后,如下。
Authorization:Basic dHV4aWFvbWExMjM0NTY=
Bearer token:调用登录接口,发送用户名密码登录成功,服务器随机返回一个自定义的加密token字符串,客户端接收后,使用该token进行后续请求。
对比项 | Basic token | Bearer token |
token生成端 | 客户端 | 服务器 |
生成方式 | 用户名+密码Base64编码。 | 登录接口,服务器创建并返回。 |
加密方式 | Base64编码(通用编码) | 系统自定义加密方式 |
安全性 | 低(易破解) | 高 |
时效性 | 无 | 有,过期失效(如2h) |
token特点 | 只要用户名密码不变,token固定不变。 | token不固定,每次登录返回新token,过期失效需重新登录获取。 |
总结
Cookie适用于简单的身份验证和跟踪用户活动,但安全性较低;
Session提供了较高的安全性,通过服务器端管理会话状态,但需要解决跨服务器会话共享的问题;
Token则提供了较高的安全性,适用于REST API等无状态服务,但需要注意Token的管理和安全性问题。
参考文章:
1、《浏览器中Cookie的全面介绍》
https://blog.csdn.net/qq278672818/article/details/131753651
2、《session跨页面传值的方法是什么》
https://www.yisu.com/ask/56108246.html