详细分清Session,Cookie和Token之间的区别,以及JWT是什么东西

news2024/11/15 21:53:46

Cookie

Cookie是一种小型的文本文件,由网站在用户访问时存储在其计算机或移动设备上,Cookie主要用于跟踪、识别和存储有关用户的信息。

简单来说Cookie就是用来存储某些后端发送给前端的数据,例如我们登陆后,后端会返回一个登录凭证,这样子你才能正常执行网站登录之后的功能。

我们的session和token其实就大部分作为一个登录凭证使用

我们Cookie就是来存储类似的这种东西,我们每次在域名内跳转的时候,我们都默认附加这个Cookie请求,这样子我们就可以保存登录状态来操作

例如我是在bilibili这个域名登录的

我点开其他视频的时候,我是在这个域名内跳转

例如这样子,但是我们跳到了不同的界面,我们还是保持登录状态的,这就是Cookie的作用

Cookie可以在域名内跳转的时候保存一些我们想保存的东西,

所以那种保持登录状态和7天免登录就是Cookie的用处。

所以Cookie其实和Session和Token是不同的东西,我们不要搞混了

但是Session和Token是类似的东西,是一种保持登录状态的东西,是一种登录凭证


Session

然后我们来讲讲Session

Session是我们的服务器里面的一个东西,例如我们的小猫咪Tomcat服务器

我们的Session是由我们的服务器生成,然后Session这个东西我们保存到我们的服务器里面,

我们Session会生成一个叫SessionId的东西返回给前端,然后如果我们检测到我们由SessionId这个和东西我们就可以操作我们的服务器里面的Session

例如我们可以往我们的Session里面存东西,像下面那样

看到了这个Context这个东西了吗,这个东西就是可以做上下文的

我们存进上下文的东西是可以全局使用,调用的

这个的意思是,我们用Session来统计,其实不同的浏览器执行时,我们拿到的SeesionId是不同的,所以我就做了个简单的登录统计,我们往这个全局上下文的“olcount”存储,如果session!=null,我们就加1,这个就是简单的往Session的Context上下文里面存的东西逻辑

其实我们也可以直接往session里面存,session.set就行了

例如我们写代码的时候,像调用一些东西,例如我们登录,然后像后面调用它的用户名

我们就Session.set("username","kira"),我们往session里面存了个username的变量,变量的值是kira,然后我们后面写逻辑的时候,想得到我们当前用户的用户名我们直接session.get("username"),就把kira这个用户名给拿出来了

总的来说就是,Session是在我们的服务器生成的,然后我们生成一个SessionId给前端存储到Cookie里,有了SessionId我们就可以操作我们的服务器里面对应的Session以及里面的方法

Seesion是一种服务器自己生成的东西,返回给前端的SeesionId是我们的登录凭证

但其实Session有缺点,如果Seesion过多它会占用服务器的内存,然后Session的很多东西都是服务器生成的,我们这种后端很难灵活地操作和修改,例如它设定这个Seesion的过期时间为10分钟,我们只想让一个Session30分钟过期,其他Seesion保持不变,我们只能直接修改服务器配置改成30分钟,但修改服务器Seesion过期时间配置的话,其他所有的Seesion都会跟着修改过期时间,无法做到某个特例不同


Token

然后我们来讲Token

Token是一种基于加密算法,由后端自己做的一种登录凭证

而Seesion是一种服务器生成的东西,SessionId是服务器生成的登陆凭证

区别在于:一个是服务器规定好生成的,一个是后端自己基于加密算法做好的,我们的操作主体是不同的,一个是服务器,一个是后端

我们可以用UUID来随机生成一个Token,UUID其实也是一种算法,例如我们这样子,生成一个东西来当作Token

我们使用正确的密码成功登录之后,我们用生成的UUID,把它存到我们的Redis里面,设置例如30分钟的过期时间

最重要的一点来了,我们要把这个东西返回给前端

