在使用 JWT(JSON Web Token)进行身份验证时,JWT 令牌通常由服务器生成并发送给客户端(通常是浏览器或移动应用)。客户端会将这个令牌存储在本地(例如,存储在 Cookie、LocalStorage 或 SessionStorage 中)。当用户登出并清除浏览器的 Cookie 时,客户端本地的 JWT 令牌会被删除,但这并不会影响服务器上的 JWT 令牌的状态,实际上服务器上不会存储令牌,jjwt只是生成令牌返给浏览器,浏览器传递过来的话,会按照秘钥解析认证而已
- JWT 令牌的生命周期
客户端存储:JWT 令牌通常存储在客户端的 Cookie、LocalStorage 或 SessionStorage 中。
服务器验证:当客户端发送请求时,会将 JWT 令牌放在请求头的 Authorization 字段中,服务器会验证这个令牌的有效性。 - 登出操作
客户端清除:当用户登出时,客户端会清除本地存储的 JWT 令牌(例如,清除 Cookie 或 LocalStorage 中的令牌)。
服务器无感知:服务器不会主动跟踪每个客户端的 JWT 令牌状态,除非你实现了某种机制(例如,黑名单或撤销列表)来管理已登出的令牌。 - Postman 测试
继续有效:如果用户登出并清除浏览器的 Cookie,但使用 Postman 重新发送带有相同 JWT 令牌的请求,服务器仍然会验证这个令牌的有效性。只要令牌没有过期且签名有效,服务器会认为这是一个有效的请求。
安全性:这可能会带来安全风险,因为即使用户已经登出,如果有人获取了 JWT 令牌,仍然可以使用这个令牌进行身份验证。 - 解决方案
为了提高安全性,可以采取以下措施:
令牌过期:设置较短的 exp(过期时间)字段,使令牌在一段时间后自动过期。
黑名单:在服务器端维护一个黑名单,记录已登出的 JWT 令牌。当客户端发送请求时,服务器会检查令牌是否在黑名单中,如果是,则拒绝请求。
刷新令牌:使用刷新令牌机制。客户端在获取访问令牌的同时,还会获得一个刷新令牌。访问令牌过期后,客户端可以使用刷新令牌获取新的访问令牌。刷新令牌也可以被撤销,从而强制用户重新登录。
总结
客户端清除:登出时清除客户端的 JWT 令牌,但服务器不会主动跟踪每个客户端的令牌状态。
Postman 测试:使用 Postman 仍然可以通过相同的 JWT 令牌进行身份验证,除非令牌已过期或在黑名单中。
解决方案:设置较短的过期时间、使用黑名单或刷新令牌机制来提高安全性。