这两天闲逛掘金,看到了一个19年大火的文章,讲的是token、cookie、session、jwt,和我之前认为的有一些不同
去伪留臻,记而存之

附上链接:https://juejin.cn/post/6844904034181070861?searchId=202407022020106665740BE9EADAA2CD66

主要概念:

  • session
  • cookie
  • token
  • jwt json web token
  • oauth2

session和token是一种 ”信息组成“ 的策略

jwt是一种高级协议,解决了token中的一些问题

cookie是一种信息载体,如同localstorage和sessionstorage

Oauth2,第三方登录协议

不同概念之间可比较性不高,这也是juejin那篇文章误导性很强的地方之一

存储方式:cookie、localstorage、sessionStorage

cookie存储的信息大多被用于:

  • 会话状态管理
    • 用户登陆状态等
  • 个性化设置
    • 自定义设置、主题和其他设置
  • 浏览器行为跟踪
    • 分析用户行为

浏览器第一次请求服务端数据,服务端设置cookie

不过cookie存储空间较小,大约4k

localStorage、sessionStorage

两者的区别是,sessionStorage只在一次会话中有效

验证信息策略

Session

浏览器第一次向服务端请求,服务端生成一个seesionid,并储存到内存或者redis或者数据库中,之后,并且把sessionid返回给客户端,此时,可以选择存到cookie中并且不设置过期时间(关闭session清除),也可以放到前端内存(即声明一个全局变量)中(关闭应用清除)。每次请求服务端数据时,服务端检查cookie是否存在sessionid并且进行验证,如果缓存中有sessionid,那么则通过,没有则重新登录

sessionId生成策略:可以是随机数、也可以是客户端传来的数据

特点:存放在服务端,服务端每次收到请求都会查询是否存在sessionid,会给服务端查询造成压力

Token

客户端进行登录时,服务端生成一个token(字符串,可以有意义也可以无意义)返回给客户端并由客户端保存,之后每次请求,需要由客户端带上这个token,服务端进行验证

以下是几种token中常用的策略(拓展、变式)

  • 双token,(多用于实现无感登录)
    • 即有两种token,access token 用于请求数据,refresh token 用于刷新access token
    • access token 有效期较短,refresh token 有效时间较长
    • 客户端登录时,服务端生成两个token,access token随请求返回到客户端,用于每次请求时进行验证;refresh token 放到 http
      only cookie中,以使客户端无法访问,增加安全性,用于access token过期时进行刷新
  • JWT 一种 token 的 格式以及包含的信息 的*规范
    • 由三部分组成,头部、中部、尾部, 用.分割,如:xxxxx.yyyyy.zzzzz
    • 头部:加密方式等,使用base64编码
    • 中部:用户的信息,如:用户id等,使用base64编码
    • 尾部:头部和中部结合(简单拼接)后,使用头部声明的加密方式进行加密
    • 客户端进行储存,请求时,只需带上jwt,然后客户端进行解码验证,验证无误则有效,节省存储sessionid的服务器压力,用解码时间换取空间

OAuth2

简单的来说,OAuth2也就是第三方认证,比如你想用微信的号登录小红书这个过程,就是OAuth2的过程