我编写了一个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
是确定某些客户端特性的可行选项。