一文搞懂cookie,session,token,JWT到底是怎么进行验证的???

文章目录

    • cookie
    • session
    • token
      • JWT
    • 比较

HTTP 协议是一种无状态协议,每次服务端接收到客户端的请求时,都是一个全新且独立请求,这样就无法获取历史请求的记录,为了解决这种机制,让某个域名下的所有网页能够共享某些数据,就引出了cookie和session。

cookie

Cookie是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下一次向同一服务器再发起请求时被携带并发送到服务器上,服务器通过读取 Cookie 信息,就可以判断该请求来自哪个客户端以及其他的信息。由于他是存储在客户端的,所以很容易被查看和修改,不是很安全,于是引入了session。

  1. 客户端发送请求
  2. 服务端返回响应,并在请求头中添加cookie
  3. 之后客户端再请求时,携带cookie
  4. 服务端验证cookie并响应

session

Session是一种在服务器端存储用户状态的机制。与Cookie不同,Session数据存储在服务器上,而不是客户端。

一般情况下cookie和session都是一起使用:

  1. 客户端发送请求
  2. 服务端创建一个session,并再返回响应时把sessionid添加到请求头中的cookie中。
  3. 客户端发送其他请求时,携带cookie,服务端用它包含的sessionid找到session
  4. 服务端验证session后响应

session 是基于 cookie 实现的,在set_cookie时添加了sessionid(一段没有规律的乱码),所以即使客户端的cookie泄露了也不会被理解,所以就更加安全。

但是,这样又会很占用服务器的资源,但同时有很多人需要验证的时候,需要服务端一个一个根据传过来的sessionid到数据库验证。

如果使用集群部署的话,如果在创建session是在A服务器,但是下一次由于负载均衡可能就到另一台服务器了。

token

Token是一种安全机制,通常用于API的身份验证和访问控制。Token通常是一个加密的字符串,代表用户的身份和权限。

JWT就是token的一种实现方式,并且基本是java web领域的事实标准。JWT全称是JSON Web Token。基本可以看出是使用JSON格式传输token。

JWT

JWT的根本其实就是进行签名,把信息通过一种加密方法(密钥)得到加密过后的签名,把原信息和加密过后的签名一起发送给客户端,当客户端再次访问的时候携带它们,服务端只需要通过自身拥有的密钥验证一下信息是否被篡改。如果客户端发送的信息通过密钥得到的签名与服务端自身保存的签名不一致说明信息被篡改了。

在这里插入图片描述

JWT实际上就是一段经过base64编码(非加密)过后的字符串,由三部分组成:

  • 头部(Header):包含了签名算法和类型,用于指定如何对有效载荷进行编码和签名
  • 载荷(Payload):包含了用户的身份信息和其他自定义数据
  • 签名(Signature):是对标头和有效载荷进行签名后得到的值,用于验证token的完整性和真实性

把Header.Payload通过一种密钥加密后生成签名,签名在经过base64编码生成的Signature。将三者用点号相连并返回给客户端,密钥永远不会传递给客户端,密钥只保存在服务端。客户端在访问时携带JWT,JWT包含的这三部分,可以通过密钥判断信息是否被篡改和伪造。

其实你会发现JWT整个过程中不涉及加密,不过就是经过了base64编码,可以被轻松的解码,所以其实整个过程就是明文传输,在使用JET的时候不应该传输密码这样的重要的信息。

在这里插入图片描述

  1. 客户端发送登录请求
  2. 服务端生成Token,包含用户的信息,返回响应时将Token作为相应的一部分
  3. 当用户再次访问时,在请求Authorization头部中包含这个Token
  4. 服务器验证Token并响应

比较

