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

时间:2020-04-15 11:04:13

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

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

其他信息

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

方法

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

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

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

好吧,我有一个疑问,但是在我看来,这是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是确定某些客户端特定性的可行选择。

相关问题