我们正在努力做出最佳决策,以在我们的 Web 应用程序中维护状态。我们倾向于在浏览器上使用加密 cookie,但我们的一些开发人员认为我们应该在服务器上使用 session 变量。
我认为 Cookie 是最佳方法的主要原因只是因为我们不会在负载平衡场景中依赖应用服务器。
反对使用 cookie 的主要原因是 cookie 的处理可能很困惑。
您对这个话题有何看法?
编辑 1:
好的。我从第一篇文章中看到,这两种方法都不是最好的。那么期望方法是什么?
最佳答案
这里有两个问题。首先是cookies和session的区别。除非您使用的是无 cookie session (如 URL 中的唯一 ID),否则 session 只是一个有效期很短的 cookie。您可以使用状态服务器(ScaleOut、Velocity、SQL Server)轻松配置应用程序以在多个服务器之间共享 session
这当然假设您使用用户的 cookie 来存储唯一的 ID,并将其链接回服务器上的所有真实数据,可能在数据库中。然而:
将敏感数据存储在用户的 cookie 中,即使加密,也不是真正安全的,因为它必须是可解密的,这意味着它很容易受到攻击。任何时候您选择在您的应用程序中使用双向加密,您都在承担更重的密码学负担以保持相同级别的安全性。如果您不具备相当多的密码学专业知识可供使用,最好采取安全路线而不是这样做。
简而言之,使用内置 session 或自己滚动,无论哪种方式,请确保您发送给客户端的唯一信息是一个不可猜测的 ID,您将其与存储在您的上的数据联系起来em>结束。
Remembering a user with a cookie:
Assign... a temporary ID associated with that user, like a GUID. Since GUIDs are astronomically unique and practically collision-proof, they're also virtually impossible to guess or predict from outside the system.
滚动您自己的基于 cookie 的 session /“记住我”功能的优势在于,它使您可以更好地控制信息的保留、分发等时间。另一方面,它确实代表了更多的工作,一些它重新实现了 ASP.NET Session 开箱即用的功能。通常我建议使用已有的东西,除非你能清楚地阐明一些驱动的业务需求,将其排除在外。
关于c# - 从架构的角度来看,Session[] 或 Encrypted Cookies 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1457753/