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

我最近注意到,我正在咨询的应用程序正在使用未encryption的cookie。 前端(Angular)定期使用以下内容来提取用户标识:

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

我想象一个不愉快的访问者可以不断地使用他们的浏览器来改变他们的ID和访问他们不应该的资源。 这是一个巨大的红旗,我可以用一些帮助支持这一点。 这看起来像一个足够坚实的指导 ,但我并没有把自己的想法围绕在不同的部分。

  1. 如果我使用Mozilla的客户端会话,那么cookie中存储了什么? 任何我想要的? 我有诸如GET /api/v1/user/:user_id API路由来返回关于用户的信息。 如果Cookie在浏览器中被encryption,我将失去访问当前user_id并进行此API调用的能力。 我的行动计划是什么? 为这个API创build一个代理服务器端,首先解密cookie,提取user_id然后调用GET /api/v1/user/:user_id ? API路由被一个函数保护, req.isAuthenticated() === true ,如果有帮助的话。

  2. 鉴于以上情况,会议在什么时候开始? 假设我在MongoDB中存储用户会话。 我们知道cookies只能存储4kb,但如果这样就足够了? 应该在cookie中存储什么types的数据以及应该在用户会话中存储哪种数据?

你的回答将会是一个很长的路要走,清理一些对我来说有点黑盒子的概念。

如果我使用Mozilla的客户端会话,那么cookie中存储了什么? 任何我想要的?

是的 – 任何值都被encryption和authentication,这意味着它们不能在客户端被篡改。 基本上,当存储任何敏感的客户端,你想要的数据是防篡改的,也可以select保密。 使用SHA-256上的HMAC等哈希algorithmvalidation数据可防止篡改,但不会阻止最终用户查看该值。 使用AES-128等algorithm进行encryption,甚至可以防止最终用户查看数据。

在用户名的情况下,你可能只需要完整性 (即使其防篡改)。 这将阻止你的用户改变它,但你的user_id调用仍然能够读取值。 目前尚不清楚Mozilla的客户端会话是否仅支持身份validation。 我会试图使用JSON Web令牌,而不是。

鉴于以上情况,会议在什么时候开始?

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

尝试一次处理一件事,否则你会失去理智! 🙂

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

会话cookie值不需要encryption,它只需要很长且随机,所以它很慢,很难猜测它。 但是,浏览器和服务器之间的连接应该被encryption(使用HTTPS)。

如果客户端具有userId 4,并且可以成功地从/ foo / userId / 5请求数据,那么这是不好的。 但是,这与cookies并不涉及与服务器上的访问控制有关的任何事情。

Cookie大小几乎是不相关的。 根据需要,您应该将尽可能less的信息存储在Cookie中。 将会话数据存储在会话(Web服务器内存)中。 将更长期的数据存储在数据库中。