保护快递 API

Securing Express API

我正在编写一个具有独立前端和后端的网络应用程序。前端是用 React 编写的,后端是 node.js 服务器 运行 Express 端点。我如何确保只有我的前端可以访问 API,而不是其他任何人?我的 API URL 暴露在我的前端客户端代码中,所以任何人都可以看到。

我向我的 API 添加了 JWT 身份验证,但我仍然需要一个不受保护的 /login 端点才能生成 JWT 令牌,并且为了登录以生成令牌,我必须 post 来自我前端的用户名和密码,其他用户可以看到,因为它是从客户端完成的。

保护托管在像这样的单独后端上的 API 的正确方法是什么,以便只有我的前端才能访问它,以一种没有人可以看到正在使用什么凭据的方式访问端点?

你不能。您的 API 已上网。任何人都可以访问它。在允许访问 API 之前,您可以要求帐户和帐户的登录凭据,但是一旦有人拥有帐户和凭据,他们就可以从他们自己的脚本而不是通过您的网页访问 API .这就是网络的运作方式。你无能为力。客户端使用的凭据无法隐藏。客户端上的所有数据都可以被客户端上的黑客查看。这就是网络的方式。

大公司通常会监控他们的 API 使用情况以寻找不当使用。这包括速率限制、检测普通人类用户不典型的行为和序列。当他们检测到不当使用时,他们通常会暂时或永久禁用该操作或禁止违规帐户。这也是为什么某些页面使用技术来检测是否是真人单独导致操作(例如 reCaptcha)的原因。例如,在堆栈溢出时,在编辑评论或帖子时,我经常 运行 进入速率限制,它告诉我必须稍等片刻才能接受我的编辑。

没有绝对安全的方法来在客户端中存储凭据。最常见的凭据方案是需要用户名和密码(通过 https 安全),然后当服务器接受这些作为合法凭据时,会向客户端颁发某种令牌,可用于将来 API电话。该令牌可能在 cookie 中,或者可能需要手动包含在每个后续 API 调用中(从浏览器使用 APIs 时 cookie 的优点是,cookie 会随每个后续调用自动发送请求)。

如果令牌是cookie,那么cookie会存储在浏览器的cookie存储中,并且可以为其设置过期时间。浏览器的 cookie 存储受到保护,不会被来自其他站点的网页访问,但可以被本地计算机上的某人访问(它存储在文件系统中)。

如果令牌不是 cookie,只是作为令牌返回,并且客户端希望存储它,还有一些其他地方 Javascript 提供访问权限以存储它。本地存储具有与 cookie 存储类似的安全性。它受到保护,不能被其他网站访问,但可以由本地计算机上的人访问。