1. 什么是Cookie?它主要是用来做什么的?
- 概念
Cookie是由服务器生成并存储在客户端(通常是浏览器)的一小段数据,以键值对的形式进行存储,它是无状态协议(HTTP)的补充机制,用来在客户端和服务器之间维持状态。每次发送的HTTP请求都会自动携带该域名下存储的Cookie到服务器,以便让服务器能够识别客户端的状态。
注意并非所有的请求都会携带相同的Cookie,而是每个域名会存储对应的Cookie,因此Cookie符合同源策略,不允许跨域请求。
同源策略(Same-Origin Policy,简称SOP)是Web浏览器的一种安全机制,目的是阻止恶意网站通过跨站请求(Cross-Site Request)获取或操作其他网站的数据。它要求来自不同源的网页无法相互访问或操作对方的资源,除非明确允许。
“源”是由协议、域名和端口组成,只有当三者完全相同时,才被视为同一个源。
2. 特点
- 存储位置:Cookie数据以Key-Value的形式存储在【客户端】。
- 数据容量:Cookie可携带大量数据,大小一般限制为4KB。
- 安全性:明文存储在客户端,且包含大量信息,安全性有限,容易被篡改和伪装,不允许跨域。
- 生命周期:可手动设置Cookie的过期时间,也可以设置为会话Cookie,即浏览器关闭时自动删除。
- 性能:每次请求都会携带并传输Cookie数据,可能会造成不必要的网络开销。
工作示意图
- 客户端发送HTTP请求到服务器
- 服务器通过HTTP响应头(Set-Cookie)返回Cookie给客户端
- 客户端保存Cookie,并在后续同源请求中,通过HTTP请求头(Cookie)自动携带返回给服务器
- 服务器根据Cookie的值(如SessionID)识别用户状态,以保持客户端与服务器之间状态维护。
由于Cookie不支持跨域请求,容易被篡改且包含大量的数据,每次请求都会携带Cookie,造成不必要的开销,因此Cookie逐渐被淘汰,通过Session来将用户相关信息存储在服务器中,以减少每次用户请求时携带Cookie的数据量,同时信息存储在服务器,安全性较高。
2. 什么是Session?它主要是用来做什么的?
Session是一种服务器端的状态管理机制,用于在用户与服务器之间保存会话状态。每个用户的会话会生成一个唯一的标识符(Session ID),该标识符通过Cookie或URL参数传递给客户端。Session的实际数据存储在服务器端,客户端仅以Cookie的形式存储Session ID。
会话(Session)是指在客户端与服务器之间的一段交互过程或连接状态。具体来说,会话记录了一个用户从打开应用到关闭或登出之间的所有交互信息,包括用户身份、操作历史、权限等,使得服务器能够“记住”客户端的状态,而不必在每次请求中重新认证或重新加载信息。
通俗来说一次会话是指用户打开浏览器访问多个请求页面,然后再关闭浏览器的过程。
机制示意图
- 主要用途
- 用户身份验证:通常用于存储用户的登录状态
- 敏感数据存储:比如购物车信息、临时会话数据等
- 会话隔离:通过Session ID区分不同的对话,Session ID是以Cookie的形式存储,不同的请求携带不同的Cookie。
- 安全性:数据存储在服务器,安全性较高。
2. 特点
- 存储位置:Session数据存储在服务器端,会为每个用户分配一个唯一的Session ID,通常借助Cookie或者URL重写的方式发送给客户端。
- 数据容量:理论上不受数据大小的限制,受限于服务器内存的大小。
- 生命周期:默认情况下,浏览器关闭后Session结束,但服务器可以设置Session的超时时间,超过该时间未活动,Session也会失效。
- 性能:数据存储在服务端,每次请求都需要查询服务器上的Session数据,可能会增加服务器的负载,特别是在高并发场景下。
工作原理
- 用户登录时提交含用户名和密码的HTTP请求
- 服务器验证该用户和密码
- 如果正确则把用户信息存储在Redis中,Redis中的Key被称为SessionId。
- 服务器返回含SessionId的响应报文,客户端收到该响应报文后存Cookie值于浏览器中。
- 浏览器后续请求同一URL会包含Cookie值,服务器收到后提取SessionId,从Redis中取对应用户信息,继续进行业务操作。
Cookie VS Session
Session
的主要作用是通过服务器记录用户的状态信息,典型的场景就是购物车,服务端给指定用户创建对应的Session
后就可以标识该用户并追踪该用户。
Cookie
数据存储在客户端,Session
存储在服务端,Session
安全性更高,Cookie
和Session
都不支持跨域,需满足同源策略。
分布式Session共享问题
由于Session信息存储在服务器中,实际业务场景中为降低服务器压力及负载均衡会部署多台服务器,如果把Sesion存储在其中某台服务器后会导致用户在访问其他服务器时无法获取对应的Session数据,因此需解决Session同步问题,解决方案有三种:
方案一:Session绑定/粘滞(不建议)
服务器将某个用户的请求进行绑定,后续该用户所有的请求都会指定到该服务器上。
方案二:Session复制(不建议)
服务器之间同步Session对象,使得每台服务器上都保持了所有用户的Session信息。
方案三:分布式Session(常用)
将用户Session不再存放到各自登录的服务器中,而是统一存在Redis,从而解决Session分布式问题。
3. 什么是Token?它主要是用来做什么的?
Token是一种加密的字符串,用于无状态的身份验证机制。Token由服务器生成,存储在本地浏览器中(通常存于Cookie),包含用户的身份信息和权限声明,通常通过加密技术(如JWT)确保安全。Token的核心特性是无状态
,即服务器不需要存储Token数据,而是通过验证Token的有效性来确定用户身份。
- 主要用途
- 分布式认证:适用于跨域、跨服务的分布式系统
- 第三方授权:比如一些应用的Access Token
- 移动和页面应用:Token更适合无状态的客户端使用
工作机制示意
- 客户端用用户名和密码登录服务器
- 服务器验证用户身份后生成Token并返回给客户端
- 客户端将Token存到本地浏览器(通常存于Cookie)
- 客户端发起请求携带Cookie
- 服务器收到请求先验证Token有效性,再返回数据
2. 特点
- 无状态:Token不存储在服务器端,客户端每次都会带上Token,服务器通过验证Token完整性来确定用户身份。
- 安全性高:Token通常是进行加密的,难以伪造,常用的Token(如JWT)还支持签名和过期时间。
- 跨平台:Token可以在浏览器、移动端和桌面应用等不同的平台使用。
- 自包含:Token中可以携带用户信息,因此不需要额外的数据库查询操作。
- 生命周期:通常设置较短的有效期(如15分钟),并配合刷新机制延长认证状态。
4. 总结:Cookie、Session和Token的区别
参考:
Jools_Wakoo关于《Cookie、Session和Token区别》的回答: