认证模式~

认证方式

基于Cookie和Session的认证方式

基于Cookie和Session的认证是传统的Web应用认证机制。它依赖于HTTP协议无状态的特性,在客户端(浏览器)和服务器之间保持用户的状态。

工作原理

用户登录:用户通过输入用户名和密码来登录Web应用。
验证凭据:服务器验证用户提交的凭据。如果凭据有效,服务器将创建一个会话(Session),该会话包含用户的登录信息和其他必要的状态信息。
发送Cookie:服务器生成一个唯一的会话ID,并将其存储在会话存储中(如内存、数据库或其他存储系统)。然后,服务器通过设置HTTP响应中的Set-Cookie头部,将此会话ID发送回客户端,保存在Cookie中。
客户端存储Cookie:客户端(浏览器)接收到Cookie后,会将它保存起来,并在随后对同一服务器的每个请求中自动发送这个Cookie。
服务器识别用户:每当服务器收到来自客户端的请求时,它会查找请求中的Cookie,提取会话ID,并使用此ID查找存储的会话信息。如果找到会话,服务器就能知道是哪个用户发出的请求,并根据会话中保存的状态进行处理。

举例假设有一个简单的Web登录流程:

用户访问登录页面(/login),输入用户名和密码。
服务器验证用户凭据。如果凭据有效,服务器创建一个Session,生成一个会话ID,并将其作为Cookie发送回用户。
用户收到Cookie后,每次访问Web应用的其他页面时,都会在请求中携带这个Cookie。
服务器接收到请求,从Cookie中提取会话ID,查找对应的Session,并识别出用户,根据用户的权限显示相应的内容。请添加图片描述

缺点

1.服务端需要存储Session,并且由于Session经常需要快速查找,通常存储再内存或内存数据库中,同时在线用户较多时需要占用大量的服务器资源。
2.当需要扩展时,创建Session的服务器可能不是验证Session的服务器,所以还需要将所有Session单独存储并共享。
3.在跨域环境下要进行兼容性处理。否则难以防范CSRF攻击。

JWT方式

什么是Token?

在Web应用中,Token是一个代表系统中某个实体(通常是用户会话)的加密字符串,用于在客户端和服务器间安全传递信息。Token可以存储所需的任何数据,但为了减少客户端到服务器的往返次数,它通常包含足够的信息来标识用户或会话,以及签名或其他验证数据,以确保Token的真实性和完整性。

基于Token的会话管理

基于Token的会话管理是一种服务器无状态的认证机制。传统的基于会话的认证会在服务器上存储用户的登录信息,而基于Token的认证则不会在服务器上保存会话信息。当用户使用他们的凭证登录时,服务器会创建一个Token(有时候这个Token会有一个过期时间),然后把它发回给用户,用户将Token存储在客户端,并随后的每个请求一起发送。服务器接收到请求后,会验证Token的签名,确认Token有效,然后提取Token中的用户信息,进行权限验证,而不需要查询数据库或保存会话信息。

基于Token的认证的优势

跨平台和跨域认证:Token可以在不同类型的客户端(如Web应用、移动应用)之间共享和使用。
无状态和可扩展性:服务器不需要保存会话信息,使得应用更易于扩展。
安全性:由于Token是加密的,因此安全性较高,特别是在使用HTTPS时。

JWT方式

JWT(JSON Web Tokens)是一种开放标准(RFC 7519),用于安全地在两个参与方之间传递信息作为JSON对象。由于信息可以被验证和信任,因为它是数字签名的(使用HMAC算法或RSA公钥/私钥对进行签名),JWT广泛用于Web应用中的授权和信息交换。

简单来说就是一种基于JSON格式的Token。知识定义了一种基于Token的会话管理的规则,涵盖Token需要包含的标准内容和Token的生成过程,特别适用于分布式站点的单点登录场景

一个JWT实际上是一个被编码的字符串,由三部分组成,用点(.)分隔:

Header(头部):通常包含两部分,token类型(即"JWT")和所使用的签名算法(如HMAC SHA256或RSA)。
Payload(负载):包含所要传递的声明。声明是关于实体(通常是用户)和其他数据的声明。可以包含多种预定义的声明(如发行人、过期时间等)和自定义声明。
Signature(签名):对前两部分的签名,用于验证消息在传递过程中未被篡改。

JWT是实现基于Token认证的一种非常流行的方式,由于其紧凑和自包含的特性,使其成为Web服务认证和信息交换的一个优秀选择。

请添加图片描述
点分隔三部分一次代表头部,负载,签名。
头部和负载以JSON形式存在,这就是JWT中的Json,三部分的内容都分别单独经过了Base64编码,以.拼接成一个JWT Token。
请添加图片描述
请添加图片描述
payload就是指定里面装了什么东西。
注意JWT默认是不加密的,任何人都可以读到,所以不要把密码信息防止这个部分,这个JSON对象也要使用Base64URL算法转成字符串。最好存帮助你去鉴定你是什么角色,这样的数据。

