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

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.mzph.cn/diannao/12812.shtml

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

相关文章

Vue3 + Avue中 Header slot写法

avue示例 <template><avue-crud ref"crud":option"option":data"data"><template #name-header"{column}"><el-tag>{{(column || {}).label}}-{{(column || {}).prop}}</el-tag></template><…

02、网络协议、IP地址、网络状况、网络异质性问题的解决

声明&#xff1a;本教程不收取任何费用&#xff0c;欢迎转载&#xff0c;尊重作者劳动成果&#xff0c;不得用于商业用途&#xff0c;侵权必究&#xff01;&#xff01;&#xff01; 目录 前言 一、IP地址 二、网络协议 三、网络状况【了解】 四、网络异质性问题的解决 前…

C++ requires关键字简介

requires 是 C20 中引入的一个新关键字&#xff0c;用于在函数模板或类模板中声明所需的一组语义要求&#xff0c;它可以用来限制模板参数&#xff0c;类似于 typename 和 class 关键字。 requires关键字常与type_traits头文件下类型检查函数匹配使用&#xff0c;当requires后…

激光雷达技术:科技之眼,照亮前行

在科技与人文关怀的交响乐章中&#xff0c;一项名为“蝙蝠避障”使用了激光雷达技术原理及应用的创新成果&#xff0c;正悄然改变着视障朋友们的生活方式&#xff0c;为他们的日常出行铺设了一条充满希望的光明之路。今天&#xff0c;让我们一起深入探讨这项技术如何成为盲人出…

深化市场布局与产业链整合,三清互联以创新为公司发展赋能

近年来&#xff0c;我国大力发展现代化电力体系&#xff0c;并不断推进智能电网的发展&#xff0c;电力物联网作为支撑电力行业数字化发展的关键基础设施&#xff0c;迎来了快速发展黄金时期。作为电力物联网领域领先企业之一&#xff0c;三清互联凭借敏锐的市场洞察力和技术创…

探索软件测试中的创新测试方法:测试左移

软件测试中的测试左移方法 在当今竞争激烈的市场中&#xff0c;满足客户的期望和需求是所有公司在竞争中成为市场领导者的关键。这就是为什么越来越多的公司现在转向测试左移&#xff0c;并将其应用于产品开发过程。 在本文中&#xff0c;我们将从初学者的角度来介绍测试左移…

cmd如何以管理员身份运行

打开开始菜单。 在搜索框中输入cmd。 在搜索结果中&#xff0c;找到cmd&#xff0c;右键单击&#xff0c;选择“以管理员身份运行”。 参考&#xff1a; cmd如何以管理员身份运行

2024最新大厂C++面试真题合集,大厂面试百日冲刺 bay10

字节后端 什么叫进程&#xff1f;什么叫线程&#xff1f;他俩有什么区别和联系&#xff1f; 进程是操作系统进行资源分配和调度的基本单位&#xff0c;是一个程序关于某数据集合上的一次运行活动&#xff0c;是系统进行资源分配和调度的独立单位。 线程是进程的一个执行流&am…

刷题之字母异位词(leetcode 哈希表)

https://leetcode.cn/problems/group-anagrams/ class Solution { public:vector<vector<string>> groupAnagrams(vector<string>& strs) {unordered_map<string,vector<string>>map;//哈希表键为排序后或者处理后的字符串&#xff0c;值为某…

(1)医疗图像处理:MRI磁共振成像-基本原理--(杨正汉

一、基本原理 1.组成 对应了解 1&#xff09;主磁体&#xff1a; 基本构建&#xff0c;用于产生磁场&#xff0c;主要有两种方式产生磁场永磁&#xff08;磁铁&#xff09;、电磁&#xff08;给线圈通电&#xff09;。MR按主磁场的场强分类主要有四类&#xff0c;分类的原因…

5.14学习总结

java聊天室项目 分片上传 将大文件切分为多个小的数据块&#xff08;通常大小为1MB~10MB&#xff09;&#xff0c;然后将这些小数据块分别上传至服务器&#xff0c;最后由服务器将这些小块组合成完整的文件。这种方式可以避免由于网络中断或超时而导致上传失败&#xff0c;并…

【PMP练习题】

PMP练习题 PMP练习题 PMP练习题 2、 [单选] 由于缺乏资金&#xff0c;一个项目在启动阶段被终止&#xff0c;项目经理必须对项目收尾。项目经理首先应该做什么&#xff1f; Due to lack of funding, a project is terminated during its initiation phase and the project man…

第83天: 代码审计-PHP 项目RCE 安全调试追踪代码执行命令执行

案例一&#xff1a;CNVD拿1day-RCE命令执行-百家CMS 这里用代码审计系统搜索system&#xff0c;可以利用的是第一种 打开看细节 查找函数引用 查找$_file第一次出现的地方 这个时候就明白了&#xff0c;必须上传文件&#xff0c;然后利用文件名&#xff0c;去执行system命令 …

Java项目:基于ssm框架实现的房屋租售网站管理系统(房屋租赁和房屋出售一体)(B/S架构+源码+数据库+毕业论文+开题+任务书)

一、项目简介 本项目是一套基于ssm框架实现的房屋租售网站管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、…

Hadoop Java API操作 及读取序列化文件(04-05-06)

针对于04-05-06班级整合。 1.创建java项目 2.修改pom.xml文件 添加依赖 <dependencies><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>3.1.4</version></dependenc…

【Linux网络编程】IO多路转接之poll

poll 1.poll初始2.poll函数接口3.poll服务器4.poll的优点缺点 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.poll初始 poll也是一种linux…

Unity设计模式之工厂模式

什么是工厂模式&#xff1f; 工厂是一种创建型设计模式。通俗来讲就是提供一种封装对象创建的方式&#xff0c;将对象的创建和使用区分开。就是Unity里面通常用到的创建和管理对象。 工厂模式有什么优点&#xff1f; 1、封装对象的创建方式&#xff0c;使其更加灵活、易于管理…

vue elementui时间选择器返回的时间转成年月日-格式

关键点&#xff1a;value-format“yyyy-MM-dd” <template><el-date-pickerv-model"date"type"date"placeholder"选择日期"format"yyyy-MM-dd"value-format"yyyy-MM-dd"></el-date-picker> </template…

【教学类-55-04】20240515图层顺序挑战(四格长条纸加黑色边框、4*4、7张,不重复5400张,16坐标点颜色哈希值去重、保留7色)

背景需求&#xff1a; 前文实现了7张色彩纸条加上黑色边框的需求。 【教学类-55-02】20240512图层顺序挑战&#xff08;四格长条纸加黑色边框、4*4、7张 、43200张去掉非7色有23040张&#xff0c;哈希算法快速去重剩余1221张&#xff09;-CSDN博客文章浏览阅读1k次&#xff0…

GPT-4o模型介绍和使用方法

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…