本文共 1854 字,大约阅读时间需要 6 分钟。
HTTP 协议是一种无状态协议,这意味着每次客户端向服务器发送请求时,服务器都无法记住之前的请求记录。为了弥补这一缺点,Session 和 Cookie 的机制被引入,用于保持客户端与服务器之间的会话状态。
Session 是一种用于存储客户端在同一会话期间操作记录的技术。服务器在接收到客户端的请求时,会为此次会话创建一个唯一的内存空间(通常使用 ConcurrentHashMap 存储),并通过生成一个 sessionId 来标识该会话。该 sessionId 会被嵌入到 HTTP 响应头的 Set-Cookie 标头中,客户端随后会将这个 Cookie 响应头信息存储在本地,并在后续的每次请求中发送回服务器。
服务器第一次接收到请求时,会创建一个 Session 对象,并生成一个 sessionId。该 sessionId 会被发送给客户端,并要求浏览器设置 Cookie。客户端在后续的每次请求中都会带上这个 Cookie,服务器通过读取 Cookie 中的 sessionId 来识别当前会话。
Session 的主要缺点在于当服务器进行负载均衡时,Session 数据可能会被转移到其他服务器,而目标服务器并没有存储该 Session 数据,导致 Session 失效。这种情况下,客户端的 Cookie 是无效的,用户可能需要重新登录。
Cookie 是服务器向客户端发送的一小块数据,客户端会存储并随后请求发送回去。Cookie 的主要作用是弥补 HTTP 协议的无状态特性,用于保持客户端与服务器之间的会话状态。
Cookie 的作用域由 Domain 和 Path 决定。 Domain 指定了 Cookie 应该发送给哪些主机,默认为当前主机,不包含子域名。如果指定了子域名,Cookie 会被发送到子域名。此外,Path 指定了 Cookie 的有效路径,例如设置为 /docs,则路径为 /docs、 /docs/Web/ 和 /docs/Web/HTTP 都会匹配。
会话 Cookies:没有设置 Expires 或 Max-Age,这些 Cookie 会随着浏览器关闭而删除。然而,浏览器可能会保留会话 Cookies,以支持跨会话还原。
永久性 Cookies:设置了 Expires 或 Max-Age,这些 Cookie 会在指定日期或时间过期,并从客户端删除。
Secure:要求 Cookie 仅在 HTTPS 协议下发送,确保数据加密传输。
HttpOnly:防止客户端脚本(如 JavaScript)访问 Cookie,防止跨站脚本攻击。
JWT(JSON Web Token)是一种用于身份验证的标准,基于 JSON 格式,由三部分组成:Header、Payload 和 Signature。JWT 由服务器签名,客户端可以验证其真实性。
签名与安全性:JWT 有加密签名,而 Session Cookies 没有。
无状态性:JWT 是无状态的,存储在客户端,减少了服务器资源消耗。
可扩展性:JWT 适合分布式系统,而 Session Cookies 适合单一域名应用。
如果禁用 Cookies,服务器仍需通过 URL 重写(如 PHP 的 rewrite 函数)将 sessionId嵌入到 URL 中,客户端在后续请求中通过 URL 提供 sessionId,从而实现 Session 的管理。这种方法避免了对 Cookie 的依赖。
Session 和 Cookie 是 HTTP 无状态协议的重要补充,用于保持客户端与服务器之间的会话状态。理解这两种技术的工作原理和优缺点,对于开发和优化 Web 应用程序至关重要。
转载地址:http://kiwuz.baihongyu.com/