计算机网络——Session、Cookie 和 Token
在 Web 开发中,Session、Cookie 和 Token 是实现用户会话管理和身份验证的核心技术。它们既有联系,也有明显区别。以下从定义、原理、联系、区别和应用场景等方面详细解析。
一、基本定义与原理
1. Cookie
- 定义:
是浏览器存储在客户端的小型文本数据(键值对),由服务器生成并发送给浏览器,后续浏览器会自动携带 Cookie 访问同一域名下的资源。 - 原理:
- 服务器通过响应头
Set-Cookie
发送 Cookie 到浏览器。 - 浏览器每次请求同一域名时,会在请求头
Cookie
中携带该 Cookie。 - 可设置过期时间(
Expires
/Max-Age
),默认随浏览器关闭失效。
- 服务器通过响应头
- 示例:
Set-Cookie: sessionId=abc123; Expires=Mon, 22 May 2025 12:00:00 GMT; Path=/
2. Session
- 定义:
是服务器端用于存储用户会话数据的临时存储机制,通过sessionId
与客户端 Cookie 绑定。 - 原理:
- 用户首次访问时,服务器生成
sessionId
并存储会话数据(如用户信息),同时通过 Cookie 将sessionId
发送给浏览器。 - 后续请求中,浏览器携带
sessionId
,服务器根据该 ID 查找对应的会话数据。
- 用户首次访问时,服务器生成
- 存储介质:
内存、文件、数据库(如 Redis)等,需考虑服务器集群时的共享问题。
3. Token
- 定义:
是客户端向服务器证明身份的凭证(通常为加密字符串),由服务器生成并返回给客户端,后续客户端需主动携带 Token 访问资源。 - 原理:
- 登录时,用户提交凭证(如用户名/密码),服务器验证通过后生成 Token(含用户信息、过期时间等),返回给客户端。
- 客户端存储 Token(如 localStorage、Cookie),每次请求时在请求头(如
Authorization: Bearer <token>
)中携带。 - 服务器验证 Token 的有效性(如签名、过期时间),无需查询数据库。
- 常见类型:
- JWT(JSON Web Token):自包含数据(头部、载荷、签名),无需服务器存储。
- OAuth Token:用于第三方授权(如微信登录)。
二、联系与区别
联系
- 均用于会话管理与身份验证:
- Cookie 和 Session 配合使用(Cookie 存储
sessionId
,Session 存储用户数据)。 - Token 可替代传统的 Session-Cookie 模式,实现无状态身份验证。
- Cookie 和 Session 配合使用(Cookie 存储
- 数据传递依赖 HTTP 请求:
均通过 HTTP 请求头或 Cookie 传递信息,用于识别用户身份。
区别
维度 | Cookie | Session | Token |
---|---|---|---|
存储位置 | 客户端(浏览器) | 服务器端(内存/数据库等) | 客户端(自定义存储,如 localStorage) |
数据性质 | 小型文本数据(键值对) | 任意类型数据(如对象、数组) | 加密字符串(自包含数据或引用标识) |
状态性 | 有状态(依赖服务器会话存储) | 有状态(依赖服务器存储) | 无状态(JWT 自包含数据,无需服务器查询) |
安全性 | 较低(易被篡改,需配合 HttpOnly /Secure ) | 较高(敏感数据存服务器) | 高(加密签名,防篡改) |
跨域支持 | 受同源策略限制 | 受服务器环境限制(需共享会话存储) | 灵活(可通过请求头携带,跨域友好) |
典型应用 | 存储用户偏好、购物车标识 | 存储用户登录状态、权限信息 | 接口认证(如 RESTful API)、单点登录(SSO) |
过期机制 | 客户端控制(通过 Expires/Max-Age) | 服务器控制(可设置超时时间) | 客户端与服务器共同控制(Token 自身包含过期时间) |
三、核心场景对比
1. 传统 Web 应用(Cookie + Session)
- 流程:
登录 → 服务器生成sessionId
和 Session 数据 → 通过 Cookie 返回sessionId
→ 后续请求携带 Cookie → 服务器验证sessionId
并获取用户数据。 - 优点:
- 服务器可控性强,适合存储敏感信息(如用户权限)。
- 无需在请求中携带大量数据。
- 缺点:
- 服务器需维护会话存储,集群环境下需共享存储(如 Redis)。
- 跨域场景下 Cookie 传递受限。
2. 现代 API 应用(Token 为主)
- 流程:
登录 → 服务器生成 JWT → 客户端存储 JWT → 每次请求携带 JWT(如请求头Authorization
)→ 服务器验证 JWT 有效性。 - 优点:
- 无状态,服务器无需存储会话,可横向扩展。
- 跨域友好,适合前后端分离、移动端、第三方服务调用。
- 缺点:
- JWT 自身包含数据,若数据量大(如用户权限列表),会增加请求体积。
- 过期后需重新登录(可通过刷新令牌(Refresh Token)优化)。
四、如何选择?
-
优先使用 Cookie + Session 的场景:
- 需要存储大量敏感数据(如用户购物车详情)。
- 传统单体应用,无需考虑跨域和分布式部署。
-
优先使用 Token(如 JWT)的场景:
- 前后端分离应用、API 接口认证。
- 分布式系统或微服务架构(避免会话共享问题)。
- 第三方授权(如 OAuth 2.0)。
-
混合使用场景:
- 用 Cookie 存储 Token(配合
HttpOnly
防止 XSS 攻击),同时利用 Token 的无状态特性。 - 使用 Session 存储临时数据(如验证码),Token 用于长期身份验证。
- 用 Cookie 存储 Token(配合
五、安全注意事项
-
Cookie 安全:
- 设置
HttpOnly
:禁止 JavaScript 读取 Cookie,防范 XSS 攻击。 - 设置
Secure
:仅通过 HTTPS 传输 Cookie,防止中间人攻击。 - 避免存储敏感数据(如密码)。
- 设置
-
Session 安全:
- 定期更新
sessionId
(如用户重新登录时),防止会话固定攻击。 - 限制 Session 存储时间,避免会话长期有效。
- 定期更新
-
Token 安全:
- 使用 HTTPS 传输 Token,防止明文泄露。
- 对 JWT 签名(非对称加密,如 RS256),防止伪造。
- 短时效 Token + 长时效刷新令牌(Refresh Token),降低 Token 泄露风险。
总结
- Cookie 是客户端存储的基础,常与 Session 配合实现有状态会话管理。
- Token 是无状态的身份凭证,适合现代分布式架构和 API 场景。
- 选择时需结合业务需求(如是否跨域、数据量、安全性)和技术架构(单体 vs 微服务),避免过度设计或安全漏洞。
相关文章:
计算机网络——Session、Cookie 和 Token
在 Web 开发中,Session、Cookie 和 Token 是实现用户会话管理和身份验证的核心技术。它们既有联系,也有明显区别。以下从定义、原理、联系、区别和应用场景等方面详细解析。 一、基本定义与原理 1. Cookie 定义: 是浏览器存储在客户端的小…...

01-jenkins学习之旅-window-下载-安装-安装后设置向导
1 jenkins简介 百度百科介绍:Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。 [1] Jenkins官网地址 翻译&…...
Spark,SparkSQL操作Mysql, 创建数据库和表
以下是使用 Spark SQL 在 MySQL 中创建数据库和表的步骤(基于 Scala API): 1. 准备工作 - 添加 MySQL 驱动依赖 同前所述,需在 Spark 环境中引入 MySQL Connector JAR 包(如 mysql-connector-java-8.0.33.jar &#…...
AttributeError: module ‘cv2.dnn‘ has no attribute ‘DictValue‘错误解决方法
源代码如下: # 读取图像 import cv2 im cv2.imread("./test.png", 1) # 1表示3通道彩色,0表示单通道灰度 cv2.imshow("test", im) # 在test窗口中显示图像 print(type(im)) # 打印数据类型 print(im.shape) # 打印图像尺寸 cv2.wai…...
HarmonyOS 鸿蒙应用开发基础:@Watch装饰器详解及与@Monitor装饰器对比分析
在鸿蒙系统的开发中,状态管理和组件之间的通信是至关重要的部分。为此,鸿蒙提供了多种装饰器来帮助开发者监听和处理数据变化。今天我们将深入探讨Watch装饰器,并与新的状态管理组件V2中的Monitor装饰器进行对比。 Watch装饰器详解 基本概念…...
机器人拖动示教控制
机器人拖动示教控制 机器人拖动视角控制与轨迹记录 1. 知识目标 体验ES机器人拖动视角操作体验ES机器人拖动轨迹记录 2. 技能目标 掌握ES机器人拖动视角操作掌握ES机器人拖动轨迹记录 3. ES机器人拖动视角操作 3.1 操作步骤 点击“拖动视角”按钮长按“启用”键约3秒进入…...

免费开放试乘体验!苏州金龙自动驾驶巴士即将上线阳澄数谷
近日,苏州自动驾驶巴士线路——阳澄数谷示范线正式上线,即日起向全民免费开放试乘体验! 在苏州工业园区地铁3号线倪浜•阳澄数谷站外,一辆辆黑、白配色的小巴正在道路上有条不紊地行驶。与普通公交不同的是,小巴造型奇…...
matlab加权核范数最小化图像去噪
加权核范数最小化(Weighted Nuclear Norm Minimization, WNNM)是一种有效的图像去噪方法,它通过最小化加权核范数来促进图像的低秩近似,同时保留图像的边缘和细节信息。这种方法在去除噪声的同时,能够较好地保留图像的…...
docker容器暴露端口的作用
Docker 镜像中**暴露的端口(通过 EXPOSE 指令声明)**主要有以下作用和意义: 1. 文档化作用(Documentation) 显式声明容器内部服务监听的端口,告知用户或开发者该镜像提供的服务需要通过哪些端口通信。例如…...

每日Prompt:像素风格插画
提示词 像素风格插画,日式漫画脸,画面主体为一位站在路边的男孩,人物穿着黑色冲锋衣,手里拿着手机,男孩靠坐在机车旁边,脚边依偎着一只带着小摩托车头盔的小小猫,背景是雨中,身旁停…...

Windows逆向工程提升之二进制分析工具:HEX查看与对比技术
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 十六进制查看工具 应用于逆向工程的知识点 编辑 二进制对比工具 应用于逆向工程的知识点 十六进制查看工具 十六进制查看器是逆向工程的基础工具,它可以以十六进制格式…...
Android10如何设置ro.debuggable=1?
说明:仅供学习使用,请勿用于非法用途,若有侵权,请联系博主删除 作者:zhu6201976 目录 一、背景 二、如何解决? 三、操作步骤 一、背景 Android 10 开始的限制:ro.debuggable 是只读属性 从 …...

2024游戏安全白皮书:对抗激烈!PC游戏外挂功能数增长超149%,超85%移动外挂为定制挂(附获取方式)
2024 年,中国游戏市场实际销售收入达 3257.83 亿元,同比增长 7.53%;用户规模 6.74 亿人,同比增长 0.94%,再创新高。这份庞大的数据背后,更是对安全防线实力的严峻拷问。 在广东省游戏产业协会的指导下&…...
深度解析:Spark、Hive 与 Presto 的融合应用之道
目录 一、Spark分布式部署基础 1.1 Spark部署模式概述 1.2 Standalone模式部署 1.3 YARN模式部署 1.4 Kubernetes模式部署 1.5 Spark关键配置参数优化 1.6 Spark高可用配置 二、Apache Thrift 在大数据生态中的核心作用 2.1 基础概念 2.2 在大数据中的应用 2.3 Beel…...

12kV 环保气体绝缘交流金属封闭开关设备现场交流耐压试验规范
范围 本文件规定了12kV环保气体绝缘交流金属封闭开关设备现场交流耐压试验的被试设备及试验接线、试验条件、试验步骤、试验判据及异常处理方法。 本文件适用于12kV环保气体绝缘交流金属封闭开关设备现场交流耐压试验,其他气体绝缘交流金属封闭开关设备可参照执行。…...

位图算法——判断唯一字符
这道题有多种解法,可以创建hash数组建立映射关系判断,但不用新的数据结构会加分,因此我们有“加分”办法——用位图。 我们可以创建一个整型变量(32位)而一共才26个字母,所以我们只要用到0-25位即可&#…...
HarmonyOS 鸿蒙应用开发基础:父组件调用子组件方法的几种实现方案对比
在ArkUI声明式UI框架中,父组件无法直接调用子组件的方法。本文介绍几种优雅的解决方案,并作出对比分析,分析其适用于不同场景和版本需求。帮助开发者在开发中合理的选择和使用。 方案一:Watch装饰器(V1版本适用&#x…...
复盘20250522
根据行业前景、公司基本面、技术壁垒及市场催化因素的综合分析,以下两支个股最有可能持续上涨: 1. 汇得科技(机器人化工) 核心逻辑: 高增长赛道验证:公司动力电池配套产品(水冷板缓冲垫、保温…...

【UE5】环形菜单教程
效果 步骤 1. 下载图片资源:百度网盘 请输入提取码 提取码:fjjx 2. 将图片资源导入工程,如下 3. 新建3个控件蓝图,这里分别命名为“WBP_CircularMenu”、“WBP_Highlight”、“WBP_Icon” 4. 打开“WBP_Icon”,设置“所需” 添加…...

Athena 执行引擎:在线服务计算的效率王者
引言 在在线服务领域,计算任务呈现出独特的特性:一方面,数据量通常不会过于庞大,因为在线服务对耗时和响应速度有着严苛要求;另一方面,计算任务具有可控性,其大多并非由用户实时输入动态生成&a…...

飞桨paddle ‘ParallelEnv‘ object has no attribute ‘_device_id‘【已解决】
书借上回,自从我反复重装paddle之后,我发现了,只要pip list中有库,但是代码报错,那就是飞桨没把代码更新完全,只能自己去改源代码 我又遇到报错了: 根据报错信息,找到ParallelEnv报…...
Bert预训练任务-MLM/NSP
MLM MLM:Masked Language Mode:在每一个训练序列中以15%的概率随机地选中某个token进行MASK,当一个token被选中后,有以下三种处理方式: 80%的概率被[MASK],如my dog is hairy->my dog is [MASK]10%的概率修改为随机的其他token,如my dog …...

微信小程序之Promise-Promise初始用
我们来尝试使用Promise。 1、需求,做个抽奖的按钮, 抽奖规则: 30%的几率中奖,中奖会提示恭喜恭喜,奖品为10万 RMB 劳斯莱斯优惠券,没中奖会提示再接再厉。 2、先搭界面: <view class&qu…...

准备好,开始构建:由 Elasticsearch 向量数据库驱动的 Red Hat OpenShift AI 应用程序
作者:来自 Elastic Tom Potoma Elasticsearch 向量数据库现在被 “基于 LLM 和 RAG 的 AI 生成” 验证模式支持。本文将指导你如何开始使用。 Elasticsearch 已原生集成业内领先的生成式 AI 工具和服务提供商。欢迎观看我们的网络研讨会,了解如何突破 RA…...
spring的注入方式都有什么区别
目录 1. 构造器注入(Constructor Injection) 2. Setter 注入(Setter Injection) 3. 字段注入(Field Injection) 4. 接口注入(Interface Injection) 主要区别对比 最佳实践 总…...

RNN神经网络
RNN神经网络 1-核心知识 1-解释RNN神经网络2-RNN和传统的神经网络有什么区别?3-RNN和LSTM有什么区别?4-transformer的归一化有哪几种实现方式 2-知识问答 1-解释RNN神经网络 Why:与我何干? 在我们的生活中,很多事情…...

Linux | 开机自启动设置多场景实现
注:本文为“Llinux 设置开机自启”相关文章合辑。 略作重排,未整理去重。 如有内容异常,请看原文。 Linux 设置开机自启动的三种方法 幽夜卡尔 2022-10-22 一、在 /etc/rc.local 文件中添加自启动命令 编辑文件:执行以下命令&a…...

杨校老师竞赛课之青科赛GOC3-4年级组模拟题
1.山峰(程序填空)程序填空题 题目描述 编程画出山峰。 要求:两个正三角形,三角形边长分别是200、100,山峰的颜色为8号色。 int main() {// 绘制等边三角形(边长100):右转30度调整…...
设计杂谈-工厂模式
“工厂”模式在各种框架中非常常见,包括 MyBatis,它是一种创建对象的设计模式。使用工厂模式有很多好处,尤其是在复杂的框架中,它可以带来更好的灵活性、可维护性和可配置性。 让我们以 MyBatis 为例,来理解工厂模式及…...

SC3000智能相机-自动存图
1、需求:SC3000智能相机开机自动存图。相机自带的相机存储空间有限,预留存图需要开启SCMVS、并手动点存图。如果工人忘了开启则不会存图,导致生产严重失误! 2、方法:利用相机提供的FTP协议,将图自动存到本地。 1、在本地建立FTP服务器。 (1)win10默认开启了FTP服务器…...