Cookie、Session、Token
Cookie
1. 什么是cookie?
- Cookie 是一种由服务器发送到客户端浏览器的小数据片段,用于存储用户的状态信息。例如,用户登录状态或用户偏好设置可以通过Cookie进行管理。
- 计算机cookie更正式地称为 HTTP cookie、网络 cookie、互联网 cookie 或浏览器 cookie。该名称是“魔术 cookie”的缩写版本,“魔术 cookie”是一个术语,指的是计算机接收并在不更改或更改的情况下发回的数据包。
- Cookie 通常包含两部分数据:每个用户的唯一 ID 和网站名称。Cookie 使网站能够在你再次访问它们时检索这些信息,以便它们能够记住你和你的偏好,并根据这些信息为你定制页面内容。如果没有 cookie,你在离开网站后必须重新登录,或者在关闭网页后重新构建你的购物车。这使得 cookie 成为互联网体验的重要组成部分。
简单来说,cookie就相当于你的身份牌,假设一个场景,你现在是国家保密局特工,Cookie就相当于特工的身份牌,并且这个身份牌是加密的(需要暗号口令),用于验证身份(类似于对上口令就能进入保密区域)。你每天到保密区域工作,都需要这个身份牌,以及对口令。但这只是让你能够进去,但你真实的敏感信息(如你的任务、住址)是存储在保密局档案中(服务器中),通过令牌关联,保密局管理人员(服务器)校验无误后,从安全档案库中调取用户的状态和权限。这样的机制既保障了效率又避免了敏感数据暴露。(暗号口令相当于 Session )并且Session 是临时的,每天的暗号会更新,当你下班离开(关闭浏览器或 Session 过期),这个暗号就会失效,下次来需要重新生成新的暗号(重新创建Session)。
但在早期Web场景中,Cookie如同保密局特工的纸质身份牌,其上直接记录明文信息(如特工编号、临时权限),警卫(服务器)仅通过牌面内容验证身份,敏感信息虽部分存于档案库(服务器),但牌面数据可被直接篡改或窃取,存在越权风险;而现代Cookie则进化为电子身份令牌,仅存储无意义序列号(如 token=abc123 ),真实权限、任务等敏感信息加密存储于档案库,每次验证时令牌仅作为「钥匙」触发服务器查询,结合加密传输( Secure )、禁止前端读取( HttpOnly )等机制,既保障通行效率,又实现敏感数据零暴露,从「信息载体」彻底转变为「安全验证枢纽」。
2. Cookie的工作原理是怎么样的?
- 创建:服务器生成Cookie并将其发送到浏览器。
- 存储:浏览器在本地存储Cookie。
- 发送:浏览器在每次向服务器发起请求时自动附带相应的Cookie。
3. Cookie有哪些优缺点呢?
优点:
- 客户端存储:Cookie存储在客户端,服务器负担较轻。
-
自动发送:每次请求时自动发送,适合无状态应用。
缺点
- 容量限制:单个Cookie大小有限制,通常为4KB。
- 安全性:易受CSRF(跨站请求伪造)攻击。
- 易被篡改:Cookie内容可以被客户端修改,需加密处理。
Session
1 .什么是Session?
- Session是在服务器端存储用户会话信息的机制。用户登录后,服务器为其创建一个唯一的Session ID,并将其发送到客户端,客户端将Session ID存储在Cookie中,用于后续的请求。
我们继续沿用刚才的特工例子,在这里,Cookie更像一个临时的身份牌,并且这张卡很小,只能记录简单的信息。并且有被窃取和伪造的风险(安全性低)。我们的门卫通过Cookie来查看身份信息,但不知道你具体的任务细节。而Session是总部的特工机密档案库,里面存储了你的所有信息和任务细节,并且你的ID编号是唯一的,只能通过你这个唯一ID去找。那么这些重要的档案绝不会交给你随身携带,而是被锁在总部(服务器端),只有总部(服务器)才能随时调取和修改。那么这样就大大增加了安全性。
2. Session的工作原理是怎么样的?
-
创建:服务器创建Session并生成唯一的 Session ID。
-
存储:用户的会话数据存储在服务器端。
-
发送:服务器将 Session ID 发送到客户端,客户端将其存储在Cookie中。
-
验证:每次请求时,客户端将 Session ID 发送到服务器,服务器通过 ID 查找对应的会话数据。
3. Session有哪些优缺点呢?
优点:
- 安全性高:敏感数据存储在服务器端,减少数据被篡改的风陷。
- 容量大:可以存储更多的数据。
缺点:
- 服务器负担:服务器需要维护和存储会话状态,可能会增加负担。
- Session过期:如果服务器崩溃,Session可能会消失。
我们可以说,Session是Cookie技术的延伸,Cookie在客户端标记用户身份,而Session是负责在服务器端存储用户的状态。我们为了弥补Cookie技术的不足,所以才引入了Session机制。并且Session是无法独立工作的,我们必须通过Cookie传递一个唯一的标识——Session ID。
Token
1. 什么是Token?
-
Token是一种自包含的数据结构,用于存储用户的身份信息,常见的Token形式有 JWT(JSON Web Token)和 OAuth Token。
我们继续沿用上面的特工举例,对比Cookie和Session,Token更像是总部给特工的一次性密码本,里面包含了所有的信息(包括你的ID,权限,任务细节并加上签名),那我们到达执行任务的地点,只需要把这个一次性密码本给门卫看,门卫(服务器)通过验证签名,来确保密码本没有被篡改,并直接读取任务信息,无需再找总部获取档案。
2.Token的工作原理是怎么样的?
-
创建:服务器生成Token,并包含用户信息。
-
发送:Token发送到客户端,通常由HTTP头部传输。
-
存储:客户端可以将Token存储在 Local Storage 或 Session Storage 中。
-
验证:客户端将Token加入到每次请求中,服务器验证Token的有效性。
3.Token有哪些优缺点呢?
优点
-
自包含:Token包含了所有必要信息,适合无状态的认证机制。
-
扩展性好:支持分布式系统和微服务架构。
缺点
- 安全问题:Token一旦泄露可能会被恶意使用。
- 过期管理:需要额外的机制来处理Token的过期和刷新。
我们可以说 Token 是去中心化的身份凭证,Cookie 和 Session 都需要依赖服务器存储状态,而Token是让客户端自带信息,并且这个信息是一次性的。
Cookie、Session、token 的对比
Cookie 的核心风险在于 浏览器自动管理(自动发送、存储于客户端) 的特性。容易成为攻击者的目标。攻击者可以诱导用户访问恶意网站。
Session 数据存储在服务器内存或数据库中,一旦服务器被攻击(如SQL注入、文件漏洞),攻击者可直接窃取所有用户的 Session 数据。
Token 通常需要客户端主动携带(如放在请求头或URL参数中),而非浏览器自动发送,攻击者难以通过跨站请求伪造(CSRF)获取或利用Token。
特性 | Cookie | Session | Token |
存储位置 | 客户端存储 | 服务器端存储,客户端存储Session ID | 客户端存储 |
安全性 | 易受CSRF攻击 | 更安全,敏感数据存储在服务器端 | 一旦泄露可能被盗用 |
容量 | 4KB限制 | 服务器端可以存储更多的数据 | 受限于 Token 大小 |
性能 | 自动随请求发送 | 服务器需要维护状态、增加负担 | 无状态机制,适合分布式应用 |
使用场景 | 适合简单的用户状态管理 | 适合需要存储大量用户数据的应用 | 适合需要无状态认证和分布式系统的应用 |