如何识别执行请求的客户端应用程序



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

附加信息

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

方法

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

  • 协议:几乎总是一样的
  • IP:通常是一样的,因为很少有docker主机
  • 端口:我现在不确定,我想是随机的客户端请求
  • Mac:网络细分是不可预测的

有什么想法吗?

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

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

好吧,我有一个疑问,但在我看来,这是用户代理请求头的目的。

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

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

为了参考,我链接了以下文章。这是一个从Spring Security上下文检测客户端新设备的教程,它部分基于用户代理

此外,在Spring Boot参考文档中,提到了以下应用程序属性:

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

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

最新更新