CookieSessionToken
存储位置客户端服务器端客户端
生命周期根据设置,可长可短通常与用户会话相关,会话结束时失效可设置过期时间,过期后需重新认证
安全性较低,可被客户端脚本访问较高,数据存储在服务器端依赖于签名和加密算法,但需注意保护密钥
传输方式每次HTTP请求自动发送仅在用户登录时创建,后续请求通过Session ID引用每次请求需显式携带
性能影响频繁读写可能影响性能服务器端存储大量会话可能影响性能无状态,性能影响较小,但需考虑Token解析和验证
跨域支持受同源策略限制通常不支持跨域支持跨域,但需确保安全传输(如使用HTTPS)
适用场景适合小型会话数据和个性化设置适合需要服务器跟踪用户状态的场景适合无状态应用、API认证和跨域请求
防篡改能力较弱,易受XSS和CSRF攻击较强,因为数据不在客户端通过签名算法提供较强的防篡改能力
优点跨页面共享信息 - 用户体验好,无需重复登录- 信息安全,存储在服务器端 - 适合保持状态 - 适合分布式部署- 无状态,适合RESTful API - 跨域请求支持 - 用户信息存储在Token中,减轻服务器压力 - 支持自定义负载和声明
缺点- 安全性较低,易受攻击(如CSRF、XSS) - 隐私泄露风险 - 可能影响性能,尤其是大量小文件传输- 会占用服务器资源 - 分布式部署时存在问题,需要额外机制如Redis共享Session- 密钥管理复杂,一旦泄露可能导致安全问题 - 过期后需要重新认证,可能导致用户体验下降 - 需要服务器和客户端的配合,配置不当可能导致安全问题

若有错误与不足请指出,关注DPT一起进步吧!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DFS:深搜+回溯+剪枝解决组合问题