我们一般都是,把这个Token(我是用UUID做的)存到请求头里面,请求头里的参数名是Authorization,把我们的uuid存到这个请求头的变量里面

然后我们在全局拦截器里面弄一个操作逻辑,就是任何请求,我们都要有一个判断就是判断用户是否是登录状态,如果我们的Authorization不为空,且uuid的值和后端里存的uuid可以对上,那么就可以确认这个用户是登录状态的

怎么样?之前我们是用SessionId来找到服务器对应session判断用户是否是登录状态,

现在是我们用Token去找对应的东西是否存在来判断用户是否是登录状态

所以Session和Token其实有很多类似的地方,但是Session里面可能有些操作方法什么的可以调用,不仅仅只有个SessionId作为登录凭证,而Token大部分时间是做登录凭证的,反正我还没了解到Token的其他大用途。


还记得之前提到的Session的一个小问题吗?

修改服务器Seesion过期时间配置的话,其他所有的Seesion都会跟着修改过期时间,无法做到某个特例不同

但是如果我们用Token然后存到我们的Redis里面的这个逻辑的话,我们可以用Redis来给不同的Token来设置过期时间,这样子就可以设置不同的用户的过期时间了是吧?

例如A用户10分钟过期,B用户20分钟过期,C用户30分钟过期

但是如果我们用session的话,我们无法做到这种多个不同的过期时间,我们只能统一所有的session都是一个过期时间,所以Token的优点就在这里。而且Token的话不会像Session那样占用服务器内存,它只是一个小数据,我们存到数据库里面使用,还可以随意设置过期时间。


JWT

jwt其实就是token的另一种实现方式,上面的例子我是用UUID来演示我们的token的,然后存到redis里面设置过期时间

而JWT的话就更加简便了,我就拿黑马课程的这章节来举例子

实战篇-07_JWT令牌_哔哩哔哩_bilibili

里面提供了一个生成jwt的工具类,有特定的算法,和我们的那个uuid的算法不同,下面的就是提供的jwt工具类,它把jwt常用的方法非封装成了工具类

首先我们要引入jwt的依赖

<!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>4.4.0</version>
</dependency>

我们的这个jwt算法生成工具类的话,可以指定生成算法

其中jwt是由这三部分组成的

分别是  Header(头) Payload(有效载荷) Signature(签名)

有效载荷里面可以存储一些自定义信息,我们可以把想要的信息通过jwt工具类加密,变成有效载荷

签名可以防止Token被修改,签名里面有指定我们需要的加密算法,这样子我们拿到后端解析的时候,签名可以解析出对应的算法,然后用对应的算法把我们的token以及token里面的信息成功解析出来

你看下面我们用工具类造token的时候有三个逻辑

 添加信息

添加过期时间

指定我们的加密算法

所以我们就不需要按照我一开始的逻辑那样用Redis来设置我们的过期时间了

因为我们的过期时间的设置可以存到我们的有效载荷里面,然后我们后端的jwt工具类解析token,就可以知道这个token过期没有了,就不用存到我们的Redis里面了

 所以jwt只是一种现在主流的token的实现方式,不过他确实简便然后复杂程度也比我举例子的那个uuid高,所以我们以后用jwt就行了,不用UUID。

但是有一个应用场景,会让我们的jwt的使用出问题,就是我们更新密码的时候,按理来说我们会生成新的token,但是我们旧的token不能自动过期

所以我们要结合redis,把token存到我们的redis中,如果我们修改了密码,我们就手动让旧的token过期,然后让新的token存到redis里面然后生效。

其实我觉得既然要结合redis,那么我们的token没必要在弄的时候就设置过期事件,直接用redis设置过期时间其实也是一种思路,不过其实都一样,redis在这起到的作用就是在更新密码的时候主动过期我们的token。

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

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

相关文章

求正方形阴影部分面积

