java - 如何识别执行请求的客户端应用程序
问题描述
我编写了一个可供多个客户端应用程序使用的 Java (Spring-Boot) 服务。对于维护/统计,我想记录哪些应用程序访问了该服务。如何在不信任客户端的情况下识别客户端应用程序?
附加信息
- 其中多个客户端应用程序位于反向代理 ( traefik ) 后面的 docker 容器中。
- 其中多个客户端应用程序由同一个人编写/维护。这是相关的,因为客户端应用程序使用的请求代码可以重复用于另一个应用程序,而无需更改客户端 ID。
- 我只想阻止人们复制请求代码,因为它更快。这个解决方案在我看来并不安全,也不一定是。认识到两个应用程序使用相同的标识符就足够了。
方法
这个想法可能是使用公钥身份验证并将私钥绑定到协议/IP/端口组合之类的东西。第一部分(公钥认证)将帮助对良好维护/统计感兴趣的客户。第二部分(绑定)在我看来是一个死胡同,因为我不知道我可以用什么来绑定:
- 协议:几乎总是一样的。
- IP:由于 docker 主机很少,通常相同。
- 端口:我现在不确定,我猜客户端请求是随机的。
- Mac:网段不可预测。
有任何想法吗?
解决方案
您还可以通过 http 标头中的令牌添加授权。并重写所有客户端代码以在部署时从环境中获取令牌(不要在存储库的代码中硬编码令牌)。
因此,即使新客户端通过复制粘贴代码出现,它也需要从您那里获取令牌。您可以管理对不同应用程序的访问,并且如果其中一个应用程序的负载异常,您可以“禁止”此应用程序(或通过降低此特定令牌的响应速度来降级)/
推荐阅读
- react-native - 试图卸载 rn-fetch-blob
- reporting-services - SSRS 报表在浏览器和报表生成器中的呈现方式不同
- common-lisp - Hunchentoot 是未知的处理程序
- grails - netbeans 9:如何包含依赖的 grails 3.3.8 项目
- gitlab - 我们可以在 Gitlab 存储库中设置 Gitlab webhook 以触发不同分支的不同 Jenkins 构建作业吗?
- json - Oj::ParseError: 不是有效的 ID 号 - "^rc"
- apache-spark-sql - 如何删除 pyspark 数据框中的变音符号?
- linux - 是否有相当于 $SHVLL 的 Windows?
- javascript - module.export 和全局对象
- c++ - 字符串类的奇怪行为