深入了解JWT以及JWT的执行机制
1.JWT以什么样的形式存在?
1 | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ |
2.JWT的构成?
第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature).
3.JWT的头部header
jwt的头部承载两部分信息:
- 声明类型,这里是jwt
- 声明加密的算法 通常直接使用 HMAC SHA256
如下列例子:然后将头部进行base64加密(该加密是可以对称解密的),构成了第一部分.
1 2 3 4 | { 'typ' : 'JWT' , 'alg' : 'HS256' } |
4.base64编解码
echo 'abc' | base64 编码
echo 'sdfsd==' | base64 -D 解码
5.载荷(payload)就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分,将其进行base64位编码,然后形成第二部分。
- 标准中注册的声明
- 公共的声明
- 私有的声明
1 2 3 4 5 | { "sub" : "1234567890" , "name" : "John Doe" , "admin" : true } |
6.签证(signature)由三部分组成,经过base64位编码后的(header,payload,secret加密方式)
这个部分需要base64加密后的header和base64加密后的payload使用.
连接组成的字符串,然后通过header中声明的加密方式进行加盐secret
组合加密,然后就构成了jwt的第三部分。
1 2 3 4 | / / javascript var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload); var signature = HMACSHA256(encodedString, 'secret' ); / / TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ |
注意:secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。
7.应用JWT
一般是在请求头里加入Authorization
,并加上Bearer
1 2 3 4 5 | fetch( 'api/user/1' , { headers: { 'Authorization' : 'Bearer ' + token } }) |
8.JWT验证流程
(1)浏览器端(客户端)post/user/login + username and password 浏览器在登录表单中输入用户名密码进行登录操作。
(2)服务器接收到了用户名密码后,利用secret加密方式生成一个JWT,
(3)将该JWT返回给浏览器browser
(4)浏览器接收到JWT之后,将JWT放在自己的请求头中,想服务器端请求数据
(5)服务器端检查JWT的签证,获取到JWT中的payload中的声明信息
(6)然后将请求的数据响应给浏览器
9.JWT的优点
- 因为json的通用性,所以JWT是可以进行跨语言支持的,像JAVA,JavaScript,NodeJS,PHP等很多语言都可以使用。
- 因为有了payload部分,所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息。
- 便于传输,jwt的构成非常简单,字节占用很小,所以它是非常便于传输的。
- 它不需要在服务端保存会话信息, 所以它易于应用的扩展
10.JWT的注意事项
- 不应该在jwt的payload部分存放敏感信息,因为该部分是客户端可解密的部分。
- 保护好secret私钥,该私钥非常重要。
- 如果可以,请使用https协议
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用