Cookie、Session、Token 三者核心区别 一、开篇引入 不知道
  

stitch_sxk 347

{{ttag.title}}
Cookie、Session、Token 三者核心区别
一、开篇引入
        不知道你有没有过这样的体验:登录常用的网站,关闭浏览器再重新打开,依然是登录状态,不用反复输入密码;逛电商平台时,随手加入购物车的商品,切换页面、甚至隔天再打开,商品还安安稳稳地待在购物车里,不会凭空消失。

        其实这背后,离不开三个“隐形工具”的默默工作——Cookie、Session、Token。很多前端、后端初学者,甚至一些初级开发者,都会对这三个概念感到混淆,觉得它们都是“保存登录状态”的,没什么区别,面试被问到的时候更是支支吾吾,说不出核心要点。

        今天这篇文章,就彻底打破这种混淆,用最通俗的语言、最贴近实际的例子,把Cookie、Session、Token的定义、核心区别、应用场景讲得明明白白,不用复杂的专业术语堆砌,哪怕是刚入门的学习者,看完也能轻松掌握,不仅能搞懂理论,还能应对面试、用到实际开发中。

二、先搞懂3个概念
2.1 Cookie:客户端的“小纸条”
        Cookie 通俗来说,就是服务器发给浏览器的“身份小纸条”。首次访问网站时,服务器生成包含简单身份信息的Cookie,发给浏览器后,浏览器会保存在内存或本地文件中;下次访问时,浏览器自动携带Cookie,服务器识别后无需重复验证身份。

        它的核心特点的:体积限制4KB以内,仅能保存登录状态、用户偏好等简单信息;有过期时间,可设置域名和路径限制使用范围,避免被其他网站获取。最常见的就是网站“记住登录状态”,关闭浏览器后再打开无需重复输入密码,就是Cookie的作用。

2.2 Session:服务器的“专属档案柜”
        如果说Cookie是客户端的“小纸条”,Session就是服务器为每个用户开辟的“专属档案柜”。首次登录时,服务器除了发送Cookie,还会创建Session保存用户登录状态、权限等敏感信息(存于服务器内存、数据库或缓存),客户端无法直接访问。

        服务器通过Cookie传递唯一的SessionID,来匹配对应的用户Session;它与用户一一对应、无体积限制,依赖Cookie实现,过期时间由服务器控制(如30分钟无操作失效),以此节省服务器资源。

2.3 Token:无状态的“身份通行证”
        适配前后端分离、微服务架构,Token应运而生,它是服务器验证身份后生成的加密字符串,相当于“身份通行证”。登录时,服务器验证账号密码后生成Token,发给客户端(可存在Cookie、localStorage中),下次请求时客户端主动携带,服务器解密即可验证身份。

        Token最大特点是“无状态”,服务器无需保存用户信息,仅需保存加密密钥,大幅减轻服务器压力;同时支持跨域、不依赖Cookie,体积可自定义,过期时间由Token本身携带(如JWT)。前后端分离项目(如Vue+SpringBoot),大多用Token实现登录验证,高效又灵活。

三、核心部分:三者核心区别
为了方便大家快速查阅、记忆,也方便面试前快速复习,先整理一份对比表格,把三者的核心区别汇总在一起,一目了然:

对比维度

Cookie

Session

Token

存储位置

客户端(浏览器/本地文件)

服务器端(内存/数据库/缓存)

客户端(Cookie/本地存储/请求头)

安全性

最低,易被篡改、窃取,可通过HttpOnly、Secure提升安全性

中等,信息存服务器,风险主要在SessionID泄露

较高,加密生成,无状态,风险主要在Token泄露

状态性

无状态(服务器不保存用户信息)

有状态(服务器保存用户Session信息)

无状态(服务器不保存用户信息)

扩展性

差,不支持跨域,分布式适配复杂

差,分布式需实现Session共享,配置复杂

好,支持跨域,适配分布式、微服务

体积限制

有,最大4KB

无明确限制

无明确限制

传递方式

浏览器自动携带

依赖Cookie自动携带(SessionID)

前端手动携带(请求头/参数等)

过期管理

客户端+服务器共同控制

服务器控制

Token本身携带,自动过期

结合表格,我们再逐一拆解7个核心维度的区别,帮大家吃透细节,这部分既是面试重点,也是实际开发选技术的关键。

3.1 存储位置(最本质区别)
这是Cookie、Session、Token最本质的区别,记住这一点,就能快速区分三者:

Cookie:存储在客户端,具体来说,是存储在浏览器的内存或本地文件中,客户端可以直接访问和修改(除非设置了HttpOnly属性)。

Session:存储在服务器端,具体来说,是存储在服务器的内存、数据库(如MySQL)或缓存(如Redis)中,客户端无法直接访问,只能通过SessionID间接关联。

