登录验证方式:session,jwt| 青训营笔记

52 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第3天

传统的session验证

image-20220720200012587.png 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:用户的idname
    • 默认情况下会携带令牌签发时间iat
  • 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 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。