保护 SPA 背后的 REST API 免受数据窃取

Protecting REST API behind SPA against data thiefs

我正在为 Angular SPA 编写 REST Api 网关,我面临着保护 SPA API 公开的数据免受 "data thiefs".我知道我对 HTML 抓取无能为力,但至少我不想向此类数据窃贼提供用户体验和我们发送给 SPA 的 JSON 的全部功能。

关于此主题的大多数 "tutorials" 和线程之间的区别在于,我将此数据公开给一个 public 网站(这意味着不需要用户身份验证),该网站提供有关视频游戏的有价值的统计信息.

我对如何保护 SPA 的 Rest API 的初步想法:

到处使用 JWT。当访问者第一次打开网站时,SPA 从我的 REST Api 请求 JWT 并将其保存在 HTTPS cookie 中。对于所有请求,SPA 必须使用 JWT 来获得响应。

该方法存在问题

我的问题:

我的印象是这是一个常见问题,因此我想知道是否有任何好的解决方案来防止除了 SPA 直接访问我的 REST Api 响应之外的其他人?

从 API 的角度来看,您的 SPA 与任何其他客户没有任何不同。您显然不能在 SPA 中包含秘密,因为它会发送给任何人并且无法受到保护。此外,它向 API 发出的请求可以很容易地被另一个客户端嗅探和复制。

简而言之,正如此处多次讨论的那样,您无法对客户端应用程序进行身份验证。任何人都可以根据需要创建不同的客户端。

可以 实际做的一件事是检查 referer/origin 请求。如果客户端在浏览器中 运行,它可以发出的请求会受到一定程度的限制,其中一个限制是 referer 和 origin headers,它们始终由浏览器控制,而不是 javascript.因此,您实际上可以确保如果(且仅当!)客户端在未修改的浏览器中是 运行,它是从您的域下载的。顺便说一下,这是浏览器中的默认设置,因此如果您不发送 CORS headers,您已经这样做了(实际上浏览器会这样做)。然而,这并不能阻止攻击者构建和 运行 一个 non-browser 客户端并伪造他喜欢的任何引用者或来源,或者只是无视相同的来源策略。

您可以做的另一件事是定期更改 API 足以阻止流氓客户端工作(并同时更改您的客户端)。显然这根本不安全,但对于攻击者来说可能已经足够烦人了。如果一次下载所有数据是一个问题,那么这也没有任何帮助。

你应该考虑的一些真实的事情是:

  • 真的有人要下载您的数据吗?这个值多少钱?大多数时候没有人愿意创建不同的客户端,也没有人对数据那么感兴趣。

  • 如果 很有趣,您至少应该实施用户身份验证,并通过以下几点来弥补剩余的风险 and/or在你的合同中合法。

  • 您可以实施限制以不允许批量下载。比如一般用户每5秒访问1条记录,一共访问10条记录,你可以根据客户端IP等建立规则,合理限制用户访问。请注意,尽管速率限制必须基于客户端不能任意修改的参数,并且在没有身份验证的情况下,这几乎只是客户端 IP,您将面临 NAT 后面的用户问题(例如,公司网络)。

  • 同样,您可以实施监控,以发现是否有人下载了超出正常或必要的数据。但是,如果没有用户身份验证,您唯一的选择就是禁止客户端 IP。因此,再次归结为了解用户是谁,即。身份验证。