对登录态token的一些理解 | 青训营笔记

179 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记。

我在本次青训营中参与的组队大项目是极简版抖音的服务端实现。

本篇笔记将重点讨论我对登录态校验中token机制的一些思考与理解。

通常来说,用户在登录后,可以正常访问我们的应用,使用其中的业务功能,但是这个期限是多久呢?用什么来表示用户已登录呢?这个保持用户登录态的机制,在app/Web应用开发中其实有个专业名词,叫做会话管理。用户在一次完整的”会话“期间可以不需要再次触发登录校验机制,也就是为原来无状态的HTTP协议做了有状态的扩充。常见的会话管理实现方式有:cookie、session、token。其中cookie适用于前端是Web的场景,因为cookie可以直接存储在浏览器中,其本质是一种在client端保持状态的场景,即由浏览器根据cookie作用范围决定该何时发送给服务器、根据过期时间决定将cookie信息存储在何处;session是一种由服务端实现的方案,服务端负责生成sessionid(简称sid)、存储sid和session之间的映射;token则是一种根据用户信息、时间、签名构造的字符串。

token的具体使用方式如下:

  1. 正常验证(本系统使用用户名/密码)
  2. 服务端签发token给客户端
  3. 客户端存储token,在下次请求中带上token
  4. 服务端校验token是否合法,并从token中提取用户身份标识,继续后续流程

JWT的全称是JSON Web Token,它由三部分构成:Header、Payload、Signature。其中Header中可以指定加密算法,Payload中可以根据现有的Registered claims构造JSON,Signature即使用base64编码后的Header、Payload借助自己定义的secret使用Header中指定的加密算法类型进行签名。

此处的secret,为了安全起见,一般都需要混入一些随机信息,来防止恶意攻击者伪造token通过验证。为了方便起见,可以考虑直接使用generate库来生成固定长度的随机字符串,将其作为secret。