这是我参与「第五届青训营」伴学笔记创作活动的第11天
笔记由来
权限token是识别用户的重要信息,在项目中需要多处携带通行。鉴于我之前在其他项目中实现过相类似的功能,所以团队决定让我负责实现项目的登录模块。我对token这部分的知识有着一定的掌握,以此篇来介绍并巩固一下token的具体实现之一,Json Web Token,即JWT的相关知识。
一、使用JWT进行跨域身份验证
1、传统用户身份验证
互联网服务不能与用户身份验证分开。一般流程如下:
-
用户向服务器发送用户名和密码。
-
服务器认证后,用户角色、登录时间等相关数据将保存在当前会话中。
-
session_id服务器返回给用户,会话信息将写入用户的cookie。
-
用户的每个后续请求都将通过取出cookie中的session_id传输到服务器。
-
服务器接收session_id并比较之前保存的数据以确认用户的身份。
此模式的最大问题是没有不支持横向扩展的分布式体系结构。
2、解决方案
-
会话广播
-
将透明令牌存入 cookie 并将用户的身份信息存入 redis
另一个灵活的解决方案:
使用自包含令牌,数据由客户端保存,而不保存服务器。jwt是此解决方案的代表。
二、JWT令牌
1、访问令牌的类型
- 不透明令牌是不可读的令牌,通常是纯 UUID 字符串。使用不透明令牌时,资源服务不知道令牌是什么以及它代表谁,需要调用认证服务器来验证和获取用户信息。不透明令牌与集中式架构一起使用。
- 透明令牌一般是指我们常说的JWT令牌,用户信息保存在JWT字符串中,资源服务器本身可以解析令牌,不再需要去认证服务器验证令牌。使用 JWT 是一种无状态的去中心化架构。
2、JWT的组成
对象是一个非常长的字符串,带有 “.”分隔符分为三个子字符串。
每个子字符串代表一个功能块,共有三个部分:JWT 标头、有效负载和签名
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协议。