这是我参与「第四届青训营 」笔记创作活动的第3天
传统的session验证
session认证流程:
- 用户第一次请求服务器 服务器根据用户提交的相关信息 创建session
- 响应会返回sessionid (会话唯一标识
- 浏览器应当将session id存到cookie里面 同时记录这个session id是哪个域名的
- 再次访问的时候 会自动判断这个域名下有没有存cookie 存cookie的session id会放在cookie请求头发送过去 服务器看到这个cookie里面的sessionid就知道是之前访问过的用户了
jwt
token分为三部分:
-
header -json对象+base64编码
- alg- 表明签名的算法
- typ -默认为jwt
-
payload -实际负载的数据 (json对象+base64编码
- 存放实际数据 eg:用户的
id
和name
- 默认情况下会携带令牌签发时间iat
- 存放实际数据 eg:用户的
-
Signature -对header和payload进行签名
- 设置一个
secretKey
,对前两个的结果进行HMACSHA25
算法 - 如果前面两部分的数据被更改了,只要密钥没有被泄漏,得到的签名就不一样
- 设置一个
Signature = HMACSHA256(base64Url(header)+.+base64Url(payload),secretKey)
使用过程:
- nodejs jsonwebtoken 生成token express-jwt验证
- 前端收到token 并进行存储在localStorage里面 登录要验证的页面的时候就放在请求头
Authorization
token前要加上Bearer
和空格
优点:
- json具有通用性,可以跨语言
- 组成简单,数据量小 便于传输
- 有客户端主导 服务器不需要保存会话信息 减轻了服务器的压力
- 可以防护csrf攻击
缺点:
- payload部分仅仅是进行简单编码,很容易会被解码,所以只能用于存储逻辑必需的非敏感信息
- 需要保护好加密密钥
- 为了避免token被劫持 最好使用https协议
- 由于 由客户端主导 服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。 一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。