如何保护我的 Node.js 后端 api 数据?

How can I secure my Node.js backend api data?

我可能对后端服务器的工作方式有点困惑。假设我有一个带有登录名的前端 React 应用程序。登录信息存储在数据库中(即 MSSQL、MySQL、MongoDB),我有一个节点后端,其中包含我的应用程序的路由,以便在用户登录或执行任何操作时获取该信息。当我的 React 应用程序和服务器都托管时,我会调用 api 并且不会将任何机密信息(例如密码)发送回客户端(如果出现登录信息,可能只是一条“成功”消息在后端是正确的)。 我的问题是,是什么阻止某人找到后端路由并将其放入 Insomnia 以获取密码或其他敏感信息?

我的第一个想法是在后端使用 express-session 和 auth 来要求用户登录帐户才能发出此类请求,但我认为这有两个问题:

  1. 当多个用户同时登录时,这将如何工作?由于用户在技术上并没有亲自访问 api 路由,会话是否仍然知道谁在前端登录哪个帐户?即使第一个人尚未注销,第二个人登录是否会覆盖第一个人的会话?
  2. 如果在用户登录后才启动身份验证,是否有人无法从登录路径本身获取响应密码数据?

抱歉,如果这个问题听起来很愚蠢,我只是在理解安全方面有点问题。

听起来好像对身份验证会话的工作方式有些误解。会话有两种主要工作方式——将会话存储在后端(旧方法),或者将会话数据存储在 cookie 中,通常是 JWT(JSON Web 令牌)。 Cookies 是从服务器传递到浏览器的数据位,每当浏览器向您的服务器发出后续请求时,它也会将 cookie 传回,因此您的服务器将始终能够获取该数据。这适用于 auth 的方式如下:

  1. 用户使用凭据(用户名和密码)登录您的应用程序。
  2. 您的服务器通过检查您的数据库或您存储凭据的任何地方来验证凭据,如果失败则拒绝请求。 (检查 Auth0、Firebase Auth 或其他身份验证服务,因为自己这样做可能会很痛苦,并使自己容易受到潜在漏洞的影响)
  3. 如果凭据有效,服务器会生成一个签名的 JWT 令牌,其中包含数据,例如用户的用户名。
  4. 服务器响应正文以及包含 JWT 的 cookie,然后浏览器将其存储。
  5. 用户从您的服务器请求一些用户特定的数据,浏览器将带有 JWT 的 cookie 发送回您的服务器。
  6. 您的服务器通过检查签名来验证 JWT 是否有效。如果有效,它会使用令牌中的用户名来获取用户特定的数据。如果无效,则拒绝请求。

因为签名完全发生在服务器端(通常使用一些哈希算法和您不公开出售的密钥),所以有人几乎不可能伪造 JWT 令牌签名。因此,您的服务器能够 1. 如果签名正确,则相信 JWT 令牌确实有效,并且 2. 找出正在请求数据的用户。

这是一个有助于解释和形象化的视频:https://www.youtube.com/watch?v=soGRyl9ztjI

这是一个用于在 Node 中创建和验证 JWT 的库:https://www.npmjs.com/package/jsonwebtoken

希望这能回答您的问题!