认证模式~

news2024/11/18 11:22:18

认证方式

基于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.coloradmin.cn/o/1476116.html

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

相关文章

【AIGC】OpenAI推出王炸级模型sora,颠覆AI视频行业

文章目录 强烈推荐前言什么是OpenAI Sora?工作原理:算法原理:应用场景展望与其他视频生成模型相比有哪些优势和不足?优点缺点 总结强烈推荐专栏集锦写在最后 强烈推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易…

Unity中字符串拼接0GC方案

本文主要分析C#字符串拼接产生GC的原因,以及介绍名为ZString的库,它可以将字符串生成的内存分配为零。 在C#中,字符串拼接通常有三种方式: 直接使用号连接;string.format;使用StringBuilder; 下面分别细…

table展示子级踩坑

##elemenui中table通过row中是否有children进行判断是否展示子集,通过设置tree-prop的属性进行设置,子级的children的名字可以根据自己的子级名字进行替换,当然同样可以对数据处理成含有chilren的子级list。 问题: 1.如果是根据后…

java大数据开发面试题,完美世界java面试题

02 JVM 线程JVM内存区域JVM运行时内存垃圾回收与算法JAVA四种引用类型GC分代收集算法 VS 分区收集算法GC垃圾收集器JAVA IO/NIOJVM类加载器 03 JAVA集合 接口继承关系和实现LISTSETMAP 04 JAVA多线程并发 JAVA并发知识库JAVA线程实现/创建方式4种线程池线程生命周期&#xf…

★【递归】【链表】Leetcode 21. 合并两个有序链表

★【递归】【链表】Leetcode 21. 合并两个有序链表 解法1 :递归链表 简直是好题啊好题多做做 ---------------🎈🎈题目链接🎈🎈------------------- 解法1 :递归链表 简直是好题啊好题多做做 >>>…

Time Travel

题目链接 解题思路 由于所有边集中的边加起来的总和至多为,无向图即,可以存下所以直接对所有边集中的边进行建边,同时对于每条边,记录其所在边集号对于每个边集,由大到小维护其能通过的时间点然后从1号跑最短路到当前…

javaWeb个人学习03

事务管理: 概述: 一个事务里面的操作 要么同时成功, 要么同时失败例子: 比如在根据id 删除部门的时候 当部门删除成功了 但是遇到了异常 导致下面的代码没有继续执行下去 就没法根据id删除员工的信息了 这个时候 事务就很重要了 开启回滚 或者提交事务 要么同时成功 要么同时…

【考研数学】《汤家凤 1800 》《张宇 1000 》《李永乐 660 》《李林 880 》应该如何选择?

本人数学逆袭的路上,深知选对一本题集对我的重要性!!! 我本科期间,数学并不是我的强项,但是我却能够在考研的时候靠数学甩开别人几十分成功上岸,一本优秀的题集起到了关键的作用。 1800题&…

MySQL的事务与隔离级别

1. 什么是事务? 数据库中的事务是指对数据库执行一批操作,而这些操作最终要么全部执行成功,要么全部失败,不会存在部分成功的情况。这个时候就需要用到事务。 最经典的例子就是转账,你要给朋友小白转 1000 块钱&…

选择排序,冒泡排序,插入排序,快速排序及其优化

目录 1 选择排序 1.1 原理 1.2 具体步骤 1.3 代码实现 1.4 优化 2 冒泡排序 2.1 原理 2.2 具体步骤 2.3 代码实现 2.4 优化 3 插入排序 3.1 原理 3.2 具体步骤 3.3 代码实现 3.4 优化 4. 快速排序 4.1 原理 4.2 具体步骤 4.3 代码实现 4.4 优化 为了讲…

如何优化一个看似正常的数据库

通常DBA是不会太了解业务逻辑的,遇到系统中劣质的sql 一般也是以通过添加索引的方式来优化,但是并不是所有的sql都能通过添加索引来优化 这就需要重sql的本身来做分析,另外还要了解什么样的语句会不走索引!本文通过几个简单的例子…

RK3568 android11 调试陀螺仪模块 MPU-6500

一,MPU6500功能介绍 1.简介 MPU6500是一款由TDK生产的运动/惯性传感器,属于惯性测量设备(IMU)的一种。MPU6500集成了3轴加速度计、3轴陀螺仪和一个板载数字运动处理器(DMP),能够提供6轴的运动…

计算机网络——IPV4数字报

1. IPv4数据报的结构 本结构遵循的是RFC 791规范,介绍了一个IPv4数据包头部的不同字段。 1.1 IPv4头部 a. 版本(Version):指明了IP协议的版本,IPv4表示为4。 b. 头部长度(IHL, Internet Header Length&…

web组态软件

1、强大的画面显示web组态功能 2、良好的开放性。 开放性是指组态软件能与多种通信协议互联,支持多种硬件设备,向上能与管理层通信,实现上位机和下位机的双向通信。 3、丰富的功能模块。 web组态提供丰富的控制功能库,满足用户的测…

回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量…

《互联网的世界》第二讲-最短路径优先

昨天讲 dns 时讲过,“你问一个当地人最近的厕所在哪,路人给你一个地址…”,可是只有地址还不够,如何到达那里呢?这是本节的内容。 自然的方式是,一边走一边问,根据路人的指示继续一边走一边问…

pikachu之xss获取键盘记录

前备知识 跨域 跨域(Cross-Origin)是指在互联网中,浏览器为了保护用户信息安全而实施的一种安全策略——同源策略(Same-Origin Policy),即浏览器禁止一个域上的文档或者脚本(如通过JavaScript发…

单片机复位按键电路、唤醒按键电路

目录 单片机复位按键 外部手动复位 单片机复位按键电路 复位按键电路1 复位按键电路2 单片机唤醒按键 单片机唤醒按键电路 单片机复位按键 单片机复位:简单来说,复位引脚就是有复位信号,就是从头开始执行程序 本质:就是靠…

Linux内核适配 (一)

我们的产品包含多个内核驱动模块,随着Linux内核的不断演进,既有的驱动代码可能因为使用了一些被新版本内核所废弃的函数或者数据结构,导致不能编译通过,或者运行时出错。这时,我们就需要修改我们的驱动代码,以便其能在新版本的内核上正常工作,这个过程通常被称为「适配」…

【机器学习】线性回归模型(Linear Regression)

🌸博主主页:釉色清风🌸文章专栏:机器学习🌸今日语录:温柔的一半是知识,没有知识的涵养撑不起你想要的风骨。 ☘️0文章预览 本系列文章主要是根据吴恩达老师的机器学习课程以及自己的理解整合而成&#xf…