Token与JWT
...大约 4 分钟
Token与JWT
Token与JWT
Token与Jwt解决了Cookie与Session不能跨域的问题
当客户端发起登录请求后,服务器会进行登录认证,认证成功之后,会创建一个Token的字符串,并返回前段,前端拿到Token,后续的请求会将Token传给后端,后端拿到Token后会与库中的token进行校验,校验成功后会正常响应浏览器信息
JWT(JSON Web Token)是一种特定类型的Token,通常由三部分组成,分别是头部(Header)、载荷(Payload)和签名(Signature)
- 头部(Header):头部通常包含两部分信息:令牌的类型(即JWT)和所用的加密算法,例如HMAC SHA256或RSA等。
- 载荷(Payload):载荷是Token的主体部分,包含有关用户或其他主体的信息。载荷可以包含预定义的声明(例如身份信息、权限等)以及自定义的声明。载荷通常被编码为JSON格式。
- 签名(Signature):签名是对头部和载荷的组合进行加密后得到的字符串,用于验证Token的真实性和完整性。签名通常使用头部中指定的加密算法对头部和载荷进行加密,并使用密钥进行签名。
JWT与Token的工作原理类似,不同的地方在于:服务器验证JWT的Token时是验证的签名,不需要跑去验证库中的Token,节省了资源开销。

JWT如何保证数据不被篡改,如何实现踢下线?
JWT的复杂结构保证了它的数据难以被篡改。
主要使用了以下方法防止数据被篡改:
- Payload数据签名:JWT的主要部分是Payload,即包含要传输的信息的JSON对象。在生成JWT时,Payload会被加密生成一个签名(Signature),这个签名是使用JWT生成者的私钥对Payload进行加密生成的。这个签名能够验证Payload在传输过程中是否被篡改。
- 签名验证:在接收到JWT后,接收方使用JWT生成者的公钥来验证签名。如果接收方使用公钥对签名进行解密后与Payload内容进行对比,如果两者一致,则表示数据未被篡改。
- 防止篡改:JWT使用了基于密钥的哈希算法来生成签名,通常使用的是HMAC算法(基于共享密钥),或者是RSA或ECDSA等非对称加密算法(使用公钥和私钥对)来生成签名。这样即使攻击者能够截获JWT并尝试篡改Payload数据,但由于签名是使用私钥生成的,攻击者无法生成正确的签名,因此接收方能够通过验证签名来检测到数据的篡改。
踢用户下线主要在于是当前的JWT无效。
常见的方法有以下几种:
- 使用黑名单:服务器维护一个黑名单列表,记录被踢下线的 JWT。每次请求时,验证 JWT 是否在黑名单中。
- 使用会话储存:在服务器端维护用户会话状态,记录有效的会话信息。每次请求时,验证用户的会话是否有效。
- 缩短JWT的有效期:通过缩短 JWT 的有效期,减少被盗用的风险。用户被踢下线后,只需等待 JWT 过期即可。
JWT在使用过程中都有哪些注意事项?
- 使用秘密秘钥和公私钥对
- 保密密钥管理:对于对称加密(如 HS256),确保密钥足够复杂并安全存储。对于非对称加密(如 RS256),确保私钥安全存储,公钥可以公开。
- 定期轮换密钥:定期更换密钥以减少因密钥泄露导致的风险。
- 设置合理过期时间
- 短期有效性:设置 JWT 的 exp(过期时间)声明以限制 Token 的有效期,减少被盗用的风险
- 使用适当的Token存储位置
- HttpOnly Cookie:考虑将 JWT 存储在 HttpOnly Cookie 中,防止 XSS 攻击。
- LocalStorage 的风险:虽然方便,但 LocalStorage 易受 XSS 攻击的影响,不推荐用于存储敏感信息。
- 处理跨域问题
- CORS 配置:确保服务器配置了适当的 CORS(跨域资源共享)策略,允许可信任的来源访问资源。
- 监控和日志记录
- 日志记录:记录所有 JWT 相关操作的日志,包括生成、验证和失效操作,便于审计和问题排查。
- 监控异常活动:设置监控机制,检测异常的登录和 Token 使用行为,及时响应安全事件。