如何区分我的客户端应用程序发送的 HTTP 请求和来自 Internet 的其他请求

How to distinguish between HTTP requests sent by my client application and other requests from the Internet

假设我有一个通过 HTTP 工作的 client/server 应用程序。服务器提供 RESTy API,客户端使用常规 HTTP GET 请求通过 HTTP 调用服务器。

服务器需要身份验证。 Internet 上的任何人都可以向我的服务器发送 GET HTTP 请求。没关系。我只是想知道如何区分来自我的客户端的请求和来自 Internet 的其他请求。

假设我的客户端发送了一个请求X,一个用户记录了这个请求(包括代理,headers,cookies等),然后用wget再次发送。我想在 server-side.

中区分这两个请求

除了身份验证,没有确切的解决方案。另一方面,您不需要为此基本要求实施用户名和密码身份验证。您可以简单地为您的 "client" 识别一个随机字符串,然后通过自定义 http header 变量将其发送到 api,例如 ;

GET /api/ HTTP/1.1
Host: www.backend.com
My-Custom-Token-Dude: a717sfa618e89a7a7d17dgasad
...

您可以通过此自定义 header 变量及其值的存在性和有效性来区分请求。但我是说 "Security through obscurity" 不是解决方案。

您无法确定它是否是您的应用程序。请求中的任何内容都可以弥补。

但是,您可以确保没有人无意中使用您的应用程序。例如,有人可能会创建一个 javascript 应用程序并指向您的 REST API。浏览器发送 Origin header (draft) 指示请求是在哪个应用程序中生成的。您可以使用此 header 过滤来自不属于您的应用程序的调用。

但是,有人可能会使用他自己的 Web 服务器作为您的应用程序的代理,然后允许他制作更详细的 HTTP 请求。在这种情况下,在某些时候您可以查明他的 IP 地址并阻止它。

但最好的解决办法是进行一定程度的授权。例如,UI 部分可以通过 login/password 请求身份验证,或者只是一个验证码以确保调用者是一个人,然后生成一个令牌并将该令牌与使用 session 相关联。从那时起,对 API 的调用必须提供此类令牌,​​否则您必须拒绝它们。