常见的登录验证方式

news2024/11/15 8:46:51

目录

一、Cookie+Session登录

 二、Token+cookie

三、单点登录(Single Sign On——一次登录,全线通用)

四、Oauth2.0

一、Cookie+Session登录

        HTTP是一种无状态的协议,客户端每次发送请求时,首先要和服务端创建一个连接,在请求完成之后会断开这个连接。

        这种方式能够节省传输时占用的连接资源,但同时也存在一个问题:每次请求都是独立的,服务器没法判断本次请求和上一次请求是否来自同一个用户,进而也没法判断用户的登录状态。

为了解决HTTP无状态的问题,Lou等在1994年的时候,推出了Cookie

Cookie是服务端发送给客户端的一段特殊信息,这些信息以文本的方式存放在客户端,客户端每次向服务端发送请求时都会带上这些特殊信息。

有了Cookie之后,服务端就可以获取到客户端传递过来的信息,若是需要对信息进行验证,还需要经过Session

客户端请求服务端,服务端会为此次请求开辟一块内存区域,这就是Session对象。

有了Cookie+Session之后,我们就能够进行登录认证了。

1. Cookie+Session实现流程
Cookie+Session的登录方式是最经典的一种登录方式,如今仍有大量企业在用。
用户首次登录时:

先访问a.com/login,输入账号密码登录。

服务器验证密码无误后,会建立SessionId,并将它保存起来。

服务端响应这个HTTP请求,并经过Set-Cookie头信息,将SessionId写入Cookie中。

浏览器会根据Set-Cookie中的信息,自动将SessionId存储在cookie中。

服务端的SessionId可能存放在不少地方,如内存、文件、数据库等。

第一次登录完成之后,后续的访问就能够直接使用Cookie进行身份验证了:

用户访问a.com/page页面时,会自动带上第一次登录时写入的Cookie。
服务端对比Cookie中的SessionId和保存在服务端的SessionId是否一致。
若是一致,则身份验证成功。


2. Cookie+Session存在的问题
虽然这种使用Cookie+Session的方式完成了登录验证,但仍然存在一些问题:

因为服务端需要对接大量的客户端,就需要存放大量的SessionId,会导致服务端压力过大
若服务端是一个集群,需要将SessionId同步到每一台机器上,增长了集群服务端维护成本。
因为SessionId存放在Cookie中,因此没法避免CSRF攻击

CSRF攻击是一种利用用户在目标网站上已认证的会话执行非预期操作的攻击方式。攻击者通过欺骗用户使其在受信任的网站上执行恶意操作,如转账、修改账户信息等。

常见的CSRF攻击方式,如下:
1、直接链接方式,攻击者通过诱使用户点击恶意链接,向目标网站发送伪造请求。当用户点击链接时,浏览器会自动发送包含用户认证信息的请求,从而执行攻击者指定的操作。
2、图片/资源引用方式,攻击者将恶意请求嵌入到图片、脚本或其他资源引用中,并将其插入到受信任网站的页面。当用户访问页面时,浏览器会自动加载并发送恶意请求。
3、表单提交方式,攻击者创建一个包含恶意请求的表单,并将其隐藏在一个看似正常的页面中。当用户在该页面上执行某些操作(如点击按钮)时,浏览器会自动提交表单,从而执行攻击者指定的操作。

 二、Token+cookie

1. Token机制实现流程
用户首次登录时:

用户访问a.com/login,输入账号密码,并点击登录。
服务端验证账号密码无误,建立Token。
服务端将Token返回给客户端,由客户端自由保存。
后续访问页面时:

用户访问a.com/page时,带上第一次登录时获取的Token。
服务端验证Token,有效则身份验证成功。



————————————————

流程 :

用户登录:用户使用用户名和密码发送登录请求到服务器。服务器验证用户的身份信息,并验证成功后生成一个唯一的令牌(token)。
令牌生成:服务器生成一个包含用户身份验证信息的令牌,并将其返回给客户端 。令牌通常是一个加密的字符串,其中包含了用户的身份信息、授权信息和有效期 等。
令牌存储:服务器将生成的令牌存储在服务器端的缓存或数据库 中,以便后续验证和访问控制。
令牌传递:客户端将接收到的令牌存储在本地,通常可以使用Cookie或LocalStorage 等技术来存储。
请求验证:当客户端发送后续请求到服务器时,需要将令牌放在请求中的请求头、参数或Cookie中,以便服务器进行验证。
令牌验证:服务器接收到请求后,从请求中获取令牌,并与服务器存储的令牌进行比较和验证 。验证包括检查令牌的有效性、合法性以及是否过期等。
授权访问:如果令牌验证通过,服务器会根据令牌中的身份信息进行授权验证,以确定用户是否有权限进行请求的操作。
响应返回:服务器根据验证和授权结果返回相应的响应结果给客户端。

