【发布时间】:2017-11-23 08:18:39
【问题描述】:
我使用 Spring 创建了一些 REST API,并使用 JWT 实现了 Spring Security 以进行身份验证。我的前端运行 AngularJs 并使用这些接收 JSON 响应的其余 API。 JWT 身份验证工作正常,但它允许将请求参数和标头从浏览器控制台简单地复制和粘贴到 Postman 或任何其他 REST 客户端,甚至可以从后端受保护的 API 获取成功的响应。
我正在尝试通过在 JWT 中使用 JTI 声明来解决此问题。我计划为每个请求后身份验证使用不同的 JTI 值,这样简单地从浏览器中窃取标头就行不通了。
现在在网上浏览了大量可用资源后,我仍然不清楚客户端或服务器应该在 JWT 中设置 JTI 值。
根据我的理解,如果我在服务器端执行此操作,我将不得不在每个响应中发送一个新的 JWT,并期望它在来自客户端的下一个请求中,同时在数据库中维护已用 JTI 的记录。但是,如果攻击者发现了这一点,他们只需使用前一个请求中的令牌,然后他们就可以轻松地与我的 API 进行交互。
另一方面,如果我在客户端执行此操作,我将不得不在 javascript 代码中保留 JWT 的秘密签名密钥和 JTI 生成逻辑,以便它可以附加 JTI 值并散列再次令牌。 那么我的问题是:
- 正确的实现方法是什么?我是否遗漏了什么或完全走错了方向?
- 我是否可以实施任何其他解决方案来禁止或取消验证来自非浏览器客户端的任何请求(在使用 Jsps 的旧 Spring MVC 应用程序中发生的方式)?
非常感谢任何帮助。卡在这上面很久了。
【问题讨论】:
-
我猜你想保护你的客户免受 csrf 的影响,所以我建议这个链接供进一步阅读:stormpath.com/blog/csrf-protection-jwt-spring-security
标签: java angularjs spring spring-security jwt