我会说将状态存储在服务器上的某个位置并将其与用户的会话相关联。虽然 cookie 表面上可能是存储东西的平等地方,但如果您考虑安全性和数据大小,那么在服务器上保留尽可能多的数据是一件好事。
例如,在公共终端设置中,是否可以让某人查看 cookie 的内容并查看列表?如果是这样,cookie 很好;如果没有,您只需要一个将用户链接到数据的 ID。这样做还可以让您确保用户通过站点身份验证以获取该数据,而不是将所有内容存储在机器上 - 他们需要某种形式的凭据以及会话标识符。
从大小的角度来看,当然,您不会太担心 4K cookie 或浏览器/宽带用户的东西,但如果您的目标之一是允许手机或黑莓(不在 3G 上)连接并且拥有快速的体验(并且不会为数据付费),最大限度地减少传递给客户端的数据量将是关键。
服务器存储还为您提供了其他一些答案中提到的一些灵活性 - 用户可以将他们的购物车保存在一台机器上并在另一台机器上继续使用它;您可以将购物车绑定到某种形式的凭据(而不是临时会话),并在用户清除其 cookie 后很长时间保留购物车;您可以在容错方面获得更多信息 - 如果用户的浏览器崩溃,该站点仍然拥有安全可靠的数据。
如果容错很重要,您将需要某种持久性存储,例如数据库。如果没有,在应用程序内存中可能没问题,但如果应用程序重新启动,您将丢失数据。如果您在农场环境中,商店必须可以集中访问,因此您再次查看数据库。
您是选择通过临时会话还是通过凭据进行密钥,将取决于用户是否可以保存他们的数据并稍后再回来获取它。瞬态会话最终将被清理为“被遗弃”,也许没关系。绑定到用户配置文件将使用户保留他们的数据并明确放弃它。无论哪种方式,我都会使用某种后备存储,例如数据库,以实现容错和中央可访问性。(或者也许我过度设计了解决方案?)