session 与 jwt

127 阅读1分钟

session 与 jwt 对比

name关于用户数据存储rediscookie(httpOnly)跨域
session用户数据存储在服务端需要redis强依赖cookie(安全)默认不跨域
jwt用户数据存储在客户端无需redis不依赖cookie(本身加密)可以跨域

session

原理:

image.png

登录后生成一个 sessionID ( 可以是加密的 ), 存入 cookie, 并设置 httpOnly
同时将 sessionID: { userId: 668, ... } 存入 redis
前端后续请求都携带 cookie ( 里面包含 sessionID ), 后端拿到 sessionID 去 redis 里找

特点:

  1. 必须有 redis 数据库
  2. cookie 只是一个载体, 核心是传 sessionID
  3. 但放在 cookie 里, 服务端可通过设置 httpOnly 禁止客户端修改 sessionID
  4. 每次 request 请求都自动携带 cookie, 代码量少了, 但占用带宽
  5. 服务端可主动删掉 redis 里的 sessionID
  6. cookie 本身有存储容量上限小 5kb
  7. cookie 不能跨域传递
  8. sessionID 里没有敏感信息

jwt

原理:

登录后生成一个加密字符串

image.png

后续请求, 后端都要进行一次解密, 解密后的数据就是键值对集合.
例如: { userId: 1, ... }
从而确定你是谁?

特点:

  1. 无需 redis 数据库
  2. 存储灵活, 存储一般放在 sessionStorage, 请求时载体一般为 request headers
  3. 客户端可以修改 sessionStorage
  4. 每次 request 请求可以判断是否携带, 减少带宽使用率
  5. jwt 有效期间, 服务端无法主动删除此用户登录状态
  6. 如果存在 sessionStorage 里, 容量上限 5mb, 比 cookie 大
  7. 由于不必存储在 cookie 中, 可以跨域名
  8. jwt 加密字符串中包含敏感信息
  9. 灵活意味着便捷、风险