gpt4 book ai didi

spring-security - 使用 JWT 和基本身份验证保护 REST 应用程序是否有意义?

转载 作者:行者123 更新时间:2023-12-03 07:37:37 25 4
gpt4 key购买 nike

我有一个 Spring REST 应用程序,该应用程序最初通过基本身份验证进行保护。

然后我添加了一个登录 Controller ,用于创建 JWT JSON Web token ,该 token 将在后续请求中使用。

我可以将以下代码从登录 Controller 移出并移入安全过滤器吗?然后我就不再需要登录 Controller 了。

tokenAuthenticationService.addTokenToResponseHeader(responseHeaders, credentialsResource.getEmail());

或者我可以删除基本身份验证吗?

将基本身份验证与 JWT 混合是一个好的设计吗?

虽然一切正常,但我对如何最好地设计这种安全性有点一无所知。

最佳答案

假设所有通信均采用 100% TLS(无论是登录期间还是登录后的任何时间),通过基本身份验证使用用户名/密码进行身份验证并接收 JWT 作为交换是一个有效的用例。这几乎正是 OAuth 2 流程之一(“密码授予”)的工作原理。

这一想法是最终用户通过一个端点进行身份验证,例如/login/token 使用您想要的任何机制,并且响应应包含要在所有后续请求中发回的 JWT。 JWT 应该是一个 JWS(即加密签名的 JWT),具有适当的 JWT 过期 (exp) 字段:这可确保客户端无法操纵 JWT 或使其生命周期比应有的时间长。

您也不需要 X-Auth-Token header :HTTP 身份验证 Bearer 方案是为此确切的用例创建的:基本上是任何信息跟踪 Bearer 方案名称是应验证的“承载”信息。您只需设置 Authorization header :

Authorization: Bearer <JWT value here>

但是,话虽如此,如果您的 REST 客户端“不受信任”(例如支持 JavaScript 的浏览器),我什至不会这样做:可通过 JavaScript 访问的 HTTP 响应中的任何值 - 基本上是任何 header 值或响应正文值 - 可以通过 MITM XSS 攻击嗅探和拦截。

最好将 JWT 值存储在仅安全、仅 http 的 cookie 中(cookie 配置:setSecure(true)、setHttpOnly(true))。这保证了浏览器将:

  1. 仅通过 TLS 连接传输 cookie,并且,
  2. 切勿让 JavaScript 代码可以使用 cookie 值。

此方法几乎是您实现最佳安全实践所需的一切。最后一件事是确保您对每个 HTTP 请求都有 CSRF 保护,以确保向您的网站发起请求的外部域无法正常工作。

最简单的方法是设置一个具有随机值的仅安全(但不是仅http)cookie,例如UUID。

然后,在每次向服务器发出请求时,请确保您自己的 JavaScript 代码读取 cookie 值并将其设置在自定义 header 中,例如X-CSRF-Token 并在服务器中的每个请求上验证该值。外部域客户端无法为您的域请求设置自定义 header ,除非外部客户端通过 HTTP 选项请求获得授权,因此任何 CSRF 攻击尝试(例如在 IFrame 中,无论什么)都将失败。

据我们所知,这是当今网络上不受信任的 JavaScript 客户端可用的最佳安全措施。 Stormpath 在 these techniques 上写了一篇文章如果你好奇的话也可以。呵呵!

关于spring-security - 使用 JWT 和基本身份验证保护 REST 应用程序是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28918519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com