详细分清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,一经查实,立即删除!

相关文章

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如何以管理员身份运行

刷题之字母异位词(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;分类的原因…

第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;使其更加灵活、易于管理…

【教学类-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比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

9个优质免费视频素材网站推荐丨2024年最新资源合集

在短视频火爆的时代&#xff0c;高清、无水印、可商用的视频素材变得尤为重要。下面是我精心整理的9个常用免费视频素材网站&#xff0c;适合各类视频创作者。希望你能找到满意的素材&#xff01; 一、视频素材 1. 蛙学府 优点&#xff1a;丰富的正版商用素材&#xff0c;涵盖…

AI 绘画神器 Fooocus 高级用法:设置、风格、模型、高级设置

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 本文精选了一系列高级技巧和细致调整&#xff0c;旨在提升 Fooocus 用户在利用 Stable Diffusion 模型进行图像生成时的…

vue使用marked和highlight.js实现代码高亮效果

marked是对markdown进行解析的插件&#xff0c;它可以把markdown语法解析成html语法&#xff0c;从而实现页面效果&#xff0c;而highlight.js是对解析出的代码实现高亮效果 效果&#xff1a; 安装&#xff1a;避免踩我走的坑&#xff0c;安装尽量按照这个版本安装 npm install…

Linux进程——进程地址空间

前言&#xff1a;在讲完环境变量后&#xff0c;相信大家对Linux有更进一步的认识&#xff0c;而Linux进程概念到这也快接近尾声了&#xff0c;现在我们了解Linux进程中的地址空间&#xff01; 本篇主要内容&#xff1a; 了解程序地址空间 理解进程地址空间 探究页表和虚拟地址空…

matlab使用教程(71)—控制坐标区布局

1.与位置相关的属性和函数 有几个属性和函数可用于获取和设置坐标区的大小与位置。下表摘要显示了这些属性和函数。 函数或属性描述 OuterPosition 属性 使用此属性可以查询或更改坐标区的外边界&#xff0c;包括标题、标签和边距。要更改外边界&#xff0c;请将此属性指定为…

MySQL、JDBC复盘及规划

数据库仍有习题尚未做完&#xff0c;策略从一天做完改为每天5到10题&#xff0c;以此达到掌握和复习的效果&#xff0c;JDBC的六部仍需每天练习&#xff0c;从明天开始正式进行JavaWeb的学习&#xff0c;预计持续到七月中旬&#xff0c;还会完成一个书城项目&#xff0c;六月底…