文章目录
https://doc.hutool.cn/pages/jwt/#jwt%E4%BB%8B%E7%BB%8D
JWT是一种用于双方之间安全传输信息的简洁的、URL安全的令牌标准。这个标准由互联网工程任务组(IETF)发表,定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。
JWT 通常用于在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以用于验证信息的完整性。
JWT由头部(Header)、载荷(Payload)和签名(Signature)三个部分组成,这些信息都被编码在JWT中,形成一个紧凑的字符串。
头部:描述了JWT的签名算法和其它元数据,如使用的哈希算法等。
载荷:包含了发行方信息、用户信息、过期时间等声明。这些声明可以是标准的,也可以是自定义的。
签名:是对头部和载荷进行数字签名的结果,用于验证JWT的完整性和真实性。签名通常使用头部中指定的签名算法和服务器端的密钥生成。
JWT(JSON Web Token)的自包含性指的是,JWT本身包含了所有验证和识别用户身份所需的信息,而不需要额外查询数据库或调用其他服务。
JWT通常存储在客户端,而服务端不直接存储JWT本身。
-
JWT的生成与发送:
• 当用户成功登录后,服务端会验证用户的身份信息。
• 如果验证通过,服务端会生成一个JWT,这个JWT包含了用户的身份信息、过期时间等信息,并且经过数字签名以确保其完整性。
• 然后,服务端将这个JWT发送给客户端,通常是通过HTTP响应头中的Authorization字段,格式为Bearer 。
-
客户端存储JWT:
• 客户端收到JWT后,通常会将其存储在本地,以便在后续的请求中使用。
• 存储方式可以是浏览器的localStorage、sessionStorage,或者是在移动应用中存储在设备的存储系统中。
• 客户端在发送请求时,会从存储中取出JWT,并将其包含在请求头中发送给服务端。
-
服务端验证JWT:
• 服务端在收到请求后,会从请求头中提取出JWT。
• 然后,服务端会使用自己的私钥(如果是用RSA算法)或者相同的密钥(如果是用HMAC算法)来验证JWT的数字签名。
• 如果签名验证通过,并且JWT没有过期,服务端就会认为这个请求是合法的,并根据JWT中的声明来执行相应的操作。
-
服务端不存储JWT:
• 与传统的Session认证方式不同,服务端在JWT认证中不需要存储用户的会话信息。
• 因为JWT本身已经包含了足够的用户信息和验证信息,服务端只需要验证JWT的有效性即可。
• 这使得服务端可以更加轻量级和可扩展,因为不需要维护大量的会话状态信息。
需要注意的是,虽然服务端不直接存储JWT,但服务端可能需要存储一些与JWT相关的其他信息,比如用于签发和验证JWT的密钥、JWT的过期策略等。此外,为了安全性考虑,服务端还应该采取适当的措施来保护这些敏感信息不被泄露。
在Java中,存在多种JWT的实现库,如jjwt(Java JWT)、nimbusds-jwt等。
这些不同的JWT实现库在功能上可能相似,但在内部实现、性能、安全性等方面可能存在差异。例如,一些库可能提供了更强大的加密算法、更灵活的签名和验证机制,或者更好的异常处理和错误报告等。因此,在选择JWT实现库时,需要根据具体的应用场景和安全需求进行评估和选择。
同时,即使使用了相同的JWT实现库,不同的开发者在实现JWT的生成、解析和验证过程中也可能采用不同的方法和参数,从而影响JWT的安全性。例如,选择较弱的加密算法、不严格的签名验证规则、不安全的密钥管理等都可能导致JWT的安全性降低。