HTTP请求是无状态的,但是可以通过cookie, session,token等方式保存请求过程中的用户状态信息。
1 cookie
存储在用户本地的客户端, 服务器生成,发送给浏览器,下次请求统一网站给服务器。
服务端为每一个用户签发不同session id发给浏览器存储在cookie,下次访问会带上这个session id,服务端就知道这个访问是哪个用户了。
存在跨域的问题
有的客户端不支持cookie,需要手动设置,比如小程序
浏览器对cookie有限制,不能手动设置cookie,对于混合嵌套的开发有问题,比如小程序跳转H5页面,不能携带cookie
保存数据有限:浏览器对单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie
2 session
因请求会话而产生,由服务器端创建,存储在服务端,为http提供持久机制,
session是一个容器,可存放会话过程中的任何对象,cookie中存放着一个sessionID,请求时会发送这个ID。
session一定时间内保存在服务器上,当访问增多,比较耗服务器资源。
分布式或者集群部署时存在session共享的问题,(需要引入redis, memcached来解决)
3 token
令牌,由uid+time+sign[+固定参数],属于一种临时的证书签名,是服务端发放给客户端的通行证在服务端产生的。
uid: 用户唯一身份标识
time: 当前时间的时间戳
sign: 签名, 使用 hash/encrypt 压缩成定长的十六进制字符串,以防止第三方恶意拼接
固定参数(可选): 将一些常用的固定参数加入到 token 中是为了避免重复查库
token在客户端一般存放于localStorage,cookie,或sessionStorage中。在服务器一般存于数据库中
token 的认证流程与cookie很相似
用户登录,成功后服务器返回Token给客户端。
客户端收到数据后保存在客户端
客户端再次访问服务器,将token放入headers中
服务器端采用filter过滤器校验。校验成功则返回请求数据,校验失败则返回错误码
常用token认证方案:JWT -- JSON WEB TOKEN