我正在编写一个带有单独前端和后端的Web应用程序。前端是用React编写的,后端是运行Express端点的node.js服务器。我如何确保只有我的前端可以访问API,而不是其他任何人?我的API URL在我的前端客户端代码中公开,所以任何人都可以看到。
我在我的API中添加了JWT身份验证,但我仍然需要一个不受保护的/登录端点才能生成JWT令牌,并且为了登录生成令牌,我必须发布我的用户名和密码其他用户可以看到的前端,因为它是从客户端完成的。
保护托管在这样的单独后端上的API的正确方法是什么,以便只有我的前端可以访问它,以某种方式,没有人可以看到用于访问端点的凭据?
答案 0 :(得分:1)
你做不到。您的API在互联网上。任何人都可以访问它。在允许访问API之前,您可以要求帐户的帐户和登录凭据,但是一旦有人拥有帐户和凭据,他们就可以从他们自己的脚本而不是通过您的网页访问API。这就是网络的运作方式。你无能为力。并且无法隐藏客户端使用的凭据。客户端上的所有数据都可以由客户端的黑客查看。这是网络的方式。
较大的公司通常会监控其API使用情况,以寻找不当用途。这包括速率限制,检测不是常规人类用户的典型行为和序列。当他们发现不当使用时,他们通常会暂时或永久禁用该行为或禁止违规帐户。这也是为什么有些页面使用技术来检测实际人是否单独导致操作(例如reCaptcha)的原因。例如,在堆栈溢出时,在编辑注释或帖子时,我经常遇到速率限制,它告诉我在接受编辑之前我必须等待一段时间。
在客户端中存储凭据没有绝对安全的方法。最常见的凭证方案是要求用户名和密码(安全地通过https),然后当在服务器上接受它作为合法凭证时,会向客户端发出某种令牌,可用于将来的API调用。该令牌可能位于cookie中,或者可能需要手动包含在每个后续API调用中(当使用来自浏览器的API时,cookie的优势在于随每个后续请求自动发送cookie)。
如果令牌是cookie,则cookie存储在浏览器的cookie存储中,并且可以为其设置到期日期。浏览器的cookie存储受到保护,不会被其他站点的网页访问,但可以被本地计算机上的某个人访问(它存储在文件系统中)。
如果令牌不是cookie,只是作为令牌返回,并且客户端希望存储它,则Javascript提供访问的其他几个地方以便存储它。本地存储具有与cookie存储类似的安全性。它受到其他网站的访问保护,但可以由本地计算机上的人访问。