抖音项目——JWT令牌| 青训营笔记

213 阅读3分钟

这是我参与「第五届青训营」伴学笔记创作活动的第11天

笔记由来

权限token是识别用户的重要信息,在项目中需要多处携带通行。鉴于我之前在其他项目中实现过相类似的功能,所以团队决定让我负责实现项目的登录模块。我对token这部分的知识有着一定的掌握,以此篇来介绍并巩固一下token的具体实现之一,Json Web Token,即JWT的相关知识。

一、使用JWT进行跨域身份验证

1、传统用户身份验证

互联网服务不能与用户身份验证分开。一般流程如下:

  1. 用户向服务器发送用户名和密码。

  2. 服务器认证后,用户角色、登录时间等相关数据将保存在当前会话中。

  3. session_id服务器返回给用户,会话信息将写入用户的cookie。

  4. 用户的每个后续请求都将通过取出cookie中的session_id传输到服务器。

  5. 服务器接收session_id并比较之前保存的数据以确认用户的身份。

此模式的最大问题是没有不支持横向扩展的分布式体系结构。

2、解决方案

  1. 会话广播

  2. 将透明令牌存入 cookie 并将用户的身份信息存入 redis

另一个灵活的解决方案:

使用自包含令牌,数据由客户端保存,而不保存服务器。jwt是此解决方案的代表。

二、JWT令牌

1、访问令牌的类型

  • 不透明令牌是不可读的令牌,通常是纯 UUID 字符串。使用不透明令牌时,资源服务不知道令牌是什么以及它代表谁,需要调用认证服务器来验证和获取用户信息。不透明令牌与集中式架构一起使用。
  • 透明令牌一般是指我们常说的JWT令牌,用户信息保存在JWT字符串中,资源服务器本身可以解析令牌,不再需要去认证服务器验证令牌。使用 JWT 是一种无状态的去中心化架构

2、JWT的组成

对象是一个非常长的字符串,带有 “.”分隔符分为三个子字符串。

每个子字符串代表一个功能块,共有三个部分:JWT 标头、有效负载和签名

QQ图片20230202131238.png

jwt头

JWT头部分是一个描述JWT元数据的JSON对象,通常如下所示。

{
 "alg": "HS256",
 "typ": "JWT"
 }

在上面的代码中,alg 属性表示签名使用的算法,默认为 HMAC SHA256(写为 HS256);typ 属性表示顺序

卡的类型,JWT令牌统一写为JWT。最后,将上述 JSON 对象转换为字符串,以便使用 Base64 URL 算法进行保存。

有效负载

有效负载部分是 JWT 的主要内容部分,也是一个 JSON 对象,其中包含需要传递的数据。JWT 指定了七个默认值

供选择的字段。

1 iss:发行人

2 exp:到期时间

3 sub: 主题

4 aud:用户

5 NBF:在此之前不可用

6 IAT:发布时间

7 jti:JWT ID 用于标识 JWT

总结

  • 存储在客户端,不占用服务器的内存资源
  • JWT 默认不加密,但可以加密。生成原始令牌后,可以再次对其进行加密。
  • 为了减少盗用和盗窃,JWT不建议使用HTTP协议来传输代码,而是使用加密的HTTPS协议。