Signature
Signature是对前两部分的签名,确保JWT在传输过程中没有被篡改。
第一个内容就是signature如何生成:
从下面就可以看出来生成的过程
请添加图片描述
1.先将header经过Base64编码,payload也是经过Base64编码,然后两个字符串用.进行拼接成一个字符串。
2.然后使用Header中指定的算法对这个字符串进行加密,在加密的过程中还需要使用到一个只有服务器知道的密钥(对于HMAC)或私钥(对于RSA算法)
3.最后做完这些就得到了Signature。

工作过程:

当服务器接收到一个JWT时,会使用统一的方法(相同的Header、Payload、算法和秘钥)对收到的JWT的前两部分(Header和Payload)进行签名,然后将这个新生成的签名与JWT中的Signature进行比对。如果两者相同,说明这个JWT是合法的,且数据没有被篡改;如果不同,则验证失败,数据可能被篡改。

我再举个实际的例子
假设有这样一个JWT,它由三部分组成,Header、Payload和Signature,用点.连接。

生成JWT的过程
Header (Base64编码后): eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
解码后: {“alg”:“HS256”,“typ”:“JWT”}
Payload (Base64编码后): eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
解码后: {“sub”:“1234567890”,“name”:“John Doe”,“admin”:true}
Signature: 使用Header里声明的HS256算法和一个只有服务器知道的秘钥secret,对{Base64编码的Header}.{Base64编码的Payload}进行加密得到。
服务器生成了JWT发给了用户。

验证JWT的过程:
当用户在之后的请求中返回这个JWT时,服务器需要验证这个JWT是否有效。

服务器首先从JWT中分离出Header和Payload。
然后,服务器使用存储的相同的秘钥secret和JWT Header中声明的相同算法HS256,对{Base64编码的Header}.{Base64编码的Payload}这部分再次进行加密。
加密后,服务器得到了一个新的Signature
现在,服务器有了两个Signature:

用户发送过来的JWT里的Signature
服务器自己刚刚生成的Signature
如果这两个Signature完全相同,那么就说明用户发送过来的JWT在传输过程中没有被篡改,因为只有使用了相同的秘钥和数据才能生成相同的Signature。服务器就认为这个JWT是有效的,用户的请求是合法的。

举个具体的例子

假设用户发送过来的JWT的Signature是S1。

服务器使用秘钥secret对用户JWT的Header和Payload部分进行加密,假设得到的新Signature是S2。

如果S1等于S2,说明JWT有效,请求合法。
如果S1不等于S2,说明JWT可能在传输过程中被篡改,服务器将拒绝这个请求。
通过这种方式,JWT的Signature保证了传输数据的完整性和安全性。

JWT优缺点

优点:就是Token的优点(最大的优势就是服务端不需要存储Session)
缺点: 由于 有效期存储在Token中,JWT Token一旦签发,就会在有效期内一直可用,无法在服务端废止,当用户进行登出操作,只能依赖客户端删除掉本地的JWT Token,如果需要禁用用户,单词使用JWT就无法做到。(所以通常TOKEN的过期时间都设置的比较短)

如果想实现禁用用户,那可以使用一个黑名单,用之前检查一下,但是这样背离了我们使用Token的初衷,我们想的就是不要在服务端存储数据。这只是一个思路,不是说服务端不让你存储

实践

go语言要使用jwt-go来实现我们生成JWT和解析JWT的功能。

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

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

相关文章

嵌入式C语言(三)

typeof() 使用typeof可以获取一个变量或表达式的类型。 typeof的参数有两种形式:表达式或类型。 int i;typeof(i) j 20; --> int j 20;typeof(int *) a; -->int *a; int f(); -->typeof(f()) k;--? int k我们可以看出通过typeof获取一个变量的…

合并spark structured streaming处理流式数据产生的小文件

备注: By 远方时光原创,可转载,不能复制到其他平台 背景:做流批一体,湖仓一体的大数据架构,常见的做法就是 数据源->spark Streaming->ODS(数据湖)->spark streaming->…

Vue 实现页面导出A4标准大小的PDF文件,以及处理图片跨域不能正常展示的问题等

效果预览: 代码流程:首先在utils文件夹下创建htmlToPdf的js工具文件,然后在main.js中注册引用 htmlToPdf.js // 导出页面为PDF格式 import html2Canvas from html2canvas import JsPDF from jspdfexport default {install(Vue, options) {V…

hcia datacom课程学习(1):通信基础

1.总体框架 上图为发送方通过互联网传递信息给接收方的过程。 家用路由器会直接集成上图中的四层(vlan,DHCP,静态路由,NAT,PPPoE)。 2.网络性能指标 (1)带宽 单位时间内传输的数…

解析Hadoop三大核心组件:HDFS、MapReduce和YARN

目录 HadoopHadoop的优势 Hadoop的组成HDFS架构设计Yarn架构设计MapReduce架构设计 总结 在大数据时代,Hadoop作为一种开源的分布式计算框架,已经成为处理大规模数据的首选工具。它采用了分布式存储和计算的方式,能够高效地处理海量数据。Had…

pod调度策略 标签管理 资源配额与限额 全局资源配额与限额策略,

