什么是无状态
这里的无状态是什么?即:交互性场景没有记忆能力
HTTP 是一种无状态协议。无状态协议不要求服务器在多个请求期间保留有关每个用户的信息或状态
一个连接和另一个连接之间没有保持关系,甚至来自同一个客户端。这简化了客户端和服务器之间的协定,并且在许多情况下,最大限度地减少了需要传输的数据量
如何追踪请求
现在,很多 Web 应用程序可能必须跟踪用户在页面到页面的进度,例如,当 Web 服务器需要为用户自定义网页内容时。这些案例的解决方案包括:
- 使用 Http cookies
- 服务器端会话
- 隐藏变量(当前页面包含窗体时)
- 使用 URI 编码的参数(例如/索引.php=session_id some_unique_session_code
Http一定没有状态吗
先说结论:不是
我们回顾一下Http历史
在网景在 1994 年发明饼干和 HTTPS 之前, http 可以被认为是无状态的。随着时间的流逝,由于各种原因,包括性能和安全性,增加了越来越多的有状态方面。
虽然 HTTP 1 最初寻求无状态,但许多 HTTP/2 组件是无状态的定义。HTTP/2 放弃了无状态目标。
没有理性的人可以阅读 HTTP/2 RFC,并认为这是无状态的。错误的 "HTTP 是无状态的" 旧时代教条是错误的, 与当前有状态的 Http 的现实相去甚远。
下面是有状态 HTTP/1 和 HTTP/2 组件的有限且不详尽的列表:
- Cookie,由 RFC 命名为"HTTP 状态管理机制"。
- HTTPS,它存储密钥,从而状态。
- HTTP 身份验证需要状态。
- 网络存储。
- HTTP 缓存是有状态的。
- 流标识符的用途是状态。它甚至以 RFC 部分 "流状态" 的名义。
- 建立流标识符的头块是有状态的。
- 引用流标识符有状态的框架。
- HTTP RFC 明确声明是有状态的标头压缩是有状态的。
- 机会性加密是有状态的。
- HTTP/2 RFC 的第 5.1 节是 HTTP/2 标准定义的有状态机制的一个很好的示例。
Web 应用程序将 HTTP/2 视为无状态协议是否安全?
HTTP/2 是一个有状态协议,但这并不意味着您的 HTTP/2 应用程序不能无状态。您可以选择不使用某些有状态功能用于无状态 HTTP/2 应用程序,只需使用 HTTP/2 功能的子集。
Cookie 和一些其他有状态机制,或不太明显的有状态机制,是后来的 HTTP 添加。HTTP 1 据说是无状态的,尽管实际上我们使用标准化的有状态机制,如 Cookie、TLS 和缓存。与 HTTP/1 不同,HTTP/2 从一开始就在其标准中定义了有状态的组件。特定的 HTTP/2 应用程序可以使用 HTTP/2 功能的子集来保持无状态,但协议本身预计状态是规范,而不是例外。
如果尝试无状态地使用它们,则需要的状态会中断,即使是 HTTP1 应用程序也需要状态。如果禁用 Cookie,则无法登录某些 HTTP/1.1 网站,从而破坏应用程序。假设特定的 HTTP 1 应用程序不使用状态可能不安全。这对于 HTTP/2 来说没有什么不同。
最后一次和我一起说:
HTTP/2 是一个有状态的协议