Spring Cloud / Alibaba 微服务架构 | 2021年11月更文挑战(27)

112 阅读2分钟

这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战。 (原12)

上篇文章中说到,我们的项目授权、鉴权中心微服务功能将用JWT来实现,那么本篇就来介绍一下JWT。

什么是JWT

1、JWT的基本概念

JSON Web Token(JWT)是一个开放标准,它定义了一种紧凑的、自包含的方式,用于作为JSON对象中各方之间安全地传输信息。

JWT的原理就是服务器认证以后会生成一个JSON对象发回给用户,以后用户与服务端通信的时候都需要将这个JSON对象返回来。为了防止用户篡改数据,服务器在生成JSON对象的时候会加上签名,即加密。服务器不保存任何Session数据,从而比较容易实现拓展。

2、JWT的适用场景

1)登录持久化

即上面的方案二介绍。

2)用户授权

当我们使用JWT实现用户登录持久化时,JWT中一定会包含有用户信息、用户对应权限,所以我们也可以用JWT实现用户授权。

3)信息交换

JWT就是保存了加密信息,最好不要保存大量的数据信息,但系统间少量的信息交换我们同样可以用JWT来实现。

3、JWT的结构(组成部分)

JWT由三个部分组成:Header(头部)、Payload(负载,即我们想要传递的JSON数据)、 Signature(签名),且用圆点连接:Header.Payload.Signature。

1)Header

由两部分(Token类型、加密算法名称)组成,并使用Base64编码,是一个JSON对象,通过Base64编码转化成字符串。我们的项目签名算法使用的是HS256。

2)Payload

KV形式的数据,即你想传递的数据,也是一个JSON对象,经过Base64编码后使用,如果是授权则是Token信息。

3)Signature

是对前两个部分的签名,防止数据被篡改。 为了得到签名部分,你必须有编码过的Header、编码过的Payload、一个密钥,签名算法是Header中指定的那个,对它们签名即可。

首先我们需要一个只有服务器知道的密钥,然后使用Header里指定的签名算法通过以下公式来生成签名:

HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret)

4、使用方法

将Header、Payload、Signature三个部分用圆点拼接成字符串就可以返回给用户了。客户端收到JWT时,可以存储在cookie或本地内存中,之后客户端每次和服务端通信都需要带上这个JWT字符串,服务器反向解析,拿到Payload中保存的用户信息,完成会话与鉴权。