正方形边长6&#xff0c;求阴影部分面积 xy6① vw6② 1/26v1/23x1/263③ 1/26v1/26y1/266④ ③是左下角三角形的面积&#xff0c;④是左上角三角形的面积。 求解方程组得到x2 阴影部分面积1/2*3x3.

海豚调度器如何看工作流是在哪个worker节点执行

用海豚调度器&#xff0c;执行一个工作流时&#xff0c;有时成功&#xff0c;有时失败&#xff0c;怀疑跟worker节点环境配置不一样有关。要怎样看是在哪个worker节点执行&#xff0c;在 海豚调度器 Web UI 中&#xff0c;您可以查看任务实例&#xff0c;里面有一列显示host&a…

网络安全快速入门(九)MySQL进阶操作

上一章我们了解了对表及库的基本增删查改操作&#xff0c;本章我们针对增删查改内容进行与一些拓展&#xff0c; 9.1字段修饰及数据类型 我们之前在创建表时用到的格式为&#xff1a; create table 表名 ( 字段名1 字段数据类型&#xff08;数据类型长度&#xff09;, 字段名2 …

刷代码随想录有感(65):回溯算法——组合问题

题干&#xff1a; 代码&#xff1a; class Solution { public:vector<vector<int>> res;vector<int> tmp;void backtracking(int n, int k, int start){if(tmp.size() k){res.push_back(tmp);return;}for(int i start; i < n; i){tmp.push_back(i);bac…

[Algorithm][回溯][组合][目标和][组合总和]详细讲解

目录 1.组合1.题目链接2.算法原理详解3.代码实现 2.目标和1.题目链接2.算法原理详解3.代码实现 3.组合总和1.题目链接2.算法原理详解3.代码实现 1.组合 1.题目链接 组合 2.算法原理详解 思路&#xff1a;每次都只选一个数&#xff0c;此后只能选它后面的数函数设计&#xff…

全面提升数据采集效率:亮数据产品的应用与评估详解

全面提升数据采集效率&#xff1a;亮数据产品的应用与评估详解 文章目录 全面提升数据采集效率&#xff1a;亮数据产品的应用与评估详解背景应用场景&#xff1a;平台首页信息抓取准备评测素材详细的产品使用和评测流程产品介绍亮数据的IP代理服务亮数据的爬虫工具及采集技术 注…

elasticsearch使用Ngram实现任意位数手机号搜索

文章目录 Ngram自定义分词案例实战问题拆解 Ngram分词器定义Ngram分词定义Ngram分词示例Ngram分词应用场景 Ngram分词实战 Ngram自定义分词案例 当对keyword类型的字段进行高亮查询时&#xff0c;若值为123asd456&#xff0c;查询sd4&#xff0c;则高亮结果是&#xff1c;em&a…

项目管理-案例重点知识(整合管理)

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 一、整合管理 案例重点 重点内容&#xff1a; &#xff08;1&#xff09;项目章程内容和作用 &#xff08;2&#xff09;项目管理计划…

乡村振兴的农业科技创新:加大农业科技投入,推广农业科技成果,提升农业科技创新水平,推动美丽乡村农业现代化

一、引言 随着全球化和信息化时代的到来&#xff0c;农业作为国民经济的基础&#xff0c;其现代化进程日益受到关注。在乡村振兴战略的大背景下&#xff0c;农业科技创新成为推动乡村经济转型升级、实现农业现代化的关键力量。本文旨在探讨如何通过加大农业科技投入、推广农业…

【PB案例学习笔记】-02 目录浏览器

写在前面 这是PB案例学习笔记系列文章的第二篇&#xff0c;该系列文章适合具有一定PB基础的读者&#xff0c; 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上…

蓝桥杯单片机之模块代码《串口发数据》

过往历程 历程1&#xff1a;秒表 历程2&#xff1a;按键显示时钟 历程3&#xff1a;列矩阵按键显示时钟 历程4&#xff1a;行矩阵按键显示时钟 历程5&#xff1a;新DS1302 历程6&#xff1a;小数点精确后两位ds18b20 历程7&#xff1a;35定时器测量频率 历程8&#xff…

