如果身份验证失败,则关闭 HTTP 连接

Posted

技术标签:

【中文标题】如果身份验证失败,则关闭 HTTP 连接【英文标题】:Close HTTP connection if authentication fails 【发布时间】:2020-04-27 01:37:15 【问题描述】:

我们正在使用 Spring Boot 框架和码头服务器开发一个 REST 应用程序。

我们希望防止来自流氓客户端的应用在没有适当身份验证详细信息的情况下不间断地连续攻击。

我们想要的是:如果没有正确凭据的客户端尝试访问应用程序,spring security 将确定身份验证状态。如果身份验证失败,spring boot 或 jetty 应该关闭 HTTP 连接。

所以客户端下次发送请求时,又要经过TCP握手的过程。它应该不能在同一个连接中连续命中应用程序。

但我无法在码头或弹簧靴中找到此类属性。 任何人都可以说明如何实现这一点,或者这是否是有效的要求。

【问题讨论】:

如何与您的 Spring Boot 应用程序建立连接?它是带有移动或 javascript 客户端的 REST API?还是您在使用服务器端 html 模板的会话登录? rest api 与任何客户端。它可以是邮递员或自定义客户端。不支持会话。 它应该不能在同一个连接中连续点击应用程序。 -> 你可能也想在谷歌上搜索“spring boot rate limits”。 我找不到任何具体的东西,Spring Boot 框架有助于限制速率。能给个链接吗? 没有开箱即用的支持,所以我不能给你一个直接的链接,但似乎有一些库可以做到这一点,因此向谷歌提示。不幸的是,我没有任何图书馆的经验。 【参考方案1】:

当身份验证失败通知上游关闭连接时,您可以在响应中添加以下标头:

Connection: close

这是来自 rfc 规范 (https://www.rfc-editor.org/rfc/rfc2616#section-14.10) 的 sn-p

HTTP/1.1 为发送方定义了“关闭”连接选项 表示连接将在完成后关闭的信号 回复。例如,

   Connection: close

在请求或响应头字段中表明 连接不应被视为“持久”(第 8.1 节) 当前请求/响应完成后。

【讨论】:

在这个我们把这个选择留给客户端是否使用相同的连接。如果连接了一些流氓客户端,他们不会这样做 除了在响应中发送连接关闭标头之外,我不知道有任何其他方法可以实现此目的。如果您想降低恶意客户端对您的服务执行拒绝服务攻击的风险,您可能需要考虑实施速率限制解决方案。

以上是关于如果身份验证失败,则关闭 HTTP 连接的主要内容,如果未能解决你的问题,请参考以下文章

通过令牌进行身份验证,如果令牌失败,则通过会话进行身份验证,使用 Passport?

HTTP Get 请求错误“身份验证失败,因为远程方已关闭传输流。”

多个身份验证提供者:如果身份验证失败,请不要委托

身份验证失败,因为远程方已关闭传输流

Nodejs和PassportJs:如果身份验证失败,则不会调用passport.authenticate后重定向中间件

通过移动数据的 Firebase 匿名身份验证失败