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

news2024/10/9 6:25:25

文章目录

    • 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一起进步吧!!!

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

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

相关文章

openlayers 入门教程(九):overlay 篇

还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,ech…

云原生技术精选:探索腾讯云容器与函数计算的最佳实践

文章目录 写在前面《2023腾讯云容器和函数计算技术实践精选集》深度解读案例集特色:腾讯云的创新实践与技术突破精选案例分析——Stable Diffusion云原生部署的最佳实践精选集实用建议分享总结 写在前面 在数字化转型的浪潮下,云计算技术已成为企业运营…

电脑上怎么压缩图片?三个处理方法介绍

随着我们现在使用图片的地方越来越多,我们处理图片的情况也比较多了,通过压缩图片大小可以使图片文件更小,从而减少存储空间和带宽的使用,同时也可以提高加载速度和性能。良好的图片压缩可以有效地减少文件大小,同时保…

【Spring】使用@Bean和@Import注解配置Bean,与Bean的实例化

目录 1、bean是什么 2、配置bean 2.1、使用Bean注解配置Bean 2.2、使用Import注解配置Bean 3、实例化Bean 1、bean是什么 在 Spring 中,Bean 是指由 Spring 容器管理的对象。Spring IOC 容器负责创建、配置和管理这些 Bean 对象的生命周期。Spring IOC 容器会管…

Linux简单介绍

Linux简单介绍 编译器VMware虚拟机Ubuntu——LinuxOS为什么使用LinuxOS? 目录结构Windows目录结构Linux操作系统home是不是家目录? Linux常用命令终端命令行提示符与权限切换命令tab 作用:自动补全上下箭头pwd命令ls命令mkdir命令touch命令rm…

C++实现vector

目录 前言 1.成员变量 2.成员函数 2.1构造函数 2.2析构函数 2.3begin,end 2.4获取size和capacity 2.5函数重载【】 2.6扩容reserve 2.7resize 2.8insert 2.9删除 2.10尾插、尾删 3.0拷贝构造函数 3.1赋值运算符重载 前言 自主实现C中vector大部分的功能可以使我们更好的理解并使…

flink源码编译-job提交

1、启动standalone集群的taskmanager standalone集群中的taskmanager启动类为 TaskManagerRunner 2 打开master启动类 通过 ctrln快捷键,找到、并打开类: org.apache.flink.runtime.taskexecutor.TaskManagerRunner 3 修改运⾏配置 基本完全按照mas…

高等数学基础篇之导数与微分的运算法则

导数与微分: 一、导数基本公式 二、微分基本公式 三、导数运算法则 四、微分运算法则 一、导数基本公式 二、微分基本公式 三、导数运算法则 四、微分运算法则 有理运算法则 设f(x), g(x)在x处可导,则: 复合函数运算法则 设 yf(u), ug…

【JavaScript】函数 ① ( 函数引入 | 函数声明 | 函数调用 )

文章目录 一、JavaScript 函数1、函数引入2、函数声明3、函数调用4、代码示例 - 函数声明调用 一、JavaScript 函数 1、函数引入 JavaScript 代码编写时 , 会遇到 定义 大量相同或相似代码的 场景 , 这些代码可能需要重复使用 , 这种情况下就需要 将 这些代码 定义在 函数 中 ;…

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

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

NoSQL之Redis

目录 一、关系型数据库与非关系型数据库 1.关系数据库 2.非关系数据库 2.1非关系型数据库产生背景 3.关系型数据库与非关系型数据区别 (1)数据存储方式不同 (2)扩展方式不同 (3)对事物性的支持不同 …

日常生活中使用的 4 个核心开发工具

长话短说 本文列出了 2024 年我作为开发人员在日常生活中最常用的 4 个工具。✅ 这些工具旨在提高您的编辑技能、终端导航、笔记以及在应用程序容器化之外使用 Docker。另外,最后我还给大家准备了一个小惊喜。 如果您没有使用本文中至少提到的 1-2 个工具&#xf…

银行数字化转型导师坚鹏:银行数字化转型必知的3大客户分析维度

银行数字化转型需要进行客户分析,如何进行客户分析呢?银行数字化转型导师坚鹏认为至少从客户需求分析、客户画像分析、客户购买行为分析3个维度进行客户分析。 1.客户需求分析 银行数字化转型需要了解客户需求,不同年龄段的客户有不同的需求…

医院云HIS系统源码,二级医院、专科医院his系统源码,经扩展后能够应用于医联体/医共体

基于云计算技术的B/S架构的HIS系统,为医疗机构提供标准化的、信息化的、可共享的医疗信息管理系统,实现医患事务管理和临床诊疗管理等标准医疗管理信息系统的功能。 系统利用云计算平台的技术优势,建立统一的云HIS、云病历、云LIS&#xff0…

echarts 地图 自己圈地图 乡镇街道

这个是方式是我实在不愿意做的! 如果有现成的最好,没有办法的情况下再用这个东西。 今天公司有一个项目,地方划分了一块区域,但是国家没有审核,但是项目里面用到了一个地图展示数据!然后就需要我们自己把…

vulhub中Apache Solr 远程命令执行漏洞复现(CVE-2019-0193)

Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。此次漏洞出现在Apache Solr的DataImportHandler,该模块是一个可选但常用的模块,用于从数据库和其他源中提取数据。它具有一个功能&#…

Tailscale:随时随地远程和使用服务器

文章目录 Tailscale是什么?Tailscale能做什么?1、传输文件2、远程开发3、代理 Tailscale怎么用?Windows下安装OpenSSH在线安装离线安装连接SSH服务器 Reference相关阅读 彩蛋:Pycharm远程连接服务器并运行代码 Tailscale是什么&am…

10 年跟踪 Hacker News 招聘贴,解读科技行业变迁

Hackers News (HN) 是国外程序员最喜欢逛的论坛。能登上首页的帖子类似于上了新浪微博。因为其巨大的程序员访问量,因此也成为了公司招聘的渠道。久而久之 HN 招聘帖还形成了专门的标题格式 Ask HN: Who is hiring? 正好有人通过 Ask HN 来分析技术趋势&#xff0c…

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

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

本地运行github上下载的项目--接Git入门篇

1.了解项目 这是一个基于Spring Boot 和 Mybatis Plus 构建的Java项目,很经典的外卖项目,参考b站的黑马瑞吉外卖。 2.构建项目 SpringBoot项目,首先下载一些常见的项目要求的组件。然后配置如下: 看README,在阅读该…