初识鸿蒙之ArkTS基础

前言 学习一种应用程序开发&#xff0c;需要从这种程序的开发语言开始&#xff0c;比如说Android开发从入门到放弃&#xff0c;肯定是从Java基础或者是Kotlin语言基础开始学习的&#xff0c;IOS程序开发也肯定是从object-c开始学习的。鸿蒙软件开发也不例外&#xff0c;如果做…

平衡三进制小数详解与进制转换

标准三进制是“逢三进一&#xff0c;退一还三”的机制&#xff0c;平衡三进制与之类似&#xff0c;但就是偏移了一下变得对称了&#xff0c;平衡三进制与标准三进制可以相互转换&#xff0c;但这样显得有点多余了&#xff0c;所以这里只讲平衡三进制与十进制的转换。 数字系统的…

meshlab: pymeshlab合并多个物体模型并保存(flatten visible layers)

一、关于环境 请参考&#xff1a;pymeshlab遍历文件夹中模型、缩放并导出指定格式-CSDN博客 二、关于代码 本文所给出代码仅为参考&#xff0c;禁止转载和引用&#xff0c;仅供个人学习。 本文所给出的例子是https://download.csdn.net/download/weixin_42605076/89233917中的…

【微记录】dmidecode是干什么的?常用来做什么?如何查看系统支持的PCIe版本号(本质:标准,Desktop Management Interface)

是什么 dmidecode 是一个在 Linux 系统提取硬件信息的命令行工具。DMI 代表桌面管理接口&#xff08;Desktop Management Interface&#xff09;&#xff0c;是一种标准&#xff0c;收集桌面计算机的硬件信息&#xff0c;包括系统制造商、序列号、BIOS 信息、系统资产标签等。…

风电功率预测 | 基于PSO-BP神经网络实现风电功率预测(附matlab完整源码)

风电功率预测 风电功率预测完整代码风电功率预测 基于粒子群优化算法(Particle Swarm Optimization, PSO)的BP神经网络是一种常见的方法,用于实现风电功率预测。下面是一个基于PSO-BP神经网络实现风电功率预测的一般步骤: 数据准备:收集与风电场发电功率相关的数据,包括…

C语言----斐波那契数列(附源代码)

各位看官们好&#xff0c;当我写了上一篇博客杨辉三角后&#xff0c;有一些看官叫我讲一下斐波那契数列。对于这个大家应该是有了解的。最简单的规律就是f(n)f(n-2)f(n-1)。就是当前是前两项之和&#xff0c;然后下标1和0都是1.从第三项开始计算的。那么我们知道规律&#xff0…

旧衣服回收小程序:探索旧衣回收市场的创新发展

每年我国就有将近800万吨旧衣服&#xff0c;在生活水平的日益提高下&#xff0c;这个数字也在逐渐增加。目前&#xff0c;我国旧衣回收的产业链也在完善中&#xff0c;旧衣服出口贸易逐年增加&#xff0c;市场发展空间不断扩大。此外&#xff0c;旧衣回收市场投入低、风险小、利…

SystemC学习使用记录

一、概述 对于复杂的片上系统&#xff0c;在进行RTL编码前&#xff0c;需进行深入的系统级仿真&#xff0c;以确认设计的体系结构是否恰当、总线是否能满足吞吐量和实现性要求以及存储器是否浪费&#xff0c;所进行的这些仿真要求在芯片的仿真模型上运行大量的软件&#xff0c…

PLL-分频器

概念 分频器的性能一般用四个参数来规定:(1)分频比&#xff0c;(2)最大允许输入频率fmax&#xff0c;(3)功耗&#xff0c;(4)最小允许输入电压摆幅(也叫“灵敏度”)。虽然分频器的相位噪声也很重要&#xff0c;但在大多数情况下它可以忽略不计。 把一般分频器的输入灵敏度画成…