HTTP简介
HTTP协议(超文本传输协议HyperText Transfer Protocol)是一种无状态协议,协议本身不会对发送过的请求和对应的通信状态进行持久化处理。这样的好处是可以保持HTTP协议的简单性,高效率处理大量事务。
但是随之就会出现一个问题:如何判断两个请求是否是同一个用户发起的?
往大了说就是权限问题,身份认证!
cookie
Cookie是一种存储在客户端上的小型文本文件,目的是为了辨别用户身份和进行会话跟踪。它是由服务器生成并发送给客户端的,大小通常限制在4KB左右。
cookie相关属性(键值对的形式):
属性名 | 作用 |
---|---|
name | 指定Cookie的名称 |
value | 指定Cookie的值 |
comment | 指定Cookie的描述信息 |
domain | 指定Cookie所属的域名。如果设置了domain,Cookie将只发送到来自该域的请求。这可以防止不同域名的网站访问到彼此的Cookie |
expires | 指定Cookie的过期时间。如果设置了expires,Cookie将在指定的日期和时间后过期。如果没有设置,则Cookie将在浏览器关闭时失效 |
max-age | 指定Cookie的生存期,以秒为单位。当max-age为0时,表示立即删除Cookie;当设置为正数时,表示Cookie将在多少秒后过期 |
path | 指定了Cookie应该发送到服务器的哪些页面路径。如果设置了path,Cookie将只发送到与之匹配的路径下的请求 |
secure | 是否使用安全协议传输,比如SSL等。有助于防止Cookie被拦截或窃取 |
version | 版本号 |
isHttpOnly | 设置这个属性,Cookie将不会通过客户端脚本(如JavaScript)被访问,有助于减少跨站脚本攻击(XSS)的风险,只有浏览器发出 HTTP 请求时,才会带上该 Cookie |
cookie特点:
- 存储在客户端
- 不可跨域,如果设置了 domain,那么可以在一级域名和二级域名之间进行共享
session
Session是一种用于存储用户会话信息的技术,在服务器端生成并存储,它允许网络应用程序在多个页面请求之间保持用户的状态和数据共享。
注意:
Session通常存储在服务器的内存中,有利于数据的读取。但是,如果服务器重启或发生故障,Session数据可能会丢失。因此,一些应用程序可能会选择将Session数据进行持久化,如存储在数据库或文件系统中。
禁用cookie的情况,如何保证session机制
Session是依赖Cookie来存储sessionId的,默认情况下,如果禁用了Cookie,Session就不能使用了。另外一些客户端本身就不支持cookie。我们可以通过特殊的手段让session机制继续使用:
- URL中携带sessionId:通过URL重写的方式将sessionId添加到所有的URL中。服务器生成sessionId后,将其作为URL的一部分传递给客户端,客户端后续的请求将sessionId携带在URL中;服务器端需要解析URL拿到sessionId,获取用户的会话状态。
- 隐藏表单字段传递sessionId:将sessionId添加到Html表单的隐藏字段中。在每个表单中添加一个隐藏字段,用以存储sessionId;客户端提交表单时会将sessionId一块儿发送到服务器端,服务器通过解析表单拿到sessionId,获取用户的会话状态。
产生了新的问题:
- 代码复杂度提高
- 安全风险增加
cookie和session的联系与区别
联系:
cookie和session两者是通过session Id关联起来的(session Id是两者之间的桥梁)
区别:
- cookie存储于客户端;session存储于服务器端
- cookie适用于存储少量的,不敏感的用户数据;session适合存储大量的,需要安全保护的用户数据;也就是session更加安全
- cookie只支持存储字符串数据;session可存储任意数据
token
token是一种认证机制,用于在客户端和服务器之间传递信息和权限。
token是一串由服务器生成的字符串,它作为客户端请求的一个令牌或标识,具有权限的作用。Token的主要目的是为了减少频繁的用户名和密码验证过程,提高系统的安全性和效率。其主要由三部分组成:
- 标头(Header):包含算法和类型,用于指定如何对有效载荷进行编码和签名。常见的算法有HMAC、RSA、SHA等。
- 有效载荷(Payload):包含用户相关信息:用户ID,角色,权限等。用于身份验证和授权。可以是明文也可以是密文。
- 签名(Signature):对标头和有效载荷进行签名后得到的值,用于验证token的完整性和真实性。签名通常使用私钥进行签名,并使用公钥进行验证。
session和token的区别
- session是典型的空间换时间,每次对用户完成认证后都需要将会话信息session存储在服务器上,可能会导致:
- 服务器重启,用户需重新认证
- 分布式系统中如果请求到没有session的服务模块上,导致用户需重新认证
- token就是时间换空间了,因为数学算法的唯一性,在分布式系统中每个节点都可完成认证,多个服务之间可以公用一个token,但是token校验会涉及复杂的解析和运算,在响应时间上会略逊一筹。
综上:session适用于用户量较小的web系统,通过缓存机制即可快速实现用户认证;而token适用于session无法使用的分布式系统、移动应用、小程序等。