摘要:Dino 探究无 Cookie 会话的优缺点,并且讨论为什么应该避免在会话状态中存储有价值的信息。
我们承认这一点 — 我们对会话状态这一概念是如此习以为常,以至于我们忘记了会话状态是在 1997 年用 Active Server Pages (ASP) 引入的一个手段。会话状态使开发人员能够在用户与应用程序交互这段时间内持久保存有关该用户的一块信息。特定于用户的信息通常会保留 20 分钟长的时段,而每当用户返回该站点时,该时段都将重新开始计时。
当用户首次连接到站点时,将以内存块的形式创建一个全新的会话状态以存放数据,同时,还会创建一个 ID 以便将其与当前用户唯一地联系起来。当下一次发出请求时,该用户将被要求提交该会话 ID,以便检索并正确地还原会话状态。会话 ID 是 ASP 和 ASP.NET 完全自主生成的字母数字字符串。用户如何管理它并确保用每个后续请求来包装它呢?
HTTP 协议的性质是无状态的,并且没有任何人试图更改这一事实。差不多二十年以前,当 Netscape Corporation 开发它的第一个浏览器时,它“发明”了一种通过 HTTP 工作的持久性机制。它将其称为 HTTP Cookie。有趣的是,计算机科学行话中的术语“Cookie”仅仅表示一块由应用程序持有的不透明数据,它会影响用户但永远不会由用户直接管理。
因此,Cookie 存储会话的 ID,而浏览器则在 Web 服务器和本地用户的计算机之间来回移动它们的内容。当启用了 Cookie 的浏览器收到响应数据包时,它将寻找附加的 Cookie,并将它们的内容存储到本地 Windows 目录中特定文件夹的某个文本文件中。Cookie 还包含有关该源站点的信息。接下来,当浏览器向该站点发送请求时,它会在 Cookie 文件夹中查找源自该域的 Cookie。如果找到,则该 Cookie 自动附加到传出的数据包中。该 Cookie 将命中服务器应用程序,并在此被检测、提取和处理。
最终,Cookie 使 Web 站点更加易于导航,因为它们在用户体验之上提供了必然跨越多个请求的连续性错觉。
Cookies 是不是一个问题?
多年以来,Cookie 只被视为一种技术功能,并且在很大程度上被忽略了。几年以前,针对 Web 安全的世界范围的浪潮将人们的注意力集中于 Cookie 身上。Cookie 被断定包含危险的程序,它们甚至能够超出计算机的物理边界来窃取有价值的信息。
不言而喻,Cookie 不是程序,因而无法自行收集任何信息 — 更不用说有关用户的任何个人信息。更加清楚的是,Cookie 是 Web 站点可以放置在用户的计算机中以便以后检索和重用的一段文本。所存储的信息是由无害的名称-值对组成的。
要点在于,Cookie 不是标准 HTTP 规范的一部分,因此它们意味着浏览器和 Web 站点之间的一种协作。并非所有浏览器都支持 Cookie,而且更为重要的是,并非所有用户都在他们自己的浏览器副本中启用 Cookie 支持。
在历史上,有一些 Web 站点功能是如此紧密地与 Cookie 相联系,以至于很难区分究竟是哪个功能最先出现。一方面,用 Cookie 对会话状态管理和用户身份验证进行编码要容易得多。另一方面,如果您观察一下站点与用于访问页的浏览器有关的统计信息,那么您可能会惊讶地发现,相当一部分用户在连接时禁用了 Cookie。这一点会对开发人员有所启示。
总而言之,Cookie 本身并不是问题,但它们的使用无疑给予一些服务器代码在客户端计算机中存储一段数据的能力。这预示着一些潜在的安全风险和一种不够理想的总体状况。(在某些情况以及某些国家/地区中,应用程序要求 Cookie 工作甚至是非法的。)
返回页首
进入无 Cookie 会话
在 ASP.NET 中,无需使用 Cookie,就可以有选择地建立必要的会话-用户联系。非常有趣的是,除了以下配置设置以外,您无需在 ASP.NET 应用程序中更改任何内容即可启用无 Cookie 会话。
<sessio