大模型中常说的Token到底是什么?和Cookie和Session有什么区别?一文讲清

什么是Token(令牌)

Acesss Token是访问资源接口(API)时所需要的资源凭证

简单token的组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token的前几位以哈希算法压缩成的一定长度的十六进制字符串)

特点:

  • 服务端无状态化、可扩展性好
  • 支持移动端设备
  • 安全
  • 支持跨程序调用

token的身份验证流程:

  1. 客户端使用用户名跟密码请求登录
  2. 服务端收到请求,去验证用户名与密码
  3. 验证成功后,服务端会签发一个token并把这个token发送给客户端
  4. 客户端收到token以后,会把它存储起来,比如放在cookie里或者localStorage里
  5. 客户端每次向服务端请求资源的时候需要带着服务端签发的token
  6. 服务端收到请求,然后去验证客户端请求里面带着的token,如果验证成功,就向客户端返回请求的数据

每一次请求都需要携带token,需要把token放到HTTP的Header里。基于token的用户认证是一种服务端无状态的认证方式,服务端不用存放token数据。用解析token的计算时间换取session的存储空间,从而减轻服务器的压力,减少频繁的查询数据库。

另外还有一种token——refresh token,它是专用于刷新access token的token。如果没有refresh token,也可以刷新access token,但每次刷新都要用户输入登录用户名与密码,会很麻烦。有了refresh token,可以减少这个麻烦,客户端直接用refresh token去更新access token,无需用户进行额外的操作。Access Token的有效期比较短,当Acesss Token由于过期而失效时,使用Refresh Token就可以获取到新的Token,如果Refresh Token也失效了,用户就只能重新登录了。Refresh Token及过期时间是存储在服务器的数据库中,只有在申请新的Acesss Token时才会验证,不会对业务接口响应时间造成影响,也不需要向Session一样一直保持在内存中以应对大量的请求。

举个例子简单理解一下:

假设你去健身房锻炼:

Access Token 就像健身房的「单次门禁卡」,有效期1小时(短期有效)。有了它,你能进入健身房使用各种器材。

Refresh Token 就像「补办门禁卡的凭证」,有效期30天(长期有效)。当「单次门禁卡」过期后,你不用重新办卡(不用重新输入账号密码登录),直接用这个凭证就能免费换一张新的「单次门禁卡」。你第一次去健身房(首次登录),前台对你的身份(验证账号密码),给你一张「单次门禁卡」(Access Token)和一张「补办凭证」(Refresh Token)。而1小时后「单次门禁卡」过期了(Access Token失效):你不用再去前台重新登记(不用重新登录),直接出示「补办凭证」(Refresh Token),前台就会给你一张新的「单次门禁卡」(新的Access Token)。30天后「补办凭证」也过期了(Refresh Token失效):这时你必须重新去前台登记(重新登录),才能拿到新的「门禁卡」和「补办凭证」。

为什么需要这样设计?

  • 如果只有Access Token且有效期很长:一旦被盗,别人可以长期冒用你的身份(不安全)。
  • 如果只有短期的Access Token且没有Refresh Token:过期后需要频繁重新登录(体验差)。
  • 有了Refresh Token:既保证了安全性(Access Token短期有效),又兼顾了便利性(不用频繁登录)。

Token和Cookie的区别

Cookie和Token虽然都能用于身份验证,但两者的设计逻辑和适用场景差异显著。Cookie 是互联网早期的产物,存在一些历史遗留问题,而Token更能适应现代Web开发的复杂需求,因此两者并非替代关系,而是根据场景互补使用。

Cookie是HTTP协议自带的状态传递工具,由浏览器自动存储和发送,默认与特定域名绑定,存在跨域限制,且容易因自动发送的特性带来CSRF等安全风险,存储容量也被限制在4KB左右,更适合简单的本地状态存储(如用户偏好)。而Token是服务器生成的加密令牌,完全由开发者控制存储位置(如localStorage、内存)和发送方式(如请求头),不受跨域限制,也不会被浏览器自动携带,能避免Cookie的默认行为带来的安全隐患,且可承载更多信息,更适合前后端分离、跨域API调用、移动端应用等场景。

Token和Session的区别

首先理解一下什么是Session:Session 是一种让服务器能够记录客户端(比如浏览器)会话状态的机制。当用户第一次访问服务器时,服务器会为这个用户创建一个独特的 Session,里面可以存储一些和该用户相关的信息,比如登录状态、购物车内容等。同时,服务器会生成一个对应的 SessionID,并通过 Cookie 等方式发送给客户端。之后,客户端每次向服务器发送请求时,都会带上这个 SessionID。服务器通过识别 SessionID,就能找到对应的 Session,从而知道这是哪个用户的请求,以及该用户之前的会话状态,这样就实现了服务端的“有状态”交互。

