无状态
http是无状态的啦,也就是说,http请求方和响应方无法维护状态,都是一次性的,有些场景需要登陆怎么办?就需要维护状态进行标记
Cookie(维持HTTP请求状态的基石)
前端存储的一种方式,相比于localStorage等其他方式,借助Http头部,浏览器能力,可以做到无感知。
- 存储在客户端的,不可以跨域
- 过程:
- 在提供标记的接口,返回http返回头的Set-Cookie字段,直接种在浏览器中
- 浏览器发送请求的时候,会自动把cookie通过http请求头的字段 Cookie,带给接口
- 前端可以自己创建cookie 如果服务器创建cookie每家HttpOnly,也可以给他加入cookie
- 调用document.cookie可以创建,修改cookie,和HTTP一样,一次document.cookie只能操作一个cookie
服务端Session(基于Cookie实现的)
- 过程:
- 浏览器登录发送账号密码,服务端查找用户库对用户校验
- 服务端把用户登录状态存为Session,生成sessionId
- 通过登录接口返回,把sessionId 给到Cookie
- 之后浏览器再次请求业务,sessionId随cookie带上
- 服务端查sessionId校验 session
- 成功后正常业务处理,返回结果
- sessionId是连接cookie和Session的一道桥梁
- 存储方式:具体内容自己存储
- 过期销毁:只要把存储的session进行销毁
二者区别
- 安全性:Session是比Cookie安全的,Session存储在服务器,Cookie存储在客户端
- 存取值是不同的,Cookie只支持字符串数据,想要其他类型需要转换成字符串,Session传递任意类型
- 存储的大小不同,单个Cookie保存的数据不能超过4k这个其实根据浏览器来确定的,Session存储数据的大小远远超过Cookie,但是数据过多会占用服务器的资源
Token(令牌)
- Access Token:访问接口时所需要的接口凭证
- 简单token组成:uid(用户唯一身份标识),time(当前时间),sign(签名)
- 特点:
- 服务端无状态化,可拓展性好
- 支持移动端设备
- 安全
- 支持跨程序调用
- 过程:
- 客户端使用用户名和密码进行登录
- 服务端收到请求,去验证用户名和密码
- 验证成功后,服务端会签发一个token并把这个token发送给客户端
- 客户端收到token之后,存储,放到cookie或者localStorage内部
- 客户端每次请求需要携带这个token
- 服务器收到请求,验证token,验证成功,就返回请求数据
- 注意:
- 每次请求都需要携带token,并且把token放到Http的Header内部
- token的用户认证是一种无状态的认证方式,服务端不用存放token数据。用解析token的时间来换取session的存储空间,减轻服务器压力
- token完全由应用管理,可以避开同源策略