打分也是基于可调度节点进行打分资源情况. 指定多个节点,会进行覆盖其之前节点名称 --- kind: Pod apiVersion: v1 metadata:name: myhttp spec:nodeName: node-0001 # 基于节点名称进行调度containers:- name: apacheimage: myos:httpd 基于节点名称的调度策略 标签与调…

数据可视化--了解数据可视化和Excel数据可视化

目录 1.1科学可视化: 可视化是模式、关系、异常 1.2三基色原理: 三基色:红色、绿色和蓝色 1.3Excel数据可视化 1.3.1 excel数据分析-13个图表可视化技巧 1.3.2 excel数据分析-28个常用可视化图表(video) 1.3.3Excel可视化…

康复训练day2——2024牛客寒假集训营6

一道很好的构造题,受益匪浅。 链接:F-命运的抉择_2024牛客寒假算法基础集训营6 (nowcoder.com)​​​​​​ 题意: 题解 (并查集 思维): 首先将存在1的情况特判掉,我们的数组的元素都是> 2的…

2024-02-26(Spark,kafka)

1.Spark SQL是Spark的一个模块,用于处理海量结构化数据 限定:结构化数据处理 RDD的数据开发中,结构化,非结构化,半结构化数据都能处理。 2.为什么要学习SparkSQL SparkSQL是非常成熟的海量结构化数据处理框架。 学…

在having、select子句中使用子查询

目录 在having子句中使用子查询 统计出部门平均工资高于公司平均工资的部门编号、平均工资、部门人数 在select子句中使用子查询 查询每个员工的编号、姓名、职位、部门名称 Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 在havin…

销售线索获取 如何查找更多的销售线索平台

在进行销售工作时,寻找潜在客户和销售线索是非常重要的。只有及时地发现客户的需求和问题,才能更好地进行销售和提供服务。然而,在如今的市场环境中,客户的信息被广泛地分散在各个渠道和媒介上,如果仅靠人工搜索和整理…

如何优化Node.js应用的性能

随着Node.js在Web开发领域的广泛应用,越来越多的开发者开始关注如何优化Node.js应用的性能。优化Node.js应用的性能可以提升应用的响应速度,降低资源消耗,提升用户体验。在本文中,我们将探讨一些优化Node.js应用性能的方法和技巧。…

Nginx重写功能和反向代理

目录 一、重写功能rewrite 1. ngx_http_rewrite_module模块指令 1.1 if 指令 1.2 return 指令 1.3 set 指令 1.4 break 指令 2. rewrite 指令 3. 防盗链 3.1 实现盗链 3.2 实现防盗链 4. 实用网址 二、反向代理 1. 概述 2. 相关概念 3. 反向代理模块 4. 参数配置…

亿道丨三防平板丨如何从多方面选择合适的三防加固平板?

在如今这个信息爆炸的时代,移动设备已经成为我们生活和工作的必备工具。然而,在一些特殊的场合中,普通的平板电脑可能无法满足需求,比如工厂车间、野外作业、极端天气等环境下。此时,三防平板就成了不二之选。那么&…

SpringCloud-Docker安装与详解

Docker 是一款强大的容器化平台,通过其轻量级的容器技术,使应用程序的开发、部署和管理变得更加便捷和高效。本文将深入探讨 Docker 的安装过程,并详细解析其基本概念、组件及常用命令,以帮助读者充分理解和熟练使用 Docker。企业…

mac安装zookeeper

下载地址: http://archive.apache.org/dist/zookeeper/ 注意:由于Zookeeper从3.5.5版本开始,带有bin名称的包才是我们想要的下载可以直接使用的里面有编译后的二进制的包,而之前的普通的tar.gz的包里面是只是源码的包无法直接使…

Laravel04 eloquent

eloquent 1. eloquent2. 创建eloquent model 以及 取数据 1. eloquent 文档地址: https://learnku.com/docs/laravel/8.x/eloquent/9406 下面是我们,通过laravel的DB类从数据库中获取了post记录,那么有没有可能我们直接获取一个post对象&am…

Ps:索引颜色模式

Ps菜单:图像/模式/索引颜色 Image/Mode/Indexed Color 索引颜色 Indexed Color模式可生成最多 256 种颜色的 8 位图像文件。 这种颜色的限制使得索引颜色模式的图像文件相比于全彩图像(如 RGB 颜色模式下的图像)具有更小的文件大小&#xff0…

使用mumu模拟器开启调试安卓pwa程序环境,配置谷歌环境,并增加pwa安卓/苹果/PC电脑安装流程

环境配置 当你想开发pwa程序时,手上没有安卓手机怎么办?使用mumu安卓模拟器也是可以的,使用安卓模拟器后,可能自带的浏览器不支持pwa,还需要安装chrom浏览器,当你安装好chrom浏览器后,打开又提…

利用项目管理软件规划的成功之路

项目开发对于任何类型的项目都是一个有用的过程。软件开发项目、建筑项目、运输项目和变更管理项目都可以从这种方法提供的结构、指导和策略中获益。 项目开发涉及规划项目时间表、投资资源以及安排团队成员的时间。与项目管理一样,项目开发贯穿项目始终&#xff0…