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

28

如何最好地认证和跟踪用户身份验证状态,有些人说使用会话状态,有些人说使用cookie?

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

有什么想法?有任何好的示例吗?


你有考虑过使用内置的 aspnet 表单身份验证吗?它使用了 cookies,但从安全性的角度来看相当强大,并且可以减轻许多工作。 - Chris Van Opstal
这很不错,但我需要从数据库中验证用户的一些其他信息。它可以做到吗? - Bill
是的,您可以将任何内容存储在用户的个人资料数据中。如果您不确定如何创建自己的用户系统,只有在安全影响较低的情况下才建议这样做。 - Shawn
5个回答

25
使用“会话”而非“Cookie”来作为安全机制的问题在于,会话也需要使用Cookie来识别用户,因此如果出现了与Cookie相关的任何问题,那么同样也存在于会话中。
使用会话时需要特别注意数据局部性。如果您计划随时扩展到多个Web服务器,则需要非常小心地将大量数据存储在会话对象中。
由于您正在使用.NET,基本上必须编写自己的会话存储提供程序来处理这个问题,因为InProc无法扩展到超过1个服务器,DB提供程序是完全错误的想法(整个重点是在扩展时避免DB读取,而不是增加更多),而StateServer存在许多容量问题。(过去,我使用memcached会话存储提供程序解决过这个问题)。
建议查找签名cookie并考虑使用它,而不是普通cookie或会话。它解决了许多安全问题,并消除了会话的局部性问题。请注意,它们在每个请求之间来回发送,所以请谨慎存储数据。

1
您可以在任何平台上使用无 cookie 会话。.NET 也提供了这个功能。 - Esteban Araya
AppFabric分布式缓存如何用于会话存储? - Greg Bacchus
10
无Cookie会话将会话ID放置在URL中。关于这是否比使用Cookie更/不如/同样不安全,我留给你的想象力去决定。 - msgmash.com

17

没有一种完美的方法。如果将其存储在Cookie中,您可能会受到Cookie被盗的批评。如果将其存储在会话中,您可能会受到会话劫持的批评。

个人而言,我倾向于认为会话更加可靠,因为客户端上仅存储会话密钥,而实际数据则保存在服务器上。如果这样说可以的话,它会稍微保密一些。但是,这只是我的偏好,一个优秀的黑客仍然能够绕过不良安全性。

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


1
这有点不对,因为 cookie 可能会被劫持,而 session 可能会被盗取(因为它通常是在普通 cookie 的抽象之上实现的)。 - lubos hasko
6
这个说法并不合理,因为通过窃取cookie来劫持会话,这仍然存在同样的问题。 - Todd Berman
我刚刚在某个地方读到,你可以使用两者的组合。 - user379888
不,你不能窃取会话或其数据,因为它们存储在服务器上。但你可以劫持它。 - ColacX

1

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

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

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


0

Cookies和Sessions本身并不足够。它们是用来跟踪用户及其行为的工具,但您真正需要考虑使用数据库来持久化有关用户的信息,还可以用于保护应用程序。


-3

会话是Cookies...


不完全准确,会话使用 cookie 作为对它们的引用。 - TheMah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接