欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

JWT身份验证实战过程与应用实例:以会话与token两种方法为例

最编程 2024-07-28 12:42:02
...

4.1 jwt概念

jwt是 JSON Web Token (JWT)是简写,主要用来进行加密授权、以json串的形式在不同各方进行信息交换传输。

用途:

Authorization (授权) :在web应用中,一旦用户登录,后续每个请求都将包含JWT,才能访问相应的服务和资源。

Information Exchange (信息交换) :因为JWT可以被签名,例如,用公钥/私钥对,你可以确定发送人就是它们所说的那个人。可以很安全的在各方之间传输信息。

4.2 jwt的优点

可以通过URL,POST参 数或者在HTTP header发送,因为数据量小,传输速度也很快,因为包含用户信息,避免频繁调取数据库。

因为Token是 以JSON加密的形式保存在客户端的,所以JWT是跨语言的,原则上任何web形式都支持

不需要在服务端保存会话信息,特别适用于分布式微服务。

4.3 jwt的结构

jwt 包含3部分:  头部header,有效信息payload,签名signature。格式形式: xxxx.yyy.zzz

1.header :通常标头有两部分组成:令牌类型(jwt)和所使用的的签名算法。如HMAC,SHA256,HS256,RSA。然后将这两部分信息通过BASE64编码组成jwt结构的第一部分。
其实这里的base64严格说它只是一种编码,可以进行解码还原信息原来的样子,并不是一种加密过程。
{"alg":"HS256", 
"typ":"jwt"
}
2.payload:
这一部分是有效负载,存储一些有关用户身份的有用的信息和其它数据的声明。同样的这部分也会使用Base64编码进行加密组成jwt的第二部分。
{
"sub":"HS256",
"name":"wang",
"admin":"true"
}

3.signature:jwt的前面两部分都是使用Base64进行编码的,前端用户可以进行解码看到的。signature需要使用Base64编码后的header和payload以及一个secret(私钥),其中这3部分内容共同使用header中指定的签名算法HS256进行签名。

signature的目的:主要是对header和payload内容进行签名,如果有人对header和payload进行base64解码后进行篡改,再进行编码,服务端自动再加上之前的秘钥(用户不知道),这样得出的新的jwt和原先的jwt是不同的内容串,则新的jwt的token无效。如下面例子:
假设:header经过base64为a,payload经过base64为b,secret为“cxf”这样的串,进过HS256(a.b,c)=cc
有恶心的用户将payload的用户的usename信息进行修改后,payload经过base64为d,其他header,secret不变,这样HS256(a,d,c)=hh  显然cc和hh是不同的,说明jwt的token无效,被篡改过。

signature很重要,主要保证判断保证jwt是否有没有被篡改过。进行验证jwt的合法性。
如 HS256(base64Ur1Encode(header) + "." + base64Ur1Encode(payload) , secret);

形成的json串形式:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc

jwt用户信息的认证和授权,用于web系统的单点登录等应用场景。

推荐阅读