2.Token 机制优点缺点:无状态性、跨平台支持、安全性。复杂Token 管理、泄露风险、传输安全

优点:

——无状态性(Statelessness): Token 机制是无状态的,服务器不需要保存用户的会话状态,因此可以降低服务器的负载,特别适用于分布式系统和微服务架构。

——跨平台和跨域支持: Token 可以在各种平台和环境下使用,并且可以跨越不同的域,适用于各种前端和后端技术栈。

——安全性: Token 可以使用加密算法进行签名和验证,确保数据的完整性和安全性。此外,可以设置 Token 的过期时间和权限范围,增强了安全性。

——可扩展性: Token 机制灵活且可扩展,可以根据业务需求定制不同的 Token 格式和验证规则,支持多种身份验证方式。

——用户体验: Token 机制使用户可以长时间保持登录状态,无需频繁登录,提高了用户的使用体验。

缺点:

——Token 管理复杂: 使用 Token 机制需要额外的逻辑来生成、验证和管理 Token,相比传统的基于会话的认证方式,实现和维护成本更高。Token下发之后,只要在生效时间内,就一直生效,若服务端想要收回此Token权限,并不容易。

——Token 泄露风险: 如果 Token 被泄露,攻击者可以利用 Token 进行未授权的访问,因此需要采取措施来保护 Token 的安全性,如使用 HTTPS 加密传输、定期更换 Token 等。

-——Token 的传输安全: Token 通常是在 HTTP 头部或请求参数中传递的,如果未经加密,可能被中间人攻击截获或篡改,造成安全风险。

——Token 长期性: Token 通常具有较长的有效期,如果长时间不使用或泄露,可能会增加安全风险,因此需要定期更新 Token 或采取其他有效期管理策略。

3. Token的生成方式

随机字符串生成

JWT(JSON Web Token)

OAuth 2.0,

OIDC(OpenID Connect)——OIDC 是建立在 OAuth 2.0 基础上的身份验证协议,使用 JWT 作为身份验证令牌。OIDC 的身份验证令牌通常称为 ID Token,用于传递用户身份信息和认证状态。

基于时间戳的 Token——可以根据当前时间戳和用户信息生成 Token,并设置过期时间,保证 Token 的时效性。

最常见的Token生成方式是使用JWT,JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息 ,也可以增加一些额外的其他业务逻辑所必须的声明信息,该token也可以直接被用于认证,也可被加密

JWT算法主要分为3个部分:

header(头信息)——令牌的类型(即 "JWT")和所使用的签名算法(如 HMAC SHA256 或 RSA)。头部使用 Base64 编码后的 JSON 字符串表示。

playload(消息体)——包含了 JWT 的声明信息,包括了一些标准的声明(例如过期时间、发行人、主题等),也可以包含自定义的声明。

signature(签名)——JWT的签名,主要为了让JWT不能被随意篡改。签名通常是由头部、载荷和密钥一起进行加密生成的。签名的生成算法取决于头部中指定的算法,常见的有 HMAC SHA256 和 RSA。

三、单点登录(Single Sign On——一次登录,全线通用)

当业务线越来也多,就会有更多业务系统分散到不同域名下(不同的系统),就需要(一次登录,全线通用)的能力,这就是单点登录。

1、“虚假的单点登录”,使主域名相同

cookie是有限制的,这个限制就是cookie的域(通常对应网站的域名),浏览器发送http请求时会自动携带与该域匹配的cookie,而不是所有cookie 。

因此,我们可以将web应用群中所有子系统的域名统一在一个顶级域名下,采用同域名共享cookie的方式。这样也能实现一次登录,全线通用。

但是共享cookie的方式存在众多局限:

所有的子系统域名要统一;

应用群各系统使用的技术要相同,并且共享cookie的方式是无法实现跨语言技术平台登录的

2、“真实”的单点登录

