首页 > 解决方案 > 如何让 JWT 更安全?

问题描述

我在 Wildfly 服务器上部署的应用程序中创建基于 JWT 的身份验证。

  1. 对于到达我的服务器的任何请求,该请求都经过验证具有基本身份验证标头。在我没有获得标头的情况下,我会获得带有用户名和密码的 POST 请求有效负载。我用 HttpServletRequestWrapper 包装请求并向其添加基本身份验证标头并调用另一个应用程序,该应用程序在自动使用登录模块进行身份验证后返回 200 OK。另外,我有一个带有 ConcurrentHashMap<String, MyUser> 的单例,我在其中存储用户登录和带有其他用户详细信息的 User 对象。

  2. 收到 200 OK 后,我创建了一个 JWT 并将其返回给客户端。然后,客户端将 JWT 与每个请求一起发送到 EJB 服务。我将 Authorization 标头作为 Bearer *******。我从 JWT 令牌中解码用户,然后使用映射,我再次创建 Basic Auth 标头并将请求发送到另一个应用程序,该应用程序仅在找到 Basic Auth 标头时才公开服务。

我的疑惑:

a) 在上面的 1) 中,我正在发送 POST 有效负载,我可以在浏览器网络日志中看到它。而且,我可以清楚地看到正在发送的用户名和密码。是否需要做一些额外的事情来防止这种情况发生。或者,这不会对其他用户可见?或者,https是解决方案?

b) 在上面的 2) 中,任何人都可以获得我的令牌,如果他们正在进行 MITM 攻击或知道我的凭据,如 a)。然后,他们可以无缝地访问服务。我可以添加请求用户的 IP 地址并存储在地图中,并在验证 JWT 的同时验证 IP,以便防止 MITM 攻击吗?

我访问过关于 SFO 和 Okta Developer 的其他帖子,他们回答了 JWT 不安全的原因和方式。但是,我很好奇,如果我能在我失踪的情况下做任何额外的事情吗?

标签: javaspring-securityjwtbasic-authentication

解决方案


1 -> 是的 HTTPS 是唯一的解决方案,无论您在没有 HTTPS MITM 攻击的情况下使 API 变得多么安全,都很容易。

2-> 多重好处带来一些权衡,JWT 泄漏或窃取是一个真正的问题,而且不容易解决,将 IP 地址添加到 JWT 不是一个好主意,因为它们会发生很多变化,而您的用户必须再次验证。您尝试的是快速 JWT 过期,在这种情况下,用户必须在每次令牌过期时进行身份验证,现在为了解决这个问题,您可以使用刷新令牌,实现起来并不难。

想在这里更深入-> https://www.youtube.com/watch?v=DPrhem174Ws&t=1089s


推荐阅读