token认证流程
- 用户登录校验,校验成功后就返回Token给客户端
- 客户端收到数据后保存在客户端
- 客户端每次访问API是携带Token到服务端,通常置于header头内
- 服务器端采用filter过滤器校验。校验成功则返回请求数据,校验失败则返回错误码
token缺陷
- token 一般都是 hash/encrypt 的字符串,会额外附加 加密/解密,需要一定性能开销
- 无法作废已颁布的令牌
- 认证发出后的过期时间内难以令其失效或撤销,类似缓存,只能自然死亡
- 更多的空间占用
- 放在客户端,需要考虑cookie的空间限制因素
- 放在localStorage,则可能到受到Xss攻击
合理使用
- 将cookie作为存储机制 JWT,并且设置HttpOnly=true
- 确保只能由服务端保存以及通过自动回传的cookie取得JWT
- 在JWT中尽可能只放“够用”的认证信息,其他信息放在数据库,需要时再获取
- 数字签名,要求发放方验证票据是否合法
- 关键点
- 存储与认证,token主要是解决认证的验证问题
- sessionId在负载均衡时,下一次使用会丢失上次状态,多服务器通信为保持状态一致性,通常会复制sessionID
- 应用场景
- JWT适合一次性的命令认证,颁发一个有效期极短的JWT,即使暴露了危险也很小,由于每次操作都会生成新的JWT,因此也没必要保存JWT,真正实现无状态。
http协议中的cookie
- cookie存储
- Cookie总是保存在客户端,可存储在内存和硬盘上
- 内存cookie由浏览器维护,浏览器关闭即消失,也称之为非持久cookie
- cookie属性
- Domain:域,表示当前cookie所属于哪个域或子域下面
- Expire time/Max-age:表示了cookie的有效期
- secure:表示该cookie只能用https传输
- httponly:表示此cookie必须用于http或https传输,不允许浏览器脚本访问操作此cookie
- cookie交互
- 从服务器端,发送cookie给客户端,是对应的Set-Cookie,发送cookie的各个属性
- 从客户端发送cookie给服务器的时候,只是发送对应的名称和值,可通过js脚本document.cookie去设置对应的cookie
- cookie会被附加在每个相应的HTTP请求中