【Java面试题】cookie、session、jwt/token的异同

以下是对Cookie、Session、Token与JWT的异同的完善分析,结合技术原理、安全性和应用场景进行系统性对比:


🔍 一、核心概念与工作流程

机制定义工作流程核心特点
Cookie客户端存储的小型文本数据1. 服务器通过Set-Cookie响应头下发数据
2. 浏览器自动在后续请求中通过Cookie头回传
3. 服务器解析Cookie获取用户状态
依赖浏览器自动管理,可设置有效期、作用域和安全性属性(如HttpOnly
Session服务器端存储的用户会话数据1. 登录后服务器生成唯一Session ID并存入服务器
2. Session ID通过Cookie发送给客户端
3. 后续请求携带Session ID,服务器据此查询会话数据
有状态:会话数据存储在服务端(内存/数据库)
Token广义的认证令牌(如UUID、OAuth令牌)1. 登录后服务器生成令牌返回客户端
2. 客户端在请求头(如Authorization)中手动携带令牌
3. 服务器验证令牌有效性
无状态:服务端不存储令牌数据,验证依赖签名或密钥
JWT特定格式的Token(JSON Web Token)1. 登录后生成包含用户信息的JWT(Header+Payload+Signature)
2. 客户端存储JWT并在请求头中传递
3. 服务端验证签名和有效期
自包含:用户信息直接编码在Token中,无需查库

⚖️ 二、关键异同对比

1. 存储位置与状态管理
特性CookieSessionTokenJWT
存储位置客户端浏览器服务端(数据)+ 客户端(ID)客户端客户端
状态性依赖服务端Session时为有状态有状态(服务端维护数据)无状态(服务端不存储)无状态(自包含用户信息)
跨域支持受限(需设置domain需额外配置(如共享Redis)天然支持天然支持
2. 数据结构与安全性
项目CookieSessionToken/JWT
数据格式键值对文本(≤4KB)任意类型(对象/数组)JWT为三段式Base64编码(Header.Payload.Signature)
敏感信息存储不安全(需避免存储敏感数据)安全(数据在服务端)JWT的Payload仅Base64编码(非加密),避免存储敏感信息
主要风险CSRF、XSSSession劫持、服务器资源耗尽JWT密钥泄露、令牌盗用
安全增强HttpOnlySecureSameSite定期过期、IP绑定HS256/RS256强签名算法、短期有效期
3. 性能与扩展性
  • Cookie
    每次请求自动携带,增加带宽开销;适合单体应用,但跨域场景性能受限。
  • Session
    高并发时服务端存储压力大,分布式系统需引入Redis等共享存储,增加架构复杂性。
  • Token/JWT
    无状态特性天然适合分布式系统和微服务,无需会话同步;但JWT的Payload过大会影响网络传输效率。

🛡️ 三、核心问题与解决方案

1. JWT的独特挑战
问题原因解决方案
无法主动注销服务端无状态,无法废止已签发Token引入黑名单机制(如Redis记录失效Token)
令牌续期体验差过期后需重新登录双Token机制(Access Token+Refresh Token)
Payload安全性Base64非加密,信息可被客户端解码敏感信息加密存储(如JWE格式)
2. Session vs JWT 适用场景
  • 选Session的场景
    • 传统单体应用(如银行系统),需严格会话管理
    • 需要实时禁用用户(如管理员踢人)
    • 存储敏感数据(如支付凭证)
  • 选JWT的场景
    • 前后端分离/微服务架构(如React+Node.js)
    • 跨域认证(如单点登录SSO)
    • 移动端API认证(减少服务端压力)

💎 四、总结:技术选型决策树

  1. 是否需要服务端强管控?
    • → 选择 Session(实时管理会话)
    • → 进入下一步
  2. 系统是否分布式?
    • → 选择 JWT(无状态扩展)
    • → 进入下一步
  3. 数据敏感性优先级?
    • → 选择 Session(服务端存储更安全)
    • → 选择 Cookie/简单Token(轻量级场景)

最佳实践:现代系统常组合使用,如:

  • 网关层用JWT做无状态认证 → 内部服务用Session管理业务状态
  • 敏感操作(如支付)用Session → 普通API用JWT

通过以上对比,可依据业务需求在状态管理安全控制架构复杂度间取得平衡。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86374.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86374.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字经济时代科技创业的巨大潜力

2025年3月,42岁的字节跳动创始人张一鸣以655亿美元身家成为中国新首富。这位"80后"企业家白手起家的故事,展现了数字经济时代科技创业的巨大潜力。本文将带您了解张一鸣的成功秘诀,分析网络安全行业的最新趋势,并为计算…

深入剖析Nginx架构及其不同使用场景下的配置

一、Nginx 整体架构概览 1. Nginx简介 Nginx 是采用 C 语言 编写的高性能 Web 服务器、反向代理服务器及邮件代理服务器,特点是:高并发、高可用、低内存占用、模块化设计。 架构核心理念: Master-Worker 多进程模型 事件驱动(…

单元测试详解

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 对于软件测试,我们先按照开发阶段来进行划分,将软件测试分为单元测试、集成测试、系统测试、验收测试,下面我们来聊聊单元测试。…

四款好用的Windows虚拟打印机,文档转PDF

1,Microsoft Print To PDF 2,Foxit Reader PDF Printer 3,Adobe PDF 4,clawPDF 参考文档: https://mp.weixin.qq.com/s/_mt4J2RwhqQE36DRAvc-Rg

《map和set的使用介绍》

引言: 上次我们学习了第一个高阶数据结构—二叉搜索树,趁热打铁,今天我们就再来学习两个数据结构—map和set。 一:序列式容器和关联式容器 前面我们已经接触过STL中的部分容器如:string、vector、list、deque、arra…

PostgreSQL(二十六)分区表管理

目录 一、分区表特点 1、概念: 2、好处: 3、特点: 二、范围分区介绍 1、简介 2、范围分区实验: 三、list分区介绍 1、简介 2、list分区表实验 四、hash分区介绍 1、简介 2、hash分区表实验 五、混合分区介绍 1、简…

概率论中的生日问题,违背直觉?如何计算? 以及从人性金融的角度分析如何违背直觉的?

一、生日问题的概率计算:为何23人就有50%概率撞生日? 1. 问题背景与直觉矛盾 生日问题指:在n个人中,至少有两人生日相同的概率超过50%时,n的最小值是多少? 直觉判断:因一年有365天&#xff0c…

Qt for WebAssembly官方说明文档

链接 Qt for WebAssembly | Qt 5.15

前端自主实现将vue页面转为pdf文件下载

1.vue 转 PDF 在 Vue 项目中将 HTML 页面转换为 PDF 文件是一个常见需求,特别是在需要生成报告或打印页面时。本文将介绍如何使用 html2canvas 和 jspdf 库实现这一功能。 2.安装依赖 首先,我们需要安装两个库:html2canvas 和 jspdf 。可以…

TCP 坚持定时器详解:原理、配置与最佳实践​

一、TCP 坚持定时器基础原理 1.1 坚持定时器的设计目的 TCP 坚持定时器 (TCP Persist Timer) 是 TCP 协议中用于处理接收窗口为零情况的重要机制,其核心设计目的是防止 TCP 连接在窗口更新 ACK 丢失时陷入死锁状态。当 TCP 连接的接收方通告一个窗口大小为 0 的 A…

大厂测开实习和小厂开发实习怎么选

先说选择,这个可以百分百确定选大厂,title很重要。 要想弄清楚那个选择对自己最有利,可以思考下实习的意义是什么? 实习无非就是给简历加分,拿到好offer,高薪offer。 那这就需要思考,简历怎么让…

Unity中的urp和普通的标准渲染管线区别在哪

Unity中的URP(Universal Render Pipeline)与内置标准渲染管线(Built-in Render Pipeline)的区别深刻反映了Unity渲染技术的演进方向。以下从架构、性能、功能、工作流等多个维度进行深度分析: 1. 底层架构与设计哲学 标…

Vscode 编写Markdown支持 plantuml书写

1: 下载PlantUml 插件: 2: 安装java https://www.oracle.com/java/technologies/downloads/ 3: 安装Graphviz https://graphviz.org/download/ 4: 下载plantuml.jar https://plantuml.com/zh/download 5&…

设计模式(C++/Qt)-工厂模式

在软件开发中,对象创建是基础但关键的任务——工厂模式提供了一种优雅的解决方案,让您的代码摆脱硬编码的依赖关系 一、为什么需要工厂模式? 在C/Qt开发中,我们经常面临这样的困境: 对象创建逻辑分散在代码各处新增…

Pydantic 模型

本文将详细介绍 Pydantic 模型 和 BaseModel 的核心概念,并通过实际代码示例如何从零开始编写自己的 Pydantic 模型。 1. Pydantic 是什么? Pydantic 是一个 Python 库,主要用于: 数据验证:确保输入数据符合预期的类…

【Unity智能模型系列】MediaPipeUnityPlugin 实现人脸数据获取

目录 一、MediaPipeUnity 简介 二、MediaPipeUnity 的核心组成 1. Graph 构建系统 2. 解决方案类(Solution) 3. 解释注释Annotation 系统 三、MediaPipeUnity 的典型使用流程 四、典型示例解析 1、案例 Face Detection图形人脸检测 2、案例 Face Detection图形人脸检…

iOS App 上架步骤解析:适合资源有限团队的上架流程与注意事项

对于不少创业型或初创阶段的开发团队来说,人员配置紧凑、设备有限是常态。在这种背景下,完成一次合规、高效的iOS应用发布往往不是技术难点,而是流程协同与资源调配的问题。 我们是一支5人团队,开发一款社交类工具型App&#xff…

Redis雪崩、穿透、击穿原理及解决方案

以下是 Redis 缓存穿透、击穿与雪崩的原理及解决方案的深度解析,结合工业级实践整理: 🔍 ‌一、问题原理与区别‌ ‌问题类型‌‌触发条件‌‌核心特征‌‌危害‌‌缓存穿透‌查询‌不存在的数据‌绕过缓存直击数据库,导致无效查…

DFX 动态重构的概念和实现

DFX 动态重构的概念和实现 背景介绍 本文内容当前仅限于XILINX或者和XILINX具有相同结构的FPGA器件。 FPGA 技术提供了在现场进行编程和重新编程的灵活性,而无需通过重新制造流程来实现设计修改。动态功能交换(Dynamic Function eXchange, DFX&#x…

hutool 导出数据报错:org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException

Excel 导出报错 org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException: Fail to save: an error occurs while saving the package : The part /docProps/core.xml failed to be saved in the stream with marshaller org.apache.poi.openxml4j.opc.internal.marsh…