Web 身份验证状态 - 会话与 Cookie?

Posted

技术标签:

【中文标题】Web 身份验证状态 - 会话与 Cookie?【英文标题】:Web authentication state - Session vs Cookie? 【发布时间】:2010-09-26 06:34:34 【问题描述】:

在页面之间进行身份验证和跟踪用户身份验证状态的最佳方法是什么?有人说会话状态,有人说 cookie?

我是否可以只使用具有用户 ID 的会话变量,并在身份验证后,实例化一个包含用户信息的自定义用户类。然后,在每个页面上,验证会话变量是否仍然处于活动状态并从 User 对象访问基本用户数据?

有什么想法吗?有什么好的例子吗?

【问题讨论】:

您是否考虑过使用内置的 aspnet 表单身份验证?它使用 cookie,但在安全性方面相当强大,可以减轻很多工作。 这很好,但我需要从数据库中验证有关用户的其他一些信息。能做到吗? 是的,您可以在用户的​​个人资料数据中存储任何内容。如果您不确定如何创建自己的用户系统,我只会在安全隐患低的情况下这样做 【参考方案1】:

会话是 Cookie...

【讨论】:

不完全是,会话使用 cookie 作为对它们的引用【参考方案2】:

没有完美的方法可以做到这一点。如果您将其存储在 cookie 中,您会认为 cookie 可能会被盗。如果您将其存储在会话中,您将受到攻击,因为会话可能被劫持。

就个人而言,我倾向于认为会话更可靠一些,因为唯一存储在客户端上的是会话密钥。实际数据保留在服务器上。如果你愿意的话,它会在离胸部更近的地方打牌。不过,这只是我的偏好,一个优秀的黑客无论如何都可以通过伪劣的安全措施。

无论您做什么,都不要尝试自己实现。你会弄错的。使用您的特定平台提供的身份验证系统。您还需要确保有足够的安全预防措施来保护身份验证令牌。

【讨论】:

这是错误的,因为 cookie 可能被劫持,会话可能被窃取(因为它通常作为普通 cookie 的抽象实现) 这没有意义,因为您通过窃取 cookie 来劫持会话。所以无论如何它都是同一个问题。 我只是在某处阅读,您可以将两者结合使用。 没有人你不能窃取会话或其数据,因为它存储在服务器上。你可以劫持它。【参考方案3】:

Cookies 和 Sessions 本身是不够的。它们是用于跟踪用户及其行为的工具,但您确实需要考虑使用数据库来保存有关用户的信息,这些信息也可用于保护应用程序。

【讨论】:

【参考方案4】:

为了“安全”而偏爱会话而不是 cookie 的问题是会话使用 cookie 来识别用户,因此会话存在任何 cookie 问题。

使用 Session 时要记住的一件事是数据局部性。如果您计划在任何时候扩展到多个网络服务器,则需要非常小心地将大量数据存储在会话对象中。

由于您使用的是 .NET,因此您基本上必须编写自己的会话存储提供程序来处理这个问题,因为 InProc 不会扩展到超过 1 个服务器,数据库提供程序完全是一个坏主意(重点是避免 DB 在扩展时读取这里,而不是添加更多),并且 StateServer 有很多容量问题。 (过去,我曾使用过一个 memcached 会话存储提供程序并成功解决了这个问题)。

我会在谷歌上搜索签名的 cookie,并考虑使用它来代替常规的 cookie 或会话。它解决了很多安全问题,并消除了会话的局部性问题。请记住,它们会根据每个请求来回返回,因此请谨慎存储数据。

【讨论】:

您可以在任何平台上进行无 cookie 会话。 .NET 也提供了我们的功能。 AppFabric 如何为会话存储分布式缓存? @esteban 无 Cookie 会话将会话 ID 放在 URL 中。关于这是否更多/更少/和使用 cookie 一样不安全,我让你自己想象。【参考方案5】:

我不知道这是否是最好的方式,但我们对我们的方式感到满意。

我们有一个自定义用户对象,我们在用户进行身份验证时实例化它,然后我们使用 Session 在整个应用程序中维护这个对象。

在某些应用程序中,我们将其与 cookie 的使用相结合,以持续扩展会话。

【讨论】:

以上是关于Web 身份验证状态 - 会话与 Cookie?的主要内容,如果未能解决你的问题,请参考以下文章

JWT身份验证及其替代方案,可实现Web应用程序后端的RESTfulness

Java Web 会话机制,Cookie和Session详解

Web 应用程序会话与令牌的安全性

REST Web 服务身份验证令牌实现

保持 React 基于 Cookie 的身份验证状态

删除 Worklight Adapter 中的 Cookie:多个会话使用基于相同适配器的身份验证