面试题答案
一键面试安全风险
- JWT 被篡改:攻击者可以修改 JWT 中的声明(claims),如用户角色、权限等,从而获取非法访问权限。
- JWT 泄露:如果 JWT 泄露,攻击者可以使用该令牌进行身份验证和授权,访问受保护的资源。这可能发生在网络传输过程中被拦截,或者在客户端存储时被窃取。
- 过期时间管理问题:如果 JWT 的过期时间设置不当,可能导致用户过早或过晚失去访问权限,影响用户体验或安全性。
- 密钥管理风险:JWT 的签名验证依赖于密钥,如果密钥泄露,攻击者可以伪造合法的 JWT。在分布式系统中,密钥的安全存储和分发是一个挑战。
保障措施
- 防止 JWT 被篡改
- 使用强签名算法:选择可靠的签名算法,如 HMAC - SHA256 或 RSA 等,对 JWT 进行签名。服务器在验证 JWT 时,会使用相同的算法和密钥来验证签名的有效性,确保 JWT 在传输过程中未被篡改。
- 验证签名:在服务端接收到 JWT 时,必须对其进行签名验证。只有签名验证通过的 JWT 才被认为是合法的。许多编程语言都有相应的 JWT 库,这些库提供了简单的方法来验证 JWT 的签名。
- 防止 JWT 泄露
- 安全传输:在网络传输过程中,使用 HTTPS 协议来加密数据,防止 JWT 在传输过程中被中间人拦截获取。
- 安全存储:在客户端,避免将 JWT 存储在容易被窃取的位置,如明文存储在本地存储(localStorage)或会话存储(sessionStorage)中。可以考虑将 JWT 存储在 HTTP-only 的 cookie 中,这样可以防止通过 JavaScript 访问 cookie,降低 XSS 攻击导致 JWT 泄露的风险。
- 合理管理过期时间
- 设置合适的过期时间:根据应用的需求,合理设置 JWT 的过期时间。对于一些安全性要求较高的操作,可以设置较短的过期时间;对于一些长期存在的会话,可以设置较长但合理的过期时间。同时,可以考虑使用刷新令牌(refresh token)机制,当 JWT 过期时,用户可以使用刷新令牌获取新的 JWT,而无需重新登录。
- 检查过期时间:在服务端验证 JWT 时,除了验证签名,还需要检查 JWT 的过期时间,确保令牌仍然有效。
- 密钥管理
- 安全存储密钥:将密钥存储在安全的位置,如使用硬件安全模块(HSM)来存储密钥,提高密钥的安全性。
- 定期更新密钥:定期更换签名密钥,降低因密钥泄露导致的风险。在更换密钥时,需要确保系统能够平滑过渡,不会影响正常用户的使用。
- 分布式密钥管理:在分布式系统中,可以使用分布式密钥管理服务(如 HashiCorp Vault)来管理密钥,确保密钥在各个节点之间的安全分发和使用。