共计 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
正文完