举个例子,你登录一个购物网站后,添加商品到购物车,这些操作记录会被保存在服务器为你创建的 Session 里。当你刷新页面或跳转到其他页面时,浏览器会自动带上 SessionID,服务器通过它找到你的 Session,所以购物车里的商品不会消失,这就是 Session 在起作用。不过,Session 是存储在服务器端的,这意味着如果服务器集群部署,需要考虑 Session 共享的问题,否则用户切换到集群中的其他服务器时,可能会因为找不到对应的 Session 而需要重新登录。

因而,Session是服务器用来记录和客户端之间会话状态的一种机制,它能让服务器处于有状态化,也就是能记住会话中的各种信息。而Token是一种令牌,是访问资源接口(API)时必须有的资源凭证,它能让服务器处于无状态的状态,不会去存储会话方面的信息。

Session和Token并不是相互冲突的。作为身份认证的方式,Token的安全性比Session更好,因为每一个请求都会带有签名,能够防止被监听以及重放攻击,而Session则必须依靠链路层来保证通讯的安全。如果需要实现有状态的会话,还是可以增加Session在服务器端保存一些状态信息。

所谓的Session认证,其实就是简单地把用户信息存储到Session里,由于SessionID难以预测,所以暂时可以认为它是安全的。而Token,如果指的是OAuth Token或者类似的机制,它能提供认证和授权功能,认证是针对用户的,授权是针对应用程序的。它的目的是让某个应用程序有权限访问某个用户的信息。这里的Token是唯一的,不能转移到其他应用程序上,也不能转到其他用户那里。Session只提供一种简单的认证,只要有了这个SessionID,就会被认为拥有该用户的全部权限。SessionID需要严格保密,只能保存在网站自己这边,不应该共享给其他网站或者第三方应用程序。所以简单来说,如果用户数据可能需要和第三方共享,或者允许第三方调用API接口,那就用Token。如果始终只是自己的网站、自己的应用程序,用哪种都没什么关系。

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

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

相关文章

RAGFlow:检索增强生成技术的高效实现与深度探索

在当今信息爆炸的时代,如何从海量的数据中快速、准确地获取并利用有价值的信息,成为了众多领域面临的关键挑战。检索增强生成(Retrieval-Augmented Generation, RAG)技术应运而生,它将信息检索与大型语言模型&#xff…

【轨物洞见】光伏逆变器数据:分布式电站价值回归的“第一块多米诺骨牌”

1. 逆变器:光伏电站的核心“数据心脏” 逆变器是将光伏组件产生的直流电转换为交流电的关键设备,其性能直接影响着整个电站的效率与稳定性。对其电压、电流、功率参数以及故障告警信息进行远程数据采集,是实现精细化运维和预测性维护的起点。…

如何在 npm 上发布 Element Plus 二次封装组件

在一次开发中,小李接到一个重要的任务:将 Element Plus 中的时间组件根据团队的独特需求进行二次封装。他灵机一动,决定将这个自定义组件打包成一个 npm 包,以便团队的其他小伙伴们可以快速、方便地使用。接下来,让我们…

vue2使用v-viewer图片预览:打开页面自动预览,禁止关闭预览,解决在微信浏览器的页面点击事件老是触发预览初始化的问题

1、安装: npm install v-viewer viewerjs2、在 main.js 中全局注册: import Viewer from v-viewer; import viewerjs/dist/viewer.css; Vue.use(Viewer ); //配置项(可选,根据需求调整) // Vue.use(Viewer, { // d…

开源 Arkts 鸿蒙应用 开发(八)多媒体--相册和相机

文章的目的为了记录使用Arkts 进行Harmony app 开发学习的经历。本职为嵌入式软件开发,公司安排开发app,临时学习,完成app的开发。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。 相关链接: 开源 Arkts …

无线通信资源分配相关算法

1.Maximum Clique First (MCF)是一种启发式图着色算法(heuristic graph coloring algorithm),它的核心思想是:优先为图中最大团(maximum clique)中的顶点分配不同的颜色,然后再依次为其他顶点上…

Kafka监控体系搭建:基于Prometheus+JMX+Grafana的全方位性能观测方案

为什么需要Kafka监控监控架构概述步骤一:部署JMX Exporter 1.1 下载JMX Agent1.2 创建指标暴露配置 步骤二:配置Kafka集成JMX 2.1 启动参数配置2.2 验证指标暴露 步骤三:配置Prometheus采集 3.1 修改Prometheus配置3.2 验证数据采集 步骤四&a…

stack 和 queue

目录 一、stack 1.1 stack 的介绍 1.2 stack的使用 1)最小栈 2)栈的弹出压入序列 3)逆波兰表达式求值 1.3 stack 的模拟使用 二、queue 2.1 queue的介绍 2.2 queue的使用 2.3 queue的模拟使用 三、容器适配器 3.1 什么是容器适配…

