HTTP 请求中 cookie 和 token 有什么区别

在用于用户登录的场景中时,可能会用到2种方法:

① cookie+session【用户信息存储在服务器的session中,通过sessionId作为桥梁】
② token/JWT【用户信息由每个客户端自行存储token】

cookie 和 session

cookie

  • HTTP 无状态,每次请求都要带 Cookie,以帮助识别身份
  • 服务端也可以向客户端 set-cookie,cookie 大小限制 4kb
  • 默认有跨域限制:不跨域共享cookie、不跨域传递 cookie

前端和服务端可以设置 withCredentials

cookie 本地存储

  • HTML5 之前 Cookie 常被用于本地存储
  • HTML5 之后推荐使用 localStorage 和 sessionStorage

现代浏览器开始禁止第三方 cookie

  • 和跨域限制不同。这里是:禁止网页引入的第三方 JS 设置 cookie
  • 打击第三方广告,保护用户隐私
  • 新增属性 SameSite: Strict/Lax/None; 值可自己选择

Cookie 和 session

  • Cookie 用于登录验证,存储用户标识(如 userId)
  • session 在服务器端,存储用户详细信息,和 Cookie 信息一一对应
  • Cookie + session 是常见登录验证解决方案

用户登录逻辑

登录 用户名 密码
set-cookie userId="x1"
cookie userId:"x1"

服务端-缓存
const session = {
  x1 = {
    username: 'xxx',
    phone:'183XXXXxxxx',
    emial'xxx@qq.com'
  }
}

token 和 JWT

token vs cookie

  • cookie 是 HTTP 规范,而token 是自定义传递
  • Cookie 会默认被浏览器存储,而 token 需要自己存储
  • token 默认没有跨域限制

Cookie 更加标准,限制更多,随着网络发展,派生出更加灵活的 token

JWT (JSON Web Token)

  • 前端发起登录,后端验证成功之后,返回一个加密的 token
  • 前端自行存储这个 token (其中包含了用户信息,加密了)
  • 以后访问服务端接口,都带着这个 token ,作为用户信息

【总结:】

  • cookie:HTTP 标准;跨域限制;配合 session 使用
  • token:无标准;无跨域限制;用于JWT

token 用户登录逻辑 JWT

❶ 用户输入用户名和密码,
❷ 服务端校验用户名和密码之后,生成 加密过后的 token 字符串,然后传递给前端
❸ 前端拿到 token 之后,用户自己在浏览器存储起来,
❹ 前端每次发送请求的时候都要带上 token ,发送给服务端

session 和 JWT 哪个更适合

session 优点

  • 原理简单,易于学习
  • 用户信息集中存储在服务端,统一管理所有用户,可快速封禁某个用户

session 缺点

  • 占用服务端内存,硬件成本高
  • 多进程,多服务器时,不好同步–需要使用第三方缓存,如 redis
  • 默认有跨域限制

JWT优点

  • 不占用服务端内存
  • 多进程、多服务器,不受影响
  • 没有跨域限制

JWT缺点

  • 用户信息存储在客户端,无法快速封禁用户
  • 万一服务器密钥泄露,则用户信息全部丢失
  • token 体积一般大于 Cookie ,会增加请求的数据量

总结:

  • 如果有严格管理用户信息的需求(保密、快速封禁)推荐 Session
  • 如果没有特殊要求,则使用 JWT (如创业初期的网站)

Cookie、Session、Token、Jwt的用途与区别

如何实现SSO单点登录

❶ 主域名相同时,可基于 cookie

  • cookie 默认不可跨域共享,但有些情况下可设置为共享
  • 主域名相同,如 www.baidu.com image.baidu.com
  • 设置 Cookie domain 为主域名,即可共享 cookie

❷ 主域名不同

当主域名不同的时候,可启动第三方sso系统,把所有的登录和验证都交给第三方来做,而不是让系统A和系统B各自单独存储用户信息。

这样用户访问系统 A 的时候通过重定向去到第三方sso登录,而不是直接登录系统A, 系统A收到用户的登录信息,也会再调用第三方sso系统来验证用户的登录信息,再操作。

❸ OAuth 2.0

用户不用输入手机号码,直接通过常用的第三方去登录,比如:微信、qq、