当主域名不同时,实现一次登录,全线使用,这才是真正的单点登录。在这种场景下,我们需要独立的认证服务,通常被称为 SSO(Single Sign On)

  • 当用户访问A系统,没有登录凭证(ticket),A系统让它重定向到SSO
  • 用户没有在SSO登录,SSO系统下就没有凭证(这个和ticket不是一个东西),用户输入账号和密码进行登录
  • SSO校验账号密码成功,通过接口返回,做两件事:一在SSO系统种下凭证(记录用户的登录状态);二是给用户下发一个ticket
  • 客户端拿到tikcet,保存起来,带着ticket再次访问系统A
  • SSO校验ticket,成功后正常处理业务请求
  • 此时用户第一次访问系统B,没有ticket,B系统让它重定向到SSO
  • 因为用户在SSO登录过,SSO有凭证,不用再次登录,只需要下发ticket
  • 客户端拿到ticket,保存起来,带着ticket请求系统B
  • SSO校验ticket,成功后正常处理业务请求

只有SSO有登录账号密码的功能,其他系统都没有。用户在SSO登录后,SSO就会存储一个用户的登录凭证(这个是全局会话,然后根据重定向过来的地址,颁发要访问的系统的ticket。比如用户是从A系统重定向过来的,就颁发一个A系统的ticket(局部会话),客户端带着这个ticket就可以访问A系统了;当用户要访问B系统时,B系统将它重定向到SSO,已经登录了,所以SSO直接颁发可以访问B系统的ticket,客户端带着这个ticket就可以访问B系统了。这样就实现了一处登录,全线使用

但是这样有一个问题,SSO放回的ticket,浏览器要如何存,因为有很多个域名下,如何才能在下次访问A系统时带上这个ticket?因为浏览器对跨域有严格限制,所以我们需要在A域下保存这个A的ticket

  • 在 SSO 域下,SSO 不是通过接口把 ticket 直接返回,而是通过一个带 code 的 URL 重定向到系统 A 的接口上 ,这个接口通常在 A 向 SSO 注册时约定
  • 浏览器被重定向到 A 域下,带着 code 访问了 A 的 callback 接口,callback 接口通过 code去SSO中 换取 ticket
  • 这个 code 不同于 ticket,code 是一次性的,暴露在 URL 中,只为了传一下换 ticket,换完就失效
  • callback 接口拿到 ticket 后,在**自己的域下 set cookie ** 成功
  • 在后续请求中,浏览器只需要把 cookie 中的 ticket 解析出来,然后去SSO 中 验证就可以了

当某个产品c.com退出登录时:

  1. 清空c.com中的登录态Cookie。
  2. 请求认证中心sso.com中的退出api
  3. 认证中心遍历下发过ticket的全部产品,并调用对应的退出api,完成退出。

        单点登录SSO-CSDN博客   

四、Oauth2.0权限认证

OAuth2权限认证(第三方登录)——70%-CSDN博客

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

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

相关文章

TMS320F280049 EPWM模块--功率拓扑中的应用(9)

三相交错DC-DC转换器 下图为示意框图。右侧为电路示意图,可以看到用了3路epwm,每路epwm的A/B两端口分别控制一个开关管。左侧为epwm配置示意图,可以看到epwm1在ctrzero时产生同步信号输出,然后同步到epwm2和3。epwm1/2/3的相位分…

【C++】C++11 lambda表达式

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 C11引入『 lambda表…

maven3.9+下载安装

maven介绍 Maven 是一个项目管理和理解工具,它基于项目对象模型(POM)概念。Maven 可以帮助开发者定义项目结构、依赖关系、构建过程以及其他任务。它主要用于 Java 项目,但也可以用于其他类型的项目。Maven 的主要目标是简化构建…

传感器展会现场直击!道合顺传感邀您共鉴气体传感器前沿技术

4月14日,#深圳国际传感器#与应用技术展览会在深圳会展中心(福田)如期举办。道合顺传感亮相本届大会并展示了对气体传感器的探索和最新研究成果,获得了传感器业内的广泛关注。 多年来,道合顺传感依托于雄厚的研发实力&a…

京东jd商品详情数据接口丨店铺所有商品接口丨评论接口丨京东API接口

京东(JD)作为中国的主要电商平台之一,提供了丰富的API接口供商家和开发者使用,以便获取商品详情、店铺所有商品以及评论等数据。使用这些接口时,你需要先成为京东的商家或开发者,并在京东开放平台注册账号&…

一个令人惊艳的图片高清化重绘神器:SUPIR来了!

今天给大家分享一个将模糊图片还原为照片级高清图像的AI项目:SUPIR。这个项目以尖端的大规模人工智能革新图像恢复技术,通过文本驱动、智能修复,将AI技术与创新思维相结合,赋予每张图像全新的生命力。这个项目的修复能力本质上是一…

Python 实战人工智能数学基础:图像处理应用

1.背景介绍 在许多计算机视觉任务中,图像处理占据了很重要的角色,尤其是在目标检测、特征提取、分类、跟踪等计算机视觉任务中。图像处理是一个复杂的过程,涉及到图像的采集、分析、存储、显示等环节。本文将讨论基于Python实现的图像处理的…

Solana主网使用自定义的RPC进行转账

1、引言 如果用 browser 连接主网的 RPC server 会收到 error code 403 message 為 Access forbidden, contact your app developer or supportrpcpool.com. 错误,因为主网的 RPC server 会检查 HTTP Header 如果判断出來是 browser 就会报告 403 錯誤。 要解決这…

2024年第十五届蓝桥杯C/C++B组复盘(持续更新)

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 文章目录 试题A:握手问题问题描述思路 试题B:小球反弹问题描述思路…

函数与结构体

P2415 集合求和 题目描述 给定一个集合 s(集合元素数量≤30),求出此集合所有子集元素之和。 输入格式 集合中的元素(元素≤1000) 输出格式 s 所有子集元素之和。 输入输出样例 输入 2 3 输出 10 说明/提示【样…

Flutter - flutter_gen 资源管理

引言: 在开发 Flutter 应用时,我们经常需要使用各种静态资源,如图片、字体和音频等。如何有效地管理和加载这些资源呢?本篇博客将以图片为例带你解密 Flutter 项目中是如何管理资源地。 assets 加载资源 具体文件名引入 在工程…

软件杯 深度学习卷积神经网络的花卉识别

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 基…

L1-041 寻找250

对方不想和你说话,并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字。 输入格式: 输入在一行中给出不知道多少个绝对值不超过1000的整数,其中保证至少存在一个“250”。 输出格式: 在一行中输出第一次…

postman接口测试(入门到精通)

下载: postman官方地址 测试外部接口:测试被测系统和外部系统之间的接口。(只需要测试正例即可) 测试内部接口: 1.内部接口只提供给内部系统使用。(只需要测试正例即可) 2.内部接口提供给外…

Gradle 实战 - 插件-ApiHug准备-工具篇-015

🤗 ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱,有温度,有质量,有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace ApiHug …

Unity 人形骨骼动画模型嘴巴张开

最近搞Daz3D玩,导入后挂上动画模型嘴巴张开,其丑无比。 Google了一下,得知原因是Unity没有对下巴那根骨骼做控制,动画系统就会把它放到默认的位置,嘴巴就张开了。找到了3种解决办法。 1.移除动画中对下巴这个骨骼的转…

【深度学习】YOLO-World: Real-Time Open-Vocabulary Object Detection,目标检测

介绍一个酷炫的目标检测方式: 论文:https://arxiv.org/abs/2401.17270 代码:https://github.com/AILab-CVC/YOLO-World 文章目录 摘要Introduction第2章 相关工作2.1 传统目标检测2.2 开放词汇目标检测 第3章 方法3.1 预训练公式&#xff1a…

C语言中的数据结构--链表的应用2(3)

前言 上一节我们学习了链表的应用,那么这一节我们继续加深一下对链表的理解,我们继续通过Leetcode的经典题目来了解一下链表在实际应用中的功能,废话不多说,我们正式进入今天的学习 单链表相关经典算法OJ题4:合并两个…

【前端工程化指南】什么是版本控制系统?

什么是版本控制系统 想必大家在多人开发时一定会遇到这样的问题: 每次集中合并大家的代码都要通过U盘、网盘等各类传输工具集中代码,非常麻烦。在多人同时修改同一文件或相同部分代码时,可能会产生冲突,开发人员需要手动比较代码…

自编译支持CUDA硬解的OPENCV和FFMPEG

1 整体思路 查阅opencv的官方文档,可看到有个cudacodec扩展,用他可方便的进行编解码。唯一麻烦的是需要自行编译opencv。 同时,为了考虑后续方便,顺手编译了FFMPEG,并将其与OPENCV绑定。 在之前的博文“鲲鹏主机昇腾A…