session 与 jwt 对比
| name | 关于用户数据存储 | redis | cookie(httpOnly) | 跨域 |
|---|---|---|---|---|
| session | 用户数据存储在服务端 | 需要redis | 强依赖cookie(安全) | 默认不跨域 |
| jwt | 用户数据存储在客户端 | 无需redis | 不依赖cookie(本身加密) | 可以跨域 |
session
原理:
登录后生成一个 sessionID ( 可以是加密的 ), 存入 cookie, 并设置 httpOnly
同时将 sessionID: { userId: 668, ... } 存入 redis
前端后续请求都携带 cookie ( 里面包含 sessionID ), 后端拿到 sessionID 去 redis 里找
特点:
- 必须有 redis 数据库
- cookie 只是一个载体, 核心是传 sessionID
- 但放在 cookie 里, 服务端可通过设置 httpOnly 禁止客户端修改 sessionID
- 每次 request 请求都自动携带 cookie, 代码量少了, 但占用带宽
- 服务端可主动删掉 redis 里的 sessionID
- cookie 本身有存储容量上限小 5kb
- cookie 不能跨域传递
- sessionID 里没有敏感信息
jwt
原理:
登录后生成一个加密字符串
后续请求, 后端都要进行一次解密, 解密后的数据就是键值对集合.
例如: { userId: 1, ... }
从而确定你是谁?
特点:
- 无需 redis 数据库
- 存储灵活, 存储一般放在
sessionStorage, 请求时载体一般为request headers - 客户端可以修改 sessionStorage
- 每次 request 请求可以判断是否携带, 减少带宽使用率
- jwt 有效期间, 服务端无法主动删除此用户登录状态
- 如果存在 sessionStorage 里, 容量上限 5mb, 比 cookie 大
- 由于不必存储在 cookie 中, 可以跨域名
- jwt 加密字符串中包含敏感信息
- 灵活意味着便捷、风险