创作不易,感谢支持!!! 一、电话号码的组合 . - 力扣(LeetCode) class Solution { public:string hash[10]{"","","abc","def","ghi","jkl","mno","pqrs"…

salesforce如何批量reassign审批人

salesforce的审批流程中,如果希望批量将审批人重新指派,可以在set up 中找到Mass Transfer Approval Processes选项进行reassign。 参考:https://trailhead.salesforce.com/zh-CN/trailblazer-community/feed/0D54S00000A7QNLSA3 还可以用a…

30.多个线程交替执行

线程一输出a,5次; 线程二输出b,5次; 线程三输出c,5次; 现在要求输出abcabcabcabcabc怎么实现? 采用wait和notifyAll实现 public class ThreadTest {public static void main(String[] args) {WaitNotify waitNotify new Wai…

Linux------一篇博客了解Linux最常用的指令

🎈个人主页:靓仔很忙i 💻B 站主页:👉B站👈 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:Linux 🤝希望本文对您有所裨益,如有不足之处&#…

LInux脚本学习

1.注释 #单行注释 以 # 字符开头就是单行注释 当然第一行除外,比较特殊 2.多行注释 3.Shell文件的作用 Shell文件就是linux命令集 4.sh脚本的执行方式 bash xxx.sh 5.新建的文件会没有执行权限 #为文件赋予执行权限 chmod ux xxx.sh 6.编写规范 #!/bin/bash #…

C#,简单,精巧,实用的按类型删除指定文件的工具软件

点击下载本文软件(积分): https://download.csdn.net/download/beijinghorn/89059141https://download.csdn.net/download/beijinghorn/89059141 下载审核通过之前,请从百度网盘下载(无积分):…

Canvas背景绘制-24

本节会详细介绍下,如何绘制面板的背景。 概述 常用的技术称为图块复制(blitting),即从离屏缓冲区中将内容发生变化的那部分背景图像复制到屏幕上,还有其它两种方法是将所有内容擦除并重新绘制&仅重绘内容发生变化的那部分区域。一般是用…

解决Vue中仓库持久化的问题,不借助插件用原生JS实现仓库持久化。了解仓库的插件机制、监听的时机

1、演示 前言:目前Vue有两种仓库,一种是Vuex,一种是Pinia,懂得都懂,这里就不详细介绍这两者的区别了 2、什么是持久化 仓库里面的数据是需要跨越页面周期的,当页面刷新之后数据还在,在默认情况下…

PHP在线加密系统网站源码

源码介绍 PHP在线加密系统网站源码,这个是sg的加密,免费可用(目前)并不会收费 源码说明:下载直接上传即可 下载地址 蓝奏云下载:https://wfr.lanzout.com/i6c331togiji

MySQL 索引底层探索:为什么是B+树?

MySQL 索引底层探索:为什么是B树? 1. 由一个例子总结索引的特点2. 基于哈希表实现的哈希索引3. 高效的查找方式:二分查找4. 基于二分查找思想的二叉查找树5. 升级版的BST树:AVL 树6. 更加符合磁盘特征的B树7. 不断优化的B树&#…

常见的四种限流算法及基础实现

常见的四种限流算法及基础实现 什么是限流有哪些限流算法?限流算法固定窗口滑动窗口漏桶算法令牌算法 什么是限流 限流是对某一时间窗口内的请求数进行限制,保持系统的可用性和稳定性,防止因流量暴增而导致的系统运行缓慢或宕机。 在高并发…

基于SpringBoot+uniapp的同城活动报名系统开发找搭子软件

项目背景 随着移动互联网的飞速发展,人们的社交方式也在不断变化。在这个大背景下,同城活动报名系统应运而生,成为了连接人与人、活动与人之间的桥梁,深受广大年轻人的喜爱。在这个充满机遇与挑战的时代,同城活动报名…

GDPU 竞赛技能实践 天码行空6

📖 敌兵布阵 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段,所以每个工…

Flume 拦截器概念及自定义拦截器的运用

文章目录 Flume 拦截器拦截器的作用拦截器运用1.创建项目2.实现拦截器接口3.编写事件处理逻辑4.拦截器构建5.打包与上传6.编写配置文件7.测试运行 Flume 拦截器 在 Flume 中,拦截器(Interceptors)是一种可以在事件传输过程中拦截、处理和修改…

Linux网络协议栈从应用层到内核层④

文章目录 1、网卡接受数据2、网络设备层接收数据3、ip层接受数据4、tcp层接受数据5、上层应用读取数据6、数据从网卡到应用层的整体流程 1、网卡接受数据 当网卡收到数据时,会触发一个中断,然后就会调用对应的中断处理函数,再做进一步处理。…

python相对路径导包与绝对路径导包的正确方式

【python相对路径导包与绝对路径导包的正确方式】 python相对路径导包与绝对路径导包的正确方式_哔哩哔哩_bilibilipython导包的难题,今天解决了,相对路径导包和绝对路径导包,均可以!!!, 视频播放量 5、弹…

如何(关闭)断开 Websocket 连接:简单易懂的实现指南

WebSocket 协议提供了一条用于 Web 应用程序中双向通讯的高效通道,让服务器能够实时地向客户端发送信息,而无需客户端每次都发起请求。本文旨在探讨有关结束 WebSocket 连接的适当时机,内容包括协议的基础知识、如何结束连接、一些使用场景&a…

maven本地仓库设置

1、背景 我们在本地安装好maven后,java环境也安装好了以后,运行java项目A,我希望把项目A所有的依赖安装在我电脑中的a文件夹下,项目B安装在我电脑的b文件夹下。 2、解决 需要在 maven 文件中找到 conf 文件夹下的 settings.xml 文件进行修…

Unity | Shader基础知识(第十一集:什么是Normal Map法线贴图)

目录 前言 一、图片是否有法线贴图的视觉区别 二、有视觉区别的原因 三、法线贴图的作用 四、信息是如何存进去的 五、自己写一个Shader用到法线贴图 六、注意事项 七、作者的话 前言 本小节会给大家解释,什么是法线贴图?为什么法线贴图会产生深…

SpringBoot -- 外部化配置

我们如果要对普通程序的jar包更改配置,那么我们需要对jar包解压,并在其中的配置文件中更改配置参数,然后再打包并重新运行。可以看到过程比较繁琐,SpringBoot也注意到了这个问题,其可以通过外部配置文件更新配置。 我…