使用加密的 cookie 和会话存储来保护请求

Using encrypted cookies and a session store to secure requests

我最近注意到我正在咨询的一个应用程序正在使用未加密的 cookie。前端 (Angular) 经常使用以下提取用户 ID:

var user_id = JSON.parse($cookies.userdata).id;

我想一个讨厌的访问者可以不断地使用他们的浏览器来更改他们的 ID 并访问他们不应该访问的资源。这是一个巨大的危险信号,我需要一些帮助来支撑它。 This looks like a solid enough guide,但我还没有完全了解不同的部分。

  1. 如果我使用 Mozilla 的客户端会话,cookie 中到底存储了什么?有什么我想要的吗?我有 API 路由,例如 GET /api/v1/user/:user_id 到 return 关于用户的信息。如果 cookie 在浏览器上被加密,我将无法访问当前 user_id 并进行此 API 调用。我的行动计划是什么?为此 API 创建一个代理服务器端,它将首先解密 cookie,提取 user_id,然后 然后 调用 GET /api/v1/user/:user_id? API 路由受检查 req.isAuthenticated() === true 的函数保护,如果有帮助的话。

  2. 综上所述,session 在什么时候起作用?假设我将用户会话存储在 MongoDB 中。我们知道 cookie 只能存储 4kb,但如果这就够了呢?什么样的数据应该存储在cookie中,什么样的数据应该存储在用户会话中?

你的回答将大大有助于澄清一些对我来说有点像黑匣子的概念。

试着一次只做一件事,否则你会失去理智! :)

客户端可以随时更改客户端上的任何内容。没关系。服务器很重要。服务器必须安全地使用会话 cookie。阅读 OWASP.

会话 cookie 值不需要加密,它只需要很长且随机即可,因此速度很慢且难以猜测。但是,浏览器和服务器之间的连接应该是加密的(使用 HTTPS)。

如果客户端的 userId 为 4,并且可以成功地从 /foo/userId/5 请求数据,那么这很糟糕。但这与 cookie 无关,而与服务器上的 Access Control 有关。

Cookie 大小几乎无关紧要。您应根据需要在 cookie 中存储尽可能少的信息。将会话数据存储在会话中(网络服务器内存)。在数据库中存储长期数据。

What exactly is stored in the cookie if I use Mozilla's client-session? Anything I want?

是 - 任何值都经过加密和验证,这意味着它们不能在客户端上被篡改。基本上,在存储任何敏感的客户端时,您希望数据是防篡改的,并且还可以选择保密。使用 HMAC over SHA-256 等散列算法对数据进行身份验证可防止篡改,但不会阻止最终用户查看值。同样使用 AES-128 等算法进行加密,甚至可以防止最终用户查看数据。

对于用户名,您可能只需要 完整性(即使其防篡改)。这将阻止您的用户更改它,但您的 user_id 调用仍然能够读取该值。目前尚不清楚 Mozilla 的客户端会话是否仅支持身份验证。我很想改用 JSON Web Tokens,确实如此。

Given the above, at what point does session come into play?

我会使用会话来存储根本不需要客户端的信息。正如您所说,cookie 有大小限制。会话对于大数据更有意义,因为在 每个 请求时将 cookie 值发送到服务器。如果您在 cookie 中设置了大量数据,对于那些使用大量 cookie 的用户,您的网站性能将会降低。