Cookie
cookie 只是存储在用户浏览器中的键值对。 cookie 会作为 HTTP 响应的一部分发送到您的浏览器,其中包含您请求的网页。
当您的浏览器接收到一个 cookie 时,它会存储它,并将它与它在同一网站上发出的每个后续请求一起发送回服务器。
因为 cookie 是 HTTP 请求和响应标头的一部分,所以它们的大小有所限制。
cookies 中存储的典型信息:
- 会话 ID(见下文)
- 跟踪 ID(Google Analytics 等)
- 用户偏好(首选语言或货币等)
对于较大或敏感的数据,您通常将值存储在会话中。 cookie 仅用于识别正确的会话。
可以将 cookie 配置为仅在浏览器窗口关闭之前有效,或者具有可配置的生存期(1 周、1 个月、1 年等等)。如果您在此期间再次访问该网站,您的浏览器将在每次请求时发送 cookie。
会话
会话是存储在服务器上的一组数据,通常作为键值对。会话被分配一个伪随机的秘密 ID,该 ID 通常使用 cookie 存储在用户的浏览器中,例如 SESSID=abcdef123456789。会话 ID 通常与服务器上包含会话数据的文件的名称相匹配。
会话通常是短暂的,如果一段时间(20 分钟左右)未使用,会自动删除。
存储在会话中的典型信息:
- 当前登录用户的ID
- 购物车
- ...任何您能想到的,在会话到期时都可以安全删除的内容
示例
假设我第一次访问一个网站。该网站检测到我没有发送会话 cookie,因此它为我创建了一个会话。它在服务器上创建一个会话文件,例如/tmp/sess_abcdef123456789。
然后它会发送一个带有包含网页的 HTTP 响应的 cookie 标头:
HTTP/1.1 200 OK
Set-Cookie: SESSID=abcdef123456789
我的浏览器存储了这个 cookie。如果我访问同一服务器上的另一个页面,我的浏览器将发送此 cookie 和请求:
GET /cart HTTP/1.1
Cookie: SESSID=abcdef123456789
服务器在收到第二个请求时,可以检查是否存在具有此ID的会话文件,并使用它来检索会话数据。
您的网络编程语言将为会话提供支持,并且应该为您处理大部分复杂性。您通常可以直接使用会话数组/对象,该数组/对象已经填充了会话数据特定于访问您网站的用户,并且如果您更新会话数据,则会自动保存;这对你来说应该是完全透明的。
安全
当用户登录到您的网站时,请始终将用户 ID 存储在会话中。 永远不要相信存储在 cookie 中的用户 ID 来加载用户数据。
伪造 cookie 非常容易。如果您要根据存储在 cookie 中的用户 ID 加载用户信息,则可以轻松更改此 cookie 中的用户 ID 以访问您网站上的任何用户帐户。
另一方面,如果您将用户 ID 存储在分配给伪随机会话 ID 的会话中,攻击者将很难猜测当前分配给用户的会话 ID。