【问题标题】:How to Identify the Client Application that Performs a Request如何识别执行请求的客户端应用程序
【发布时间】:2020-07-28 07:54:43
【问题描述】:

我编写了一个可供多个客户端应用程序使用的 Java (Spring-Boot) 服务。对于维护/统计,我想记录哪些应用程序访问了该服务。如何在不信任客户端的情况下识别客户端应用程序?

其他信息

  • 其中多个客户端应用程序位于反向代理 (traefik) 后面的 docker 容器中。
  • 其中多个客户端应用程序由同一个人编写/维护。这是相关的,因为客户端应用程序使用的请求代码可以重复用于另一个应用程序,而无需更改客户端 ID。
  • 我只想阻止人们复制请求代码,因为它更快。这个解决方案在我看来并不安全,也不一定是。认识到两个应用程序使用相同的标识符就足够了。

接近

这个想法可能是使用公钥身份验证并将私钥绑定到协议/IP/端口组合之类的东西。第一部分(公钥认证)将帮助对良好维护/统计感兴趣的客户。第二部分(绑定)在我看来是一个死胡同,因为我不知道我可以用什么来绑定:

  • 协议:几乎总是一样的。
  • IP:由于 docker 主机很少,通常相同。
  • 端口:我现在不确定,我猜是客户端请求的随机端口。
  • Mac:网段不可预测。

有什么想法吗?

【问题讨论】:

  • 唯一的想法(..到目前为止..在不同的客户结构中):客户必须告诉他们的“身份”(但是)! ..所以“clientId”必须是“合同”的一部分(作为标头/cookie/参数...)!?
  • @xerx593 原始问题中描述的方法已经提供了客户端 ID(公钥认证的密钥)。这并不能解决复制 ID 的问题。
  • 您可以对每个客户端强制执行基本身份验证,或者在标头中使用 User-Agent 来隔离客户端。甚至也可以为每个客户端发送一个唯一的客户端 ID,但这会增加状态管理开销。
  • @Kunal 如果您的意思是更改同一客户端的 ID/令牌,那将是一种有趣的方法(例如 CSRF 令牌)。我可以调查一下。我需要客户端的简单请求代码。因此,正如您所提到的,状态管理可能是一个问题。网络中断(丢失令牌)后,至少状态管理会成为问题。基本认证并没有比公钥认证更好地解决这个问题。在我眼里。一个简单的唯一客户端 ID 已经是 xerx593 的问题和评论的一部分。

标签: java spring-boot docker traefik docker-networking


【解决方案1】:

您还可以通过 http 标头中的令牌添加授权。并重写所有客户端代码以在部署时从环境中获取令牌(不要在存储库的代码中硬编码令牌)。

因此,即使新客户端通过复制粘贴代码出现,它也需要从您那里获取令牌。并且您可以管理不同应用程序的访问,并且如果其中一个应用程序的负载异常,您可以“禁止”该应用程序(或通过降低此特定令牌的响应速度来降级)/

【讨论】:

  • 谢谢。到目前为止,我还没有考虑过令牌方法。令牌也可以在正文中发送,以使客户端的请求代码更简单。请您详细说明“获取令牌”部分吗?我正在寻找具有非常简单的客户端代码的解决方案(修改有效负载 REST 调用)。对于客户端来说,令牌协议的简单方法是什么。部署令牌耗尽后会发生什么?对于生成/交换新代币,你有什么想法?
  • 如果您有少量客户端,ypu 可以手动生成令牌(并将令牌和用户的映射存储在数据库中)。标头比正文中的令牌更好,因为您可以将它们添加到获取/发布请求并将令牌检查/设置的逻辑与处理/准备请求正文分开
【解决方案2】:

嗯,我有一个疑问,但在我看来,这是User-Agent request header 的目的。

如果从浏览器(Firefox、Chrome 等)执行查询,您应该获得详细信息(如果没有代理删除它)。

但是,对于其他软件,这可能没有那么有用。例如,当使用标准 Java HTTP API 时,它将被设置为“Java/X.x”。它需要在启动时使用命令行参数来自定义它(或调用System.property("http-agent", ...),我不知道有多少人为配置它而烦恼。

供参考,我链接the following article。这是一个从 Spring Security 上下文检测客户端新设备的教程,它部分基于 User-Agent

另外,in Spring Boot reference documentation,提到了以下应用程序属性:

server.compression.excluded-user-agents= # list of user-agents to exclude from compression

因此,Spring 开发人员似乎认为 User-Agent 是确定某些客户端特定性的可行选择。

【讨论】:

  • 客户端可以是任何类型的软件。通常,客户端是用 Java(Spring-Boot)编写的。我不能假设他们设置了“http-agent”。欢迎您提供意见,因为我没有关注用户代理(主要是因为客户端不会基于浏览器)。
猜你喜欢
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
  • 1970-01-01
  • 2017-05-15
相关资源
最近更新 更多