Token:存储在客户端,和Cookie类似,可以存储在浏览器的Cookie、localStorage、sessionStorage中,也可以通过请求头、请求参数携带,客户端可以直接访问(除非做了特殊处理)。

3.2 安全性(开发者最关心)
安全性是开发中必须考虑的重点,三者的安全性差异较大,我们逐一分析,同时给出对应的防护建议:

Cookie:安全性最低。因为它存储在客户端,客户端可以直接访问和修改,很容易被篡改、窃取,比如遭受XSS(跨站脚本)攻击时,攻击者可以通过脚本获取Cookie中的信息(如登录状态、SessionID),从而伪造用户身份。不过,我们可以通过一些配置提升Cookie的安全性:设置HttpOnly属性(禁止前端脚本访问Cookie)、设置Secure属性(仅允许HTTPS协议传输Cookie,避免HTTP协议下被窃取)、设置SameSite属性(防止CSRF跨站请求伪造攻击)。

Session:安全性中等。因为Session的核心信息(用户信息、权限等)都存储在服务器端,客户端只携带SessionID,篡改SessionID的难度较大,也无法直接获取Session中的核心信息。但它也有安全隐患:SessionID是通过Cookie传递的,如果Cookie被窃取,攻击者就可以利用SessionID伪造用户身份,访问服务器上的Session信息(即CSRF攻击);另外,如果服务器被攻击,Session中的所有用户信息都会被泄露。防护建议:给Cookie设置HttpOnly、Secure、SameSite属性,同时定期更换SessionID,减少SessionID被窃取后的风险。

Token:安全性较高。Token是通过加密算法生成的,字符串本身就是加密后的结果,篡改后无法通过服务器的解密验证;而且它是无状态的,服务器不保存用户信息,即使服务器被攻击,攻击者也无法获取大量用户的核心信息(除非获取到加密密钥)。但它也有安全隐患:如果Token被泄露(比如通过XSS攻击获取本地存储中的Token),攻击者就可以利用这个Token伪造用户身份,直到Token过期。防护建议:使用HTTPS协议传输Token,避免传输过程中被窃取;设置较短的Token过期时间,减少Token泄露后的风险;将Token存储在HttpOnly Cookie中,避免前端脚本获取;对Token进行签名和加密,防止被篡改。

3.3 状态性(服务器是否保存用户信息)
状态性是三者的另一个核心区别,也直接影响了它们的扩展性:

Cookie:无状态。服务器不需要保存任何用户信息,只需要通过客户端携带的Cookie,就能判断用户的状态(比如是否登录、用户偏好等),每次请求都是独立的,服务器不会记住上一次的请求信息。

Session:有状态。服务器需要为每个用户保存专属的Session信息,记住用户的登录状态、权限等,每次请求都需要关联到对应的Session,服务器会记住用户的操作记录(比如购物车商品、浏览记录等),直到Session过期或被销毁。这种有状态的特性,会占用服务器大量的资源,尤其是在高并发场景下。

Token:无状态。和Cookie一样,服务器不需要保存任何用户信息,只需要保存加密密钥,每次收到Token后,通过解密就能验证用户身份、获取用户信息(Token中可以携带用户ID、权限等简单信息),每次请求都是独立的,不依赖服务器的历史记录。这种无状态的特性,是Token适配高并发、分布式场景的关键。

3.4 扩展性(跨域、分布式场景适配)
随着项目规模的扩大,跨域、分布式部署成为常态,三者的扩展性差异会变得非常明显:

Cookie:扩展性差。Cookie受域名限制,默认情况下,不同域名之间无法共享Cookie,比如www.aaa.com的Cookie,无法被www.bbb.com获取,这就导致跨域项目无法通过Cookie实现身份共享;另外,在分布式系统中,用户的请求可能被分配到不同的服务器上,而Cookie是存储在客户端的,不同服务器之间无法共享Cookie中的信息,需要额外做Cookie同步配置,实现复杂,且容易出现问题。

Session:扩展性差。Session是有状态的,存储在单个服务器上,如果项目采用分布式部署,用户第一次请求被分配到服务器A,服务器A创建了Session,下次请求被分配到服务器B,服务器B上没有用户的Session信息,就会认为用户未登录,导致登录状态失效。虽然可以通过Redis等缓存工具实现Session共享(将所有服务器的Session都存储在Redis中,所有服务器都从Redis中获取Session信息),但会增加配置复杂度,也会给Redis带来一定的压力,扩展性不如Token。

