【发布时间】: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