zenzens 发表于 2023-3-26 19:42

jwt的组成与作用



大家好!初来乍到,请多关照!新人一枚,被52论坛大佬群集,对技术狠狠追求di氛围所打动!:lol


目前在学习java,技术还比较菜,希望能来这里向大佬们虚心学习,扎实技术,在计算机的道路上披荆斩棘!


以下是我从各地收集到的资料,与大家分享,如若有误,欢迎指出!

https://static.52pojie.cn/static/image/hrline/5.gifhttps://static.52pojie.cn/static/image/hrline/5.gifhttps://static.52pojie.cn/static/image/hrline/5.gif




什么是JWT?


JWT是 JSON Web Token 的缩写,是一种用于在网络应用之间安全传输信息的开放标准(RFC 7519)。


JWT是由什么组成的?


它由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。


粗略地说:


头部包含了两个部分:令牌的类型(即JWT)和所使用的加密算法(如HMAC SHA256或RSA)。这部分通常被编码成Base64Url字符串。


载荷包含了要传输的信息,通常包括用户身份、权限和其他元数据。这部分同样被编码成Base64Url字符串。


签名是由头部、载荷以及一个密钥生成的哈希值,用于验证令牌的完整性和真实性。签名算法通常使用HMAC或RSA。


详细的说:


Header(头部)


头部通常包含两部分:令牌的类型(即 "JWT")和签名算法(如 HMAC SHA256 或 RSA)。这些信息使用 JSON 对象表示,然后使用 Base64Url 编码,形成 JWT 的第一部分。例如:


{
    "alg": "HS256",
    "typ": "JWT"
}
Payload(有效载荷)


有效载荷包含所谓的“声明”,这些声明是关于实体(通常是用户)和其他附加元数据的一些信息。声明可以分为三种类型:注册声明、公共声明和私有声明。有效载荷也是一个 JSON 对象,然后使用 Base64Url 编码,形成 JWT 的第二部分。例如:


{
    "sub": "1234567890",
    "name": "John Doe",
    "iat": 1516239022
}
Signature(签名)


签名用于验证 JWT 发送者的身份以及确保 JWT 在传输过程中没有被篡改。要生成签名,需要使用在头部指定的算法对 Base64Url 编码后的头部和有效载荷进行签名。签名过程还需要一个密钥,该密钥仅在签名和验证令牌时才需要。签名形成 JWT 的第三部分。


JWT的作用是什么?


JWT的作用是在不同的应用之间传递信息,以便进行身份验证和授权。它可以用于单点登录、OAuth授权、API访问控制等场景。由于JWT是基于标准的JSON格式,因此可以轻松地在不同的编程语言和平台之间进行交换和解析。同时,由于JWT包含了签名信息,因此可以大大提高数据传输的安全性。


身份验证


JWT 可以用于在客户端和服务端之间进行身份验证。用户在登录时,系统会生成一个包含用户信息的 JWT,并将其发送给客户端。客户端在后续请求中携带 JWT,服务端可以通过验证 JWT 来识别用户身份。


授权


JWT 可以包含用户的权限信息,如角色、访问资源等。服务端可以通过解析 JWT 中的声明来确定用户是否有访问特定资源的权限。


无状态(和http协议一样的)


由于 JWT 本身包含了用户的相关信息,因此服务端不需要存储会话信息。这使得应用程序更具可伸缩性,降低了服务器的存储负担。


简化跨域认证


JWT 可以跨多个域名使用。这意味着您可以在多个应用程序和服务中轻松共享身份验证和授权信息,而无需单独处理跨域问题。

JWT的安全性怎么保证?


JWT的安全性主要依赖于其签名机制和密钥管理。JWT使用签名来保护令牌的完整性和真实性,确保令牌未被篡改或伪造。签名由令牌的头部和载荷组成,再加上一个密钥,使用加密算法生成。只有拥有相应的密钥才能验证签名,从而确保令牌的安全性。


为了保证密钥的安全性,应该采取以下措施:


1.使用强密码来保护密钥。


2.不要使用默认密钥或者硬编码密钥,而是使用随机生成的密钥。


3.定期更换密钥,以防止密钥泄露或被破解。


4.将密钥存储在安全的地方,例如硬件安全模块或密钥管理服务中,确保只有授权的人员能够访问。


因为JWT 的有效载荷(Payload)并不是加密的,所以敏感信息不建议保存在JWT中,还可以采用其他措施来增强JWT的安全性,例如使用HTTPS加密传输、限制令牌的有效期和使用访问令牌而不是刷新令牌等。


以下是限制令牌的有效期的例子:
通过在载荷中添加“exp”(expiration time)字段。
该字段表示JWT的过期时间,以UNIX时间戳形式表示(即距离1970年1月1日00:00:00 UTC的秒数)。当JWT超过指定的有效期时,就会被认为是过期的,从而拒绝访问。示例:{"sub": "1234567890","name": "John Doe","iat": 1516239022,"exp": 1516239122}在上面的示例中,“exp”字段的值为“1516239122”,表示JWT的有效期到1970年1月1日00:00:00 UTC后的1516239122秒。如果当前时间超过了该时间戳,则JWT将被认为是过期的。为了增强JWT的安全性,建议将JWT的有效期设置为较短的时间,并定期更新JWT。同时,可以使用访问令牌和刷新令牌的组合,以便在访问令牌过期时使用刷新令牌重新获取新的访问令牌,从而维持用户的登录状态。


总之,JWT的安全性需要综合考虑各种因素,从而确保令牌在传输和存储过程中的安全性。






这就是我学习到的JWT的相关知识,欢迎大家指出我的错误,以及提出学习java的建议!

wushui 发表于 2023-3-27 09:38

学习了学习了
页: [1]
查看完整版本: jwt的组成与作用