sqlsuger 子表获取主表中的一个字段的写法

在使用 SQL 语言进行数据库操作时,如果你想要从子表获取数据,同时关联到主表中的一个字段,通常我们会使用 SQL 的 JOIN 语句。JOIN 语句允许你通过一个或多个共同的字段将两个或多个表连接起来。这里我将展示几种常见的 JOIN 类型&#xff08…

Docker配置Gitlab-runner实现自动化容器化部署前端项目

叠甲前言 本文仅作为个人学习GitLab的CI/CD功能记录,不适合作为专业性指导,如有纰漏,烦请君指正。 云主机注册Gitlab Runner 自动化构建部署的弊端 在前一文中,我们在Linux云主机上注册了Gitlab-runner, 每次在gitlab流水线上发…

MySQL介绍和MySQL包安装

文章目录MySQL介绍和安装1.MySQL介绍1.1 MySQL 的定义1.2 MySQL 的特点1.3 MySQL 的应用领域1.4 MySQL 的存储引擎1.5 MySQL 的架构1.6 MySQL 的优势和局限性1.7 MySQL 的未来发展趋势2.MySQL安装2.1 主机初始化2.1.1 设置网卡名2.1.2 设置ip地址2.1.3 配置镜像源2.1.4 关闭防火…

J2EE模式---视图助手模式

视图助手模式基础概念视图助手模式(View Helper Pattern)是一种结构型设计模式,其核心思想是将视图层中复杂的逻辑提取到独立的助手类中,使视图代码更加简洁、易于维护。视图助手通常提供一系列工具方法,用于处理格式化…

开源的语音合成大模型-Cosyvoice使用介绍

1 模型概览 CosyVoice 是由阿里巴巴达摩院通义实验室开发的新一代生成式语音合成大模型系列,其核心目标是通过大模型技术深度融合文本理解与语音生成,实现高度拟人化的语音合成体验。该系列包含初代 CosyVoice 及其升级版 CosyVoice 2.0,两者…

深度学习·CLIP

CLIP 数据大小 4亿个文本-图像对,而且是高质量的 预训练方法 Text encoder“The text sequence is bracketed with [SOS] and [EOS] tokens and the activations of the highest layer of the transformer at the [EOS] token are used as the feature representati…

美光MTFC8GAKAJCN-4M_IT型eMMC应用介绍

1.1 芯片订购信息美光MTFC8GAKAJCN-4M_IT型eMMC,容量8GB,153-ball VFBGA封装。1.2 eMMC料号含义2.1 特性•多媒体卡(MMC)控制器和NAND闪存•153球FBGA封装(符合RoHS标准,环保封装)•VCC&#xf…

面向对象分析与设计40讲(6)设计原则之开闭原则

文章目录 一、概念 二、示例(C++ 实现) 1. 违反开闭原则的示例 2. 遵循开闭原则的示例 一、概念 开闭原则(Open-Closed Principle,OCP)是面向对象设计中的重要原则,由 Bertrand Meyer 提出,核心思想可以概括为:对扩展开放,对修改关闭。 具体来说,一个软件实体(如类…

[Linux入门] Linux 网络设置入门:从查看、测试到配置全攻略

目录 一、查看网络信息&#xff1a;了解你的网络状态 1️⃣核心工具&#xff1a;ip命令&#xff08;替代ifconfig&#xff09; <1> 基本语法&#xff1a; <2> 实用操作示例&#xff1a; 2️⃣查看路由表&#xff1a;route命令 3️⃣查看网络连接状态&#xf…

TyFlow:三维领域的粒子特效革命者

在动态模拟与视觉特效领域&#xff0c;​​TyFlow​​ 作为 3ds Max 中诞生的一款革命性粒子系统插件&#xff08;后来也支持独立开发&#xff09;&#xff0c;正在彻底改变艺术家们创作复杂动力学效果的方式。它以其无与伦比的灵活性、强大的计算能力和开创性的技术理念&#…

本地一键部署 Spark-TTS,支持Mac和Windows

Spark-TTS是一个文本转语音(TTS)的项目&#xff0c;零样本语音克隆逼真&#xff0c;多语言支持&#xff0c;语音参数可控。使用魔当(LM Downloader)&#xff0c;可以实现Spark-TTS的本地一键部署。 注意 如果使用Windows&#xff0c;推荐用NVIDIA显卡&#xff0c;生成速度较快…

传统时间:Date日期类,SimpleDateFormat,Calendar

目录DateSimpleDateFormatCalendarDate 代表的是日期和时间 常见构造器和方法&#xff1a; 构造器说明public Date()创建一个Date对象&#xff0c;代表的是系统当前此刻日期时间public Date(long time)把时间毫秒值转换成Date日期对象 常见方法说明public long getTime()返…