认证模式~

认证方式

基于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,一经查实,立即删除!

相关文章

速盾网络:组建CDN服务器加速

在当前互联网时代,网站的速度对用户体验和搜索引擎排名至关重要。为了提升网站的访问速度和性能,越来越多的网站选择使用CDN(内容分发网络)服务。本文将介绍如何利用速盾网络来组建CDN服务器,以加速网站访问。 1. 选择…

Spring Boot:全面解析现代微服务构建利器

Spring Boot 是基于 Java 平台的开源框架,它通过提供一系列标准化的快速开发和部署功能,彻底革新了传统 Spring 应用程序的创建与管理方式。自2014年发布以来,Spring Boot 已经成为构建企业级、云原生以及微服务架构应用的首选工具之一&#…

嵌入式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)带宽 单位时间内传输的数…

Linux 使用 SSH 传输文件

# 登录 ssh usernameip_address # 复制文件(远程-->本地) scp usernameip_address:/home/username/filename . # 复制文件(本地-->远程) scp filename usernameip_address:/home/username # 复制目录(本地-->远程) scp -r source_dir usernameip_address:/home/use…

独孤思维:这份付出,可以拿一辈子收益

学习,不能贪杯。 做副业,不能什么都做。 什么都学,就什么都学不会。 什么项目都做,就什么都赚不到钱。 这是一定的。 人的精力有限,时间有限,成本有限。 这一辈子,做好一件事就够了。 很…

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

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

Redisson - 实现Java的Redis分布式和可扩展解决方案

Redisson - 实现Java的Redis分布式和可扩展解决方案 引言: 在现代的分布式系统中,缓存和数据存储扮演着至关重要的角色。Redis作为一种高性能的键值存储数据库,被广泛用于缓存、消息队列、实时数据分析等场景。然而,原生的Redis…

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可视化…

SpringAMQP消息队列

安装RabbitMQ 在linux上安装RabbitMQ,并运行 docker run \-e RABBITMQ_DEFAULT_USERzywzy \-e RABBITMQ_DEFAULT_PASS123321 \--name mq \--hostname mq1 \-p 15672:15672 \-p 5672:5672 \-d \rabbitmq:3-managementhttp://ip:15672 访问控制台, 用户名zywzy,密码123321 引入…

康复训练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. 参数配置…

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

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