Token:扩展性好。Token是无状态的,服务器不需要保存用户信息,只需要保存加密密钥,无论用户的请求被分配到分布式系统中的哪台服务器,只要这台服务器拥有对应的密钥,就能解密Token、验证身份,不需要做任何信息共享配置;另外,Token支持跨域,不同域名之间可以通过请求头携带Token,实现身份共享,非常适配前后端分离、微服务、跨域项目(如小程序、APP与后端接口的交互)。

3.5 其他关键区别(补充细节)
除了上述4个核心维度,还有3个细节区别,也需要我们了解,避免面试时被问到细节答不上来:

体积限制:Cookie有明确的体积限制,通常不能超过4KB,只能保存简单的键值对信息;Session和Token没有明确的体积限制,只要不影响请求传输效率,就能保存更多的信息(比如Token中可以携带用户ID、权限、角色等信息)。

传递方式:Cookie默认会被浏览器自动携带,每次请求服务器时,浏览器都会自动把对应域名的Cookie发给服务器,不需要前端手动处理;Session依赖Cookie传递SessionID,传递方式和Cookie一致,无需前端手动处理;Token需要前端手动携带,通常放在请求头(如Authorization: Bearer Token)中,也可以放在请求参数、Cookie中,需要前端在请求时主动添加。

过期管理:Cookie的过期时间由服务器和客户端共同控制,服务器可以在设置Cookie时指定过期时间,客户端也可以手动删除Cookie、修改Cookie的过期时间;Session的过期时间由服务器控制,服务器可以设置Session的超时时间(如30分钟无操作失效),也可以手动销毁Session,客户端无法直接控制Session的过期时间;Token的过期时间由Token本身携带(如JWT Token中包含exp过期时间字段),服务器解密后就能获取,过期后Token自动失效,客户端可以手动删除Token,也可以等待Token自动过期。

四、实际应用场景:该用哪个?
        搞懂了区别,最终的目的是在实际开发中做出正确的选择。很多初学者都会有一个误区:觉得Token最先进、最安全,就不管场景,盲目使用Token。其实不然,Cookie、Session、Token没有绝对的好坏,只有是否适合当前的场景。下面结合实际开发中的常见场景,告诉大家该如何选择。

用Cookie的场景
Cookie适合用于保存简单、非敏感、不需要跨域的信息,场景主要有:

1. 保存用户偏好设置:比如网页的主题颜色、字体大小、语言设置等,这些信息简单、非敏感,不需要跨域,用Cookie保存最合适,用户下次访问时,浏览器自动携带Cookie,网页就能展示用户喜欢的设置。

2. 短期记住密码:比如很多网站的“记住我”功能,勾选后,下次登录不用输入密码,这就是用Cookie保存登录状态(通常会加密),设置较短的过期时间(如7天),既方便用户,又降低安全风险。

3. 简单的身份识别:对于一些不需要高安全性的小型网站(如个人博客、静态网站),用Cookie保存登录状态就足够了,不需要复杂的Session、Token配置,降低开发成本。

用Session的场景
Session适合用于传统单体应用、需要保存敏感信息、对跨域无需求的场景,主要有:

1. 传统单体应用:比如Java Web项目(SSM、SSH框架)、PHP单体项目,这类项目通常部署在单个服务器上,不需要跨域,用Session+Cookie的组合,既能保存敏感信息(如用户权限、个人隐私信息),又能降低开发复杂度,是最经典、最常用的方案。

2. 需要保存敏感用户信息:比如用户的手机号、身份证号、权限等级等敏感信息,不适合放在Cookie(客户端可访问)和Token(可能被泄露)中,放在Session(服务器端存储)中,安全性更高,更可控。

3. 对跨域无需求、服务器资源充足:如果项目不需要跨域,且服务器资源充足(不会出现高并发导致Session占用过多内存的问题),用Session是最优选择,开发简单、维护方便,出现问题也容易排查。

用Token的场景
Token适合用于前后端分离、微服务、跨域、高并发的场景,这也是当前主流的选择,主要有:

1. 前后端分离项目:比如Vue+SpringBoot、React+Node.js、Angular+Django等前后端分离项目,前端和后端是两个独立的项目,部署在不同的域名下(跨域),用Token实现身份验证,既能跨域,又能降低服务器压力。

2. 微服务架构、分布式项目:比如大型电商平台、社交软件,项目被拆分成多个微服务(用户服务、订单服务、商品服务),部署在不同的服务器上,用Token实现各微服务之间的身份共享,不需要实现复杂的Session共享,提升系统的扩展性和并发能力。

3. 跨域应用:比如小程序、APP与后端接口的交互,小程序、APP的域名和后端接口的域名通常不同,属于跨域场景,用Token携带身份信息,就能轻松实现跨域身份验证。

4. 高并发场景:高并发场景下,服务器需要处理大量的请求,如果用Session,会占用大量的服务器内存,而Token是无状态的,服务器不需要保存用户信息,能大大提升服务器的并发处理能力,降低服务器压力。

