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 简介
定义:
Session
, 即会话。在计算机科学和网络技术中是一个广泛的概念,它通常指的是客户端和服务器之间的一系列交互过程。在这个过程中,系统可以长久保持用户状态和数据。在Web应用中,会话通常用于指代用户在一个或多个Web页面上的活动周期。会话的组成
会话标识(
Session ID
):服务器为每个会话分配一个唯一的标识符,通常称为会话ID。客户端在后续的请求中携带这个ID,以便服务器识别是哪个用户的请求。会话数据:服务器在会话中存储的数据,可以是用户信息、购物车内容、登录状态等。
会话状态:会话处于活动或非活动状态的标识。
会话的生命周期
创建:用户首次与服务器交互时创建会话,服务器生成会话ID。
维持:用户继续与服务器交互,服务器根据会话ID识别用户,并维持会话状态。
销毁:用户在一定时间内没有活动,或者用户显式退出会话时,服务器会销毁会话,释放相关资源。
会话的实现机制
Cookie:服务器通过
HTTP
响应头将Session ID
发送给客户端浏览器,浏览器存储为Cookie
,并在后续请求中发送回服务器。URL重写:如果客户端禁用了
Cookie
,服务器可以将Session ID
附加在URL的查询字符串中。隐藏表单字段:服务器可以在表单中插入一个隐藏字段,用于存储Session ID。
会话管理
服务器端会话管理:服务器负责存储所有会话数据。当服务器是集群时,需要解决会话的共享问题,常见的方法有会话复制、会话粘性、使用外部存储(如Redis)等。
客户端会话管理:会话数据存储在客户端,如使用
Local Storage
、Session Storage
等Web存储机制。这种方式减轻了服务器的负担,但安全性相对较低。
会话安全
防止会话劫持:确保会话ID的安全性,使用HTTPS传输会话ID,定期更换会话ID等。
会话固定攻击:防止攻击者固定用户的会话ID。
会话超时:设置合理的会话超时时间,以减少安全风险
Cookie
Cookie简介
定义:
Cookie
是一种小型数据文件,由服务器通过HTTP
响应发送给用户浏览器,并且浏览器会将这些信息存储在本地计算机上。之后,每当浏览器发起对同一服务器的请求时,都会将这个Cookie
发送回服务器。应用:
实现会话管理:识别用户会话,如登录信息、购物车内容。
个性化设置:存储用户的偏好设置,如语言、字体大小。
跟踪用户行为:记录用户的浏览历史,用于分析用户行为,改善用户体验。
广告:用于定向广告,根据用户的浏览习惯显示相关广告。
工作原理:
创建:当用户首次访问一个网站时,服务器生成一个
Cookie
并发送到用户的浏览器。存储:浏览器将 Cookie 存储在本地,通常是在用户的硬盘上。
发送:之后每次请求相同网站时,浏览器都会将
Cookie
包含在HTTP
请求头中发送给服务器。读取和使用:服务器读取 Cookie,根据其中的信息来识别用户和用户的状态。
Cookie 的属性:
Name:Cookie 的名称。
Value:Cookie 的值,通常是一个字符串。
Domain:Cookie 的有效域名。
Path:Cookie 的有效路径。
Expires/Max-Age:Cookie 的过期时间或最长有效时间。
Secure:指示 Cookie 只能通过 HTTPS 传输。
HttpOnly:指示 Cookie 不能通过 JavaScript 访问,增加安全性。
SameSite:控制跨站请求时是否发送 Cookie。
Cookie 的类型:
会话Cookie:临时 Cookie,仅在用户浏览会话期间存在,关闭浏览器后即被删除。
持久Cookie:存储在用户硬盘中,具有过期时间,到期之前一直有效,即使关闭浏览器也不会消失。
设置和删除 Cookie:
设置Cookie:服务器通过
HTTP
响应头中的Set-Cookie
字段来设置Cookie。
删除Cookie:可以通过设置
Cookie
的过期时间为过去的时间来删除Cookie。
安全性问题:
隐私泄露:Cookie 可能包含敏感信息,如果被窃取,可能导致用户隐私泄露。
会话劫持:攻击者可能通过窃取
Cookie
来冒充用户。跨站脚本攻击(XSS):攻击者可能利用
Cookie
进行XSS
攻击。
管理和限制:
浏览器设置:用户可以在浏览器设置中管理
Cookie
,包括查看、删除、阻止特定网站的 Cookie。法律法规:如欧盟的 GDPR(通用数据保护条例)对
Cookie
的使用有严格的规定。