token

57次阅读

共计 1946 个字符,预计需要花费 5 分钟才能阅读完成。

1. token 的典型流程:

  • 用户登录的时候,服务端生成一个 token(通过登录信息做数字签名,加密之后得到的字符串)返回给客户端
  • 客户端后续的请求都带上这个 token
  • 服务端解析 token(做解密和签名认证,判断其有效性)获取用户信息,并响应用户的请求。
  • token 会有过期时间,客户端登出的时候也会废弃 token,但是服务端不需要任何操作

2. session 和 token 的区别:

  • session,要求服务端存储信息,并根据 id 能够检索,而 token 不需要。
  • 服务端 要 通过 token 来解析 用户身份,也需要定义好相应的协议。
  • session 一般使用 cookie 来交互。token,可以是 cookie,也可以是 其他 heaser,甚至可以放在请求的内容中。不使用 cookie 可以带来跨域的便利性
  • 很多情况下,sessin 和 token 可以一起使用。
  • token 技术 对应的标准,就是 JWT

3.JWT(JSON Web Tokens)

  • 组成:

    • Header(头部)(是一个 JSON 对象)

      {
        "alg": "HS256", // 表示签名的算法,默认是 HMAC     SHA256(写成 HS256)"typ": "JWT"  // 表示 Token 的类型,JWT 令牌统一写为 JWT
      }
    • Payload(负载)(也是一个 JSON 对象 – 用来存放实际需要传递的数据)
    {
      // 7 个官方字段
      "iss": "a.com", // issuer:签发人
      "exp": "1d", // expiration time:(必须设置)"sub": "test", // subject: 主题
      "aud": "xxx", // audience:受众
      "nbf": "xxx", // Not Before:生效时间
      "iat": "xxx", // Issued At:签发时间
      "jti": "1111", // JWT ID:编号
      // 可以定义私有字段
      "name": "John Doe",
      "admin": true
    }
    • Signature(签名)

      • 对前两部分的签名,防止数据被篡改。
      • 需要指定一个密钥(secret)。
      • 采用的公式:

        • header 中的签名算法(base64UrlEncode(header) + ‘.’ + base64UrlEncode(payload), secret)
  • JWT = Base64(Header) + “.” + Base64(Payload) + “.” + $Signature
  • 特点:

    • JWT 默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。
    • 发送 JWT,要使用 https,不实用 HTTPS 的时候,JWT 里面不要写入秘密数据。
    • 在使用过程中无法废除 某个 token,或者更改 token 的权限,也就是一旦签发就会始终有效。
  • 使用方法:

    • 客户端,得到 token 后,可以存储在 cookie 里,或者 localstorage 中
    • 以后的 http 请求都要带着 这个 token
    • 发送的时候:可以放在 cookie 中,也可以放在 HTTP 请求头 信息 Authorization 字段中,还可以在 post 请求的时候放在请求数据体里。
  • 分类:

    • access token:

      • 有效期短
      • 以上的都是针对 该种 token
    • refresh token:

      • 有效期长。
      • 自身以及过期时间是 存储在服务器的数据库中的。
      • 只有在申请新的 access token 的以后才会验证,不会对业务接口响应时间造成影响,也不会一直保存在内存中以应对大量的请求。
  • 流程:

    • client -> server: username && password
    • server: 得到 token
    • server -> client: access token、refresh token
    • client:将 token 保存在本地
    • client -> server: access token
    • server: access token 没有过期
    • server -> client: 返回数据
    • client -> server: access token
    • server: access token 过期
    • server -> client: 返回错误
    • client -> server: refresh token
    • server: 判断 refresh token 是否过期
    • server -> client: 没过期,则返回新 的 access token 和 refresh token。如果过期了,需要重新登陆

4. token 和 session 的区别:

  • session: 为无状态的 HTTP 提供持久机制。如果需要实现有状态的会话,可以增加 Session 来在服务端保存一些状态。
  • token: 就是一个令牌。作为身份认证安全性更好。

5. 参考:

- https://juejin.im/post/5d01f82cf265da1b67210869#heading-11
- http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html

正文完
 0