java - 如何让 JWT 更安全?
问题描述
我在 Wildfly 服务器上部署的应用程序中创建基于 JWT 的身份验证。
对于到达我的服务器的任何请求,该请求都经过验证具有基本身份验证标头。在我没有获得标头的情况下,我会获得带有用户名和密码的 POST 请求有效负载。我用 HttpServletRequestWrapper 包装请求并向其添加基本身份验证标头并调用另一个应用程序,该应用程序在自动使用登录模块进行身份验证后返回 200 OK。另外,我有一个带有 ConcurrentHashMap<String, MyUser> 的单例,我在其中存储用户登录和带有其他用户详细信息的 User 对象。
收到 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 不安全的原因和方式。但是,我很好奇,如果我能在我失踪的情况下做任何额外的事情吗?
解决方案
1 -> 是的 HTTPS 是唯一的解决方案,无论您在没有 HTTPS MITM 攻击的情况下使 API 变得多么安全,都很容易。
2-> 多重好处带来一些权衡,JWT 泄漏或窃取是一个真正的问题,而且不容易解决,将 IP 地址添加到 JWT 不是一个好主意,因为它们会发生很多变化,而您的用户必须再次验证。您尝试的是快速 JWT 过期,在这种情况下,用户必须在每次令牌过期时进行身份验证,现在为了解决这个问题,您可以使用刷新令牌,实现起来并不难。
想在这里更深入-> https://www.youtube.com/watch?v=DPrhem174Ws&t=1089s
推荐阅读
- mysql - 无法连接到 WSO2 上的 mysql 数据库
- mysql - Nodejs - Mysql - 嵌套 JSON 响应
- firebase - Firebase 托管图片网址最佳做法
- excel - 输入框不适用于不同的excel实例
- ios - 在 SwiftUI 中绑定两个选择器并具有来自两者的唯一值
- python - 为什么 for 循环适用于单个对象而不适用于对象数组?
- haskell - 有没有办法在 scotty 中捕获所有异常而不将我的所有代码包装在异常捕获中
- php - 使用 PHP 遍历未知的 Json 文件
- html - 照片网格的 CSS 对象位置或类似属性
- python - 我可以一次设置所有加载模块的日志记录级别吗?