开发实践|JWT从原理到实践

📫 作者简介:「六月暴雪飞梨花」,专注于研究Java,就职于科技型公司后端工程师
🏆 近期荣誉:华为云云享专家、阿里云专家博主、腾讯云优秀创作者、腾讯云TDP-KOL、ACDU成员、墨天轮技术专家博主
🔥 三连支持:欢迎 ❤️关注、👍点赞、👉收藏三连,支持一下博主~

什么是Token

在网页开发时,Token是服务端生成的一串字符串,用来作客户端进行请求的一个令牌,当用户第一次成功登录后,服务器便按照一定的规则生成一个Token并将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,为了每次请求的数据的安全和有效,无需再次带上用户名和密码。
在这里插入图片描述

JSON Web Token介绍

JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。JWT可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对进行签名。

JWT使用场景

JWT主要使用场景有授权数据交换

1. 授权
这是使用JWT最常见的场景。一旦用户登录,每个后续请求都将包含JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是当今广泛使用JWT的一项功能,因为它开销小,并且能够轻松地跨不同域使用。

2. 数据交换
JSON网络令牌是各方之间安全传输信息的好方法。因为JWT可以签名——例如,使用公钥/私钥对——你可以确定发送者是他们所说的那个人。此外,由于签名是使用标头和有效负载计算的,你还可以验证内容没有被篡改。

JWT使用优势

Token作为一种身份验证和授权机制,在现代网络应用中扮演着至关重要的角色。
在这里插入图片描述

  1. 无状态性
    Token机制使得服务器不需要在内存中保存用户的登录状态,从而大大减轻了服务器的负担。在每次请求时,客户端只需携带Token,服务器通过解析Token来验证用户的身份和权限,而无需在服务器端保持会话状态。这种无状态性不仅使得服务器变得更加简单和高效,还更容易实现分布式和横向扩展。
  2. 安全性
    Token可以使用加密算法进行签名,确保在传输过程中不被篡改。同时,Token可以设置过期时间,增加安全性。此外,使用HTTPS协议进行传输也可以进一步保障Token的安全性。相比于传统的用户名和密码认证方式,Token更加安全,因为即使Token被窃取,攻击者也无法直接获取用户的密码。
  3. 跨域支持
    Token可以在跨域环境下进行传输,使得在不同域名的应用之间进行身份验证和授权变得更加灵活。这一特性对于需要集成多个应用的系统来说尤为重要,可以极大程度地提高系统的灵活性和可扩展性。
  4. 单点登录
    通过Token可以实现用户在多个系统中的单点登录,提高用户体验。用户只需在首次登录时输入用户名和密码,之后在各个系统间的切换就无需再次输入登录信息,从而简化了用户的操作流程。
  5. 可扩展性
    Token可以包含任意的信息,例如用户的身份信息、权限、角色等。这使得身份验证和授权机制更加灵活,可以根据实际需求进行定制。此外,Token还支持多种验证协议,并允许添加自定义身份验证协议,从而进一步扩展了身份验证服务的应用场景。
  6. 减轻服务器负担
    在传统的用户名和密码认证方式中,服务器需要处理大量的登录请求,并对每个请求进行身份验证检查。而使用Token验证方式,服务器只需在首次登录时验证用户的身份,之后只需验证Token的有效性即可。这大大减轻了服务器的负担,减少了服务器的工作量,并可以更快地响应用户的请求。
  7. 个性化设置
    Token采用的是模块化身份验证方式,使得用户可以自定义登录页面,便于用户进行个性设置。这种灵活性可以满足不同用户的个性化需求,提升用户体验。

JWT组成部分

JWT由三部分组成:Header(头部)Payload(负载)Signature(签名)。这三部分通过点(.)分隔,形成一个长字符串。一般情况下,一个完整的JWT类似这种:xxxxx.yyyyy.zzzzz。

Header

标头通常由两部分组成:令牌的类型,即JWT,以及正在使用的签名算法,如HMAC SHA256或RSA。这个Header会使用Base64Url编码,形成JWT密文的第一部分。

{
  "alg": "HS256",
  "typ": "JWT"
}

Payload

Payload部分是JWT的主体内容,包含了用户信息和其他一些额外的数据。这些数据以JSON格式表示,并且可以被自定义。Payload也会被Base64Url编码,形成JWT密文的第二部分。
Payload中通常会包含一些标准字段,如iss(签发者)、sub(主题)、aud(受众)、nbf(生效时间)等。
此外,还可以添加一些自定义字段来满足特定需求。

{
  "sub": "1234567890",
  "name": "Aion",
  "iat": 1733670113
}

Signature

Signature部分是对Header和Payload的签名,用于验证JWT的真实性和完整性。签名的生成过程涉及到使用指定的签名算法和密钥对Header和Payload进行加密。这个签名会被添加到JWT的最后一部分,以确保JWT在传输过程中不会被篡改。

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
U2VjcmV0S2V5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5TmFjb3M=

) ☑️ secret base64 encoded

最终产生编码

通过上述的步骤,可以产生一个编码,而这个编码就是我们所需要的JWT。如果你需要测试,可以将自己的请求信息在这个在线网站测试:https://jwt.io/

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFpb24iLCJpYXQiOjE3MzM2NzAxMTN9.o-I1-HQg5X9-fW5vRAWnFQEKCuIsQnOerxNpforGyoU\

总结

JWT作为一种基于令牌的身份验证机制,具有简洁、安全和易用的特点。通过深入了解JWT的原理、组成部分以及实际应用,如果结合源码分析,可能会更好的增加使用,提升使用效率,我们可以更好地掌握JWT的实现过程并灵活应用于实际项目中。在实际应用中,我们需要注意保护密钥的安全性和选择合适的签名算法来确保JWT的安全性。同时,我们还可以根据实际需求自定义Payload中的字段来满足特定的业务需求。


[引用]
1.JWT:https://jwt.io/


欢迎关注博主 「六月暴雪飞梨花」 或加入【六月暴雪飞梨花社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

六月暴雪飞梨花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值