5. API接口授权:比如第三方接口调用、开放平台,需要给第三方授权访问接口,用Token作为授权凭证,既能验证第三方的合法性,又能控制接口的访问权限,过期后自动失效,安全性高、灵活性强。

五、常见误区澄清
        在学习和开发过程中,很多人都会对Cookie、Session、Token产生一些误解,这些误解不仅会影响我们对知识点的掌握,还可能导致开发中踩坑、面试中出错。下面就来澄清几个最常见的误区,帮大家避坑。

误区1:Cookie和Session是对立的?—— 当然不是。很多人觉得,用了Cookie就不能用Session,用了Session就不能用Cookie,其实这是错误的。实际上,Session默认就是依赖Cookie传递SessionID的,二者是“配合使用”的关系:Cookie存SessionID(简单的编号),Session存用户的核心信息(敏感、复杂的信息),这样既保证了安全性,又能实现身份识别。只有在浏览器禁用Cookie的情况下,Session才无法正常使用(此时可以用URL重写等方式传递SessionID,但不推荐,安全性低)。

误区2:Token比Session更安全?—— 不一定。很多人觉得Token是“新技术”,就一定比Session更安全,这是一个常见的误区。Token的安全性,依赖于加密算法的安全性和Token的保管方式:如果加密算法不安全、Token被泄露(比如通过XSS攻击获取),那么Token和Session一样,都会被攻击者利用,伪造用户身份;而Session只要做好防护(给Cookie设置HttpOnly、Secure、SameSite属性,定期更换SessionID),安全性也能得到很好的保证。二者的安全性,关键在于“配置和使用”,而不是技术本身的优劣。

误区3:不用Cookie就能避免安全问题?—— 不是。很多人为了避免Cookie的安全隐患,选择不用Cookie,只用Token,觉得这样就能避免所有安全问题,其实这是错误的。Token虽然可以不用Cookie存储(比如存在localStorage中),但localStorage同样会遭受XSS攻击,攻击者可以通过脚本获取localStorage中的Token,从而伪造用户身份;而Cookie通过合理配置(HttpOnly、Secure、SameSite),可以有效降低安全风险,甚至比存在localStorage中的Token更安全。所以,避免安全问题的关键,不是“不用Cookie”,而是“正确使用Cookie、Token和Session”。

误区4:分布式系统不能用Session?—— 可以用,只是不方便。很多人觉得,分布式系统中,Session存在单个服务器上,无法共享,所以不能用Session,其实这是错误的。分布式系统中,我们可以通过Redis等缓存工具,实现Session共享:将所有服务器的Session都存储在Redis中,所有服务器都从Redis中获取和修改Session信息,这样就能实现分布式环境下的Session共享。只是这种方式,需要额外配置Redis,增加了系统的复杂度,不如Token的无状态特性便捷,所以分布式系统中,更推荐用Token,但不是不能用Session。

打赏鼓励作者,期待更多好文!

打赏
暂无人打赏

发表新帖
热门标签
全部标签>
有一说一
信服课堂视频
每日一问
GIF动图学习
新版本体验
标准化排查
【 社区to talk】
功能体验
纪元平台
高手请过招
2025年技术争霸赛
每周精选
社区新周刊
解决方案
VPN 对接
问题分析处理
产品连连看
畅聊IT
答题自测
专家问答
技术笔记
技术圆桌
在线直播
MVP
网络基础知识
安装部署配置
升级
安全攻防
上网策略
测试报告
日志审计
流量管理
每日一记
运维工具
用户认证
原创分享
sangfor周刊
项目案例
SANGFOR资讯
专家分享
技术顾问
信服故事
SDP百科
功能咨询
终端接入
授权
设备维护
资源访问
地址转换
虚拟机
存储
迁移
排障笔记本
产品预警公告
玩转零信任
S豆商城资讯
技术争霸赛
「智能机器人」
追光者计划
2023技术争霸赛专题
卧龙计划
华北区拉练
天逸直播
以战代练
秒懂零信任
技术晨报
平台使用
技术盲盒
山东区技术晨报
文档捉虫
齐鲁TV
华北区交付直播
2024年技术争霸赛
北京区每日一练
场景专题
故障笔记
排障那些事
西北区每日一问
升级&主动服务
高频问题集锦
POC测试案例
全能先锋系列
安全效果
云化安全能力
专家说
热门活动
产品动态
行业实践
产品解析
关键解决方案
声音值千金
工具体验官
产品知识周周练
产品体验官

本版版主

127
331
368

发帖

粉丝

关注

1
0
0

发帖

粉丝

关注

本版达人

你咋不高兴

本周建议达人

壹加壹网络

本周分享达人