本文主要是介绍JWT从入门到上天系列第二章:JWT的结构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
😉😉 欢迎加入我们的学习交流群呀!
✅✅1:这是孙哥suns给大家的福利!
✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring、Security、Docker、Grpc、消息中间件、Rpc、SpringCloud等等很多应用和源码级别高质量视频和笔记资料,你想学的我们这里都有!
🥭🥭3:QQ群:583783824 📚📚 工作VX:BigTreeJava 拉你进VX群,免费领取!
💞💞4:以上内容,进群免费领取呦~ 💞💞💞💞
上篇,我们介绍了什么是JWT,他就是基于客户端保存,客户端请求的时候携带这个令牌,我们后端记性验证即可。这个避免了我们的Session占用、他还是间接的因为数据量很小,他还是自包含的,因为用查询数据库。
一:JWT结构
1:令牌组成
tocken他本质上就是一个字符串,他的本质上就是由x.y.z组成的token。
标头.有效荷载.签名 xxxxx.yyyyy.zzzzz 中间使用点去分隔。
分割的三块是{}.{}.{}这三个JSON对象基于Base加密之后的字符拼接内容
也就是{}.{}.{}---经过Base64编码---xxxxx.yyyyy.zzzzz
2:标头信息
typ:表示令牌使用JWT这种形式
alg:表示的加密算法,常用加密算法:SHA256、RSA
{}:这个JSON会给予Base64编码成为上边的xxxx
{"typ":"JWT","alg":"HS256"
}
3:有效荷载
令牌的第二部分是有效负载,其中包含声明。声明是有关实体(通常是用户)和其他数据的声明。
同样的,它会使用 Base64 编码组成,服务端可以给予Base64解码,所以不是Base64不算是加密。
有效荷载里边建议不要放特别敏感的信息,例如仅仅放一个用户名就行了,千万不要放密码。
{"sub":"1111111","name":"123456"
}
4:签名
前面两部分都是使用 Base64 进行编码的,即前端可以通过Base64解码解开知道里面的信息。
Signature 需要使用编码后的 header 和 payload以及我们提供的一个密钥(盐值,这个月也叫签名),然后使用 header 中指定的签名算法(HS256)进行签名。
签名的作用是保证 JWT 没有被篡改过
这个Tocken传到后台的时候,会先有一个验签的过程,也就是上边内容再算一遍(签名从服务器中去取)。 看最终的结果是不是和第三区域的内容一致,一致则是正确的签名。如果Token改了,验签一定过不了。
二:签名目的
1:签名目的
最后一步签名的过程,实际上是对头部以及负载内容进行签名,防止内容被窜改。如果有人对头部以及负载的内容解码之后进行修改,再进行编码,最后加上之前的签名组合形成新的JWT的话,那么服务器端会判断出新的头部和负载形成的签名和JWT附带上的签名是不一样的。如果要对新的头部和负载进行签名,在不知道服务加密时用的密钥的话,得出来的签名也是不一样的。
2:信息安全问题
在这里大家一定会问一个问题:Base64是一种编码,是可逆的,那么我的信息不就被暴露了吗?
是的。所以,在JT中,不应该在负载里面加入任何敏感的数据。
在上面的例子中,我们传输的是用户的UserID。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。因此JWT适合用于向Web应用传递一些非敏感信息。JWT还经常用于设计用户认证和授权系统,甚至实现Web应用的单点登录。
容易输出:
是三个由点分隔的Base64-URL字符串,可以在HTML和HTTP环境中轻松传递这些字符串,与基于XML的标准(例如SAML)相比,它更紧凑。
简洁(Compact):
可以通过URL,POST 参数或者在 HTTP header 发送,因为数据量小,传输速度快
自包含(Self-contained):
负载中包含了所有用户所需要的信息,避免了多次查询数据库
这篇关于JWT从入门到上天系列第二章:JWT的结构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!