Session 与 Cookie

HTTP请求的无状态性

所谓 无状态 是指:单个HTTP请求之间是没有关联的,服务器在处理每个请求时不会 “记住” 之前的请求。

  • HTTP协议的无状态性

    • 每次请求都是独立的:当客户端(如浏览器)发送一个 HTTP 请求到服务器时,该请求包含了处理该请求所需的所有信息。服务器处理完请求并返回响应后,就不会保留关于该请求的任何信息。

    • 无会话信息保留:在默认情况下,HTTP 服务器不会在请求之间保留任何关于用户会话的信息。每个请求都必须包含理解该请求所需的所有上下文信息。

  • 为什么HTTP是无状态的

    • 简化设计:无状态性使得 HTTP 协议的设计更加简单,服务器不需要维护复杂的会话状态。

    • 可伸缩性:由于每个请求都是独立的,HTTP 服务器可以更容易地处理大量的并发请求,这在互联网的早期尤其重要。

  • Web应用中维持状态

    尽管 HTTP 本身是无状态的,但现代Web应用通常需要跟踪用户的状态。典型的比如:用户登录,添加商品到购物车等应用场景。为实现这一目的,一般有如下一些常见做法:

    • Cookie:服务器可以发送一个小的数据片段(Cookie)到客户端,客户端在后续的请求中会将这个Cookie发送回服务器,服务器通过这个Cookie来识别用户。

    • Session:服务器为每个用户创建一个会话,并通过一个唯一的会话ID来跟踪用户的状态。会话ID通常存储在Cookie中。

    • Token:例如,使用 JWT(JSON Web Tokens) 来在请求中携带用户信息和权限,服务器通过验证Token来维持状态。

    • URL重写:将状态信息作为URL的一部分传递,例如在查询字符串中包含会话ID。

Session

Session 简介

  1. 定义Session, 即会话。在计算机科学和网络技术中是一个广泛的概念,它通常指的是客户端和服务器之间的一系列交互过程。在这个过程中,系统可以长久保持用户状态和数据。在Web应用中,会话通常用于指代用户在一个或多个Web页面上的活动周期。

  2. 会话的组成

    • 会话标识(Session ID:服务器为每个会话分配一个唯一的标识符,通常称为会话ID。客户端在后续的请求中携带这个ID,以便服务器识别是哪个用户的请求。

    • 会话数据:服务器在会话中存储的数据,可以是用户信息、购物车内容、登录状态等。

    • 会话状态:会话处于活动或非活动状态的标识。

  3. 会话的生命周期

    • 创建:用户首次与服务器交互时创建会话,服务器生成会话ID。

    • 维持:用户继续与服务器交互,服务器根据会话ID识别用户,并维持会话状态。

    • 销毁:用户在一定时间内没有活动,或者用户显式退出会话时,服务器会销毁会话,释放相关资源。

  4. 会话的实现机制

    Cookie:服务器通过 HTTP 响应头将 Session ID 发送给客户端浏览器,浏览器存储为Cookie,并在后续请求中发送回服务器。

    URL重写:如果客户端禁用了 Cookie,服务器可以将 Session ID 附加在URL的查询字符串中。

    隐藏表单字段:服务器可以在表单中插入一个隐藏字段,用于存储Session ID。

  5. 会话管理

    • 服务器端会话管理:服务器负责存储所有会话数据。当服务器是集群时,需要解决会话的共享问题,常见的方法有会话复制、会话粘性、使用外部存储(如Redis)等。

    • 客户端会话管理:会话数据存储在客户端,如使用 Local StorageSession Storage 等Web存储机制。这种方式减轻了服务器的负担,但安全性相对较低。

  6. 会话安全

    • 防止会话劫持:确保会话ID的安全性,使用HTTPS传输会话ID,定期更换会话ID等。

    • 会话固定攻击:防止攻击者固定用户的会话ID。

    • 会话超时:设置合理的会话超时时间,以减少安全风险

Cookie简介

  1. 定义Cookie 是一种小型数据文件,由服务器通过 HTTP 响应发送给用户浏览器,并且浏览器会将这些信息存储在本地计算机上。之后,每当浏览器发起对同一服务器的请求时,都会将这个 Cookie 发送回服务器。

  2. 应用:

    • 实现会话管理:识别用户会话,如登录信息、购物车内容。

    • 个性化设置:存储用户的偏好设置,如语言、字体大小。

    • 跟踪用户行为:记录用户的浏览历史,用于分析用户行为,改善用户体验。

    • 广告:用于定向广告,根据用户的浏览习惯显示相关广告。

  3. 工作原理

    • 创建:当用户首次访问一个网站时,服务器生成一个 Cookie 并发送到用户的浏览器。

    • 存储:浏览器将 Cookie 存储在本地,通常是在用户的硬盘上。

    • 发送:之后每次请求相同网站时,浏览器都会将 Cookie 包含在 HTTP 请求头中发送给服务器。

    • 读取和使用:服务器读取 Cookie,根据其中的信息来识别用户和用户的状态。

  4. Cookie 的属性:

    • Name:Cookie 的名称。

    • Value:Cookie 的值,通常是一个字符串。

    • Domain:Cookie 的有效域名。

    • Path:Cookie 的有效路径。

    • Expires/Max-Age:Cookie 的过期时间或最长有效时间。

    • Secure:指示 Cookie 只能通过 HTTPS 传输。

    • HttpOnly:指示 Cookie 不能通过 JavaScript 访问,增加安全性。

    • SameSite:控制跨站请求时是否发送 Cookie。

  5. Cookie 的类型:

    • 会话Cookie:临时 Cookie,仅在用户浏览会话期间存在,关闭浏览器后即被删除。

    • 持久Cookie:存储在用户硬盘中,具有过期时间,到期之前一直有效,即使关闭浏览器也不会消失。

  6. 设置和删除 Cookie:

  • 设置Cookie:服务器通过 HTTP 响应头中的 Set-Cookie 字段来设置 Cookie。

  • 删除Cookie:可以通过设置 Cookie 的过期时间为过去的时间来删除 Cookie。

  1. 安全性问题:

    • 隐私泄露:Cookie 可能包含敏感信息,如果被窃取,可能导致用户隐私泄露。

    • 会话劫持:攻击者可能通过窃取 Cookie 来冒充用户。

    • 跨站脚本攻击(XSS):攻击者可能利用 Cookie 进行 XSS 攻击。

  2. 管理和限制:

  • 浏览器设置:用户可以在浏览器设置中管理 Cookie,包括查看、删除、阻止特定网站的 Cookie。

  • 法律法规:如欧盟的 GDPR(通用数据保护条例)对 Cookie 的使用有严格的规定。