系统设计学习(二)用户认证场景

一、常用鉴权方式

HTTP Basic Authentication (HTTP基本认证)
session-cookie
1,服务器在接受客户端首次访问时在服务器端创建session,然后保存session(我们可以将session保存在内存中,也可以保存在redis中,推荐使用后者),然后给这个session生成一个唯一的标识字符串,然后在响应头中种下这个唯一标识字符串。
2.签名。这一步只是对sid进行加密处理,服务端会根据这个secret密钥进行解密。(非必需步骤)
3.浏览器中收到请求响应的时候会解析响应头,然后将sid保存在本地cookie中,浏览器在下次http请求的请求头中会带上该域名下的cookie信息,
4.服务器在接受客户端请求时会去解析请求头cookie中的sid,然后根据这个sid去找服务器端保存的该客户端的session,然后判断该请求是否合法。
Token 验证(包括JWT,SSO)

最简单的token组成(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串.

  • 2, 服务端收到请求,去验证用户名与密码
  • 3, 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
  • 4, 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
  • 5, 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
## 优点
Token 可以避免 CSRF 攻击(也是因为不需要cookie了)
Token 可以是无状态的,可以在多个服务间共享(服务器也只是做了token的解密和用户数据的查询, 它不需要在服务端去保留用户的认证信息或者会话信息)
Token 支持手机端访问(Cookie不支持手机端访问)
## 缺点:
性能问题: 相比于session-cookie来说,token需要服务端花费更多的时间和性能来对token进行解密验证.其实Token相比于session-cookie来说就是一个"时间换空间"的方案.

token与session的区别:

使用Token,服务端不需要保存状态,服务端是根据session_id,来查询在服务器端保持的session,这里面才保存着用户的登陆状态。但是token本身就是一种登陆成功凭证,他是在登陆成功后根据某种规则生成的一种信息凭证,他里面本身就保存着用户的登陆状态。服务器端只需要根据定义的规则校验这个token是否合法就行。

Token不需要借助cookie的. 我们知道http代理客户端不只有浏览器,还有原生APP等等,这个时候cookie是不起作用的,使用token时,客户端在收到响应的时候,可以把他存在本地的cookie,storage,或者内存中,然后再下一次请求的请求头重带上这个token就行了。

时效性。session-cookie的sessionid实在登陆的时候生成的而且在登出事时一直不变的,在一定程度上安全就会低,而token是可以在一段时间内动态改变的。

可扩展性。token验证本身是比较灵活的,一是token的解决方案有许多,常用的是JWT,二来我们可以基于token验证机制,专门做一个鉴权服务,用它向多个服务的请求进行统一鉴权。

OAuth(开放授权)

img

  • 用户访问系统1的受保护资源,系统1发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数
  • sso认证中心发现用户未登录,将用户引导至登录页面
  • 用户输入用户名密码提交登录申请
  • sso认证中心校验用户信息,创建用户与sso认证中心之间的会话,称为全局会话,同时创建授权令牌
  • sso认证中心带着令牌跳转会最初的请求地址(系统1)
  • 系统1拿到令牌,去sso认证中心校验令牌是否有效
  • sso认证中心校验令牌,返回有效,注册系统1
  • 系统1使用该令牌创建与用户的会话,称为局部会话,返回受保护资源
  • 用户访问系统2的受保护资源
  • 系统2发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数
  • sso认证中心发现用户已登录,跳转回系统2的地址,并附上令牌
  • 系统2拿到令牌,去sso认证中心校验令牌是否有效
  • sso认证中心校验令牌,返回有效,注册系统2
  • 系统2使用该令牌创建与用户的局部会话,返回受保护资源

注销:

  • 局部会话存在,全局会话一定存在

  • 全局会话存在,局部会话不一定存在

  • 全局会话销毁,局部会话必须销毁

  • 用户向系统1发起注销请求

  • 系统1根据用户与系统1建立的会话id拿到令牌,向sso认证中心发起注销请求

  • sso认证中心校验令牌有效,销毁全局会话,同时取出所有用此令牌注册的系统地址

  • sso认证中心向所有注册系统发起注销请求

  • 各注册系统接收sso认证中心的注销请求,销毁局部会话

  • sso认证中心引导用户至登录页面

OAuth 2.0

它允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容,为了保护用户数据的安全和隐私,第三方网站访问用户数据前都需要显式的向用户征求授权。我们常见的提供OAuth认证服务的厂商有QQ,微信,微博等。

二、手机扫二维码登陆的原理

字节二面:扫码登录的原理

为什么用临时token?

临时token与token一样,它也是一种身份凭证,不同的地方在于它只能用一次,用过就失效。同时防止被坏人拦截token去冒充登录(token和设备是绑定的,故攻击者获取了手机长期token也无法在新设备上使用)

为什么使用多次token?

以此确保扫码,登录两步操作是同一部手机端发出的。

三、谈谈SSO单点登录的设计实现

单点登陆:学校的网站,有很多个系统,迎新系统,教务系统,网课系统,只需要登录一次就能在各个系统中被认定为登录状态。

Cookie共享传播状态

认证中心和其他系统是在一个域名下的,认证中心为父域名(jwxt.com),其他系统是子域名(yx.jwxt.com),或者是同一IP不同端口的情况,我们的服务端通过cookie去判断是否登录。

在认证中心登录成功的时候设置Cookie,domin要设置为父域名(.jwxt.com),设置SameSite,此后子域名的系统也有了Cookie。

Session共享

使用Session共享技术,将Session信息存储在一个外部存储中,比如Redis、MongoDB等,从而实现多个应用程序之间的Session共享。使用一些现成的框架来实现Session共享,比如Spring Session、Apache Shiro。

  • 数据库共享:将session存储在数据库中,不同的应用服务器通过访问同一数据库来实现session共享。
  • Cookie共享:将session ID存储在cookie中,不同的应用服务器通过访问同一域名下的cookie来实现session共享。
  • 缓存共享:将session存储在缓存中,不同的应用服务器通过访问同一缓存来实现session共享。常用的缓存系统有Redis、Memcached等。
Oauth2

基于OAuth2.0的单点登录:OAuth2.0是一种授权框架,可以用于实现单点登录。用户在第一次登录时,服务器会将用户的授权信息存储在OAuth2.0服务器中。当用户访问其他应用程序时,这些应用程序会向OAuth2.0服务器请求授权信息,如果授权信息有效则认为用户已经登录。

![img](https://img-blog.csdnimg.cn/img_convert/cf27e46570ac1b5bb4c7ad41706d9d00.webp?x-oss-process=image/format,png

四 、服务器集群中的session共享方案有哪些?

1、session复制同步方案

解决方式:每个节点都复制其他节点的session

## 优点:
web-server(tomcat)不需要额外开发,只需搭建tomcat集群即可,修改配置文件
## 缺点:
数据传输占用带宽,内存限制
2、cookie客户端存储

解决方式:session存储在客户端的cookie中

## 优点:
服务器不需存储session,用户保存自己的 session信息到cookie中。节省服务端资源
## 缺点:
1.每次http请求,携带用户在cookie中的完整信息,浪费网络带宽
2.session数据放在cookie中,存在泄漏、篡改、窃取等安全隐患
3.session数据放在cookie中,cookie有长度限制4K,不能保存大量信息
3、nginx ip_hash一致性

解决方式:固定的用户固定的请求一台服务器

## 优点:
只需要改nginx配置,不需要修改应用代码
负载均衡,只要hash属性的值分布是均匀的,多台web-server的负载是均衡的
可以支持web-server水平扩展(session同步法是不行的,受内存限制)
## 缺点:
服务器重启可能导致部分session丢失,影响业务,如部分用户需要重新登录
如果服务器水平扩展,rehash后session重新分布,会有用户路由不到正确的session
但是以上缺点问题也不是很大,因为session本来都是有有效期的。所以这两种反向代理的方式可以使用
4、统一存储

解决方式:后端统一存储session

## 优点:
没有安全隐患;
可以水平扩展,数据库/缓存 水平切分即可;
服务器重启或者扩容都不会有session丢失。
## 缺点:
增加了一次网络调用;
如将所有的getSession方法替换为从Redis查数据的方式。
缺点可以用SpringSession完美解决。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Idea 看不到本地 change

环境 idea IntelliJ IDEA 2023.3.3 (Community Edition) idea 升级后,看不到本地change了,去掉下面勾选即可。 解决:

python调用clickhouse

(作者:陈玓玏) 使用clickhouse-driver包,先通过pip install clickhouse-driver安装包,再通过以下代码执行sql。 from clickhouse_driver import Client client Client(host10.43.234.214, port9000, userclickhou…

【网络安全】手机不幸被远程监控,该如何破解,如何预防?

手机如果不幸被远程监控了,用三招就可以轻松破解,再用三招可以防范于未然。 三招可破解可解除手机被远程监控 1、恢复出厂设置 这一招是手机解决软件故障和系统故障的终极大招。只要点了恢复出厂设置,你手机里后装的各种APP全部将灰飞烟灭…

AMEYA360:稳先微汽车驱动芯片—智能高边开关WS7系列

近几年,新能源汽车高速发展,用车浪潮蔓延全球,我国新能源汽车占有量连续9年居全球前列,2023年全年市占率达37.7%,市场规模可观,并显现出以下特点:电车产品对比油车优势明显、消费者接受度高、市…

蓝桥杯算法错题记录-基础篇

文章目录 本文还在跟新,最新跟新时间3/11!!! 格式一定要符合要求,(输入,输出格式)1. nextInt () next() nextLine() 的注意事项2 .数的幂 a^2等3.得到最大长度(最大...&a…

【python pyinstaller库】pyinstaller介绍、安装、以及相关重点知识

PyInstaller是一个在Windows、GNU/Linux、macOS等平台下将Python程序冻结(打包)为独立可执行文件的工具, 用于在未安装Python的平台上执行Python编写的应用程序。 相比类似工具,它的主要优点是 PyInstaller 与 Python 3.7-3.10 一起工作&…

阿里又又发布了一个“AI神器”

阿里给“打工”朋友送上“节日礼物” 六一儿童节当天,阿里就给所有“打工”的大朋友送上了一份“节日礼物” 6月1日上午,阿里云发布了面向音视频内容的AI新品“通义听悟”,并正式公测 通义千问、通义听悟 这哥俩现在所处环境不同&#xff0…

Druid连接池经常性断链问题

前段时间有应用使用Druid连接池经常的提示断链报错,整个问题排查分析过程很有意思。这里将Druid连接池、数据库层以及负载均衡层的配置分析下,记录整个问题的分析过程,同时梳理下Druid连接池的配置和连接保活及回收机制。 1、问题背景 应用…

线程(thread)

目录 线程的基本特性 pthread库的主要函数 pthread_create pthread_join pthread_exit pthread_mutex_init pthread_mutex_lock 和 pthread_mutex_unlock pthread_cond_init pthread_cond_wait 和 pthread_cond_signal / pthread_cond_broadcast pthread_cond_destro…

探索Linux世界:基本指令(文件查看、时间相关、grep、打包压缩及相关知识)

今天继续介绍一些指令 文章目录 1.cat - 查看文件1.1输出重定向和追加重定向1.2指令echo 2.more 指令3.less - 逐页查看文本文件内容4.head- 显示文件开头部分内容5.tail - 显示文件末尾部分内容5.1输入重定向&#xff08;<&#xff09;5.2管道&#xff08;|&#xff09; 6.…

【C++从练气到飞升】03---构造函数和析构函数

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书。 目录 ⛳️推荐 一、类的6个默认成员函数 二、构造函数 1. 构造函数的概念 2. 构造函数的定义 3. 构造函数的特性 三、析构函…

Python环境下一维时间序列的高斯均值滤波分解方法

信号分解是一种可以将复杂的观测信号分解为若干子信号的时频分析技术。该技术可以通过分解得到的子信号来有效表征观测信号内部的时频特性&#xff0c;进而能够从观测信号中提取出有用信息。因此&#xff0c;信号分解在信号处理领域中发挥着重要的作用。 傅里叶分解是早期常用…

论文学习——基于枢轴点预测和多样性策略混合的动态多目标优化

论文题目&#xff1a;A dynamic multi-objective optimization based on a hybrid of pivot points prediction and diversity strategies 基于枢轴点预测和多样性策略混合的动态多目标优化&#xff08;Jinhua Zheng a,b,d, Fei Zhou a,b,∗, Juan Zou a,b, Shengxiang Yang a…

mysql数据库(下)

目录 约束 约束的概念和分类 1、约束的概念&#xff1a; 2、约束的分类 1、主键约束 2、默认约束 3、非空约束 4、唯一约束 5、外键约束 约束 约束的概念和分类 1、约束的概念&#xff1a; 约束时作用于表中列上的规则&#xff0c;用于限制加入表的数据约束的存在保证…

Java学习笔记------常用API(二)

Object 无有参构造 public Object() 空参构造 成员方法&#xff1a; public String toString() 返回对象的字符串表示 public boolean equals(object obj) 比较两个对象是否相等 Object默认用号比较地址值&#xff0c;需要重写才能比较属性值 protected O…

知识文档管理系统平台:企业管理的王炸

无论是企业内部的文件共享&#xff0c;还是团队之间的协作编辑&#xff0c;知识文档管理系统都能发挥巨大的作用。它帮助企业整理、存储和查找各种文档资料&#xff0c;这不仅能提高企业的工作效率&#xff0c;还能增强企业的竞争力。今天就跟着LookLook同学一起来深入了解知识…

4款好用的AI写作软件推荐,让你成为写作大神

写作已经成为我们日常生活和工作中必不可少的一部分&#xff0c;当我们在还绞尽脑汁的去想如何写作的时候&#xff0c;别人已经弯道超车用上了人工智能写作软件&#xff0c;今天&#xff0c;小编想为大家推荐4款好用的AI写作软件&#xff0c;让你在几秒钟内生成高质量文章的同时…

ADGUARD规则备份

ADGUARD规则备份 文章目录 ADGUARD规则备份使用方法规则 使用方法 规则 123pan.com###app > div.ant-spin-nested-loading.global-loading > div.ant-spin-container > div > div.appdiv.web-wrap > div.banner-container-pc:nth-child(3) bilibili.com###comm…

【Typescript】any和unknown的区别

any----没有任何约束【JavaScript中基本都是 any类型&#xff0c;可随意赋值】 unknow----可以接受任何类型的赋值&#xff0c;但不可以赋值给其他任意类型【除非使用as断言转换】 let o:number[] [1,2,3]// 可接收任何类型 let a:unknown o// 不可传递给其他类型 let x:st…

基于SpringBoot的“实习管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“实习管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统首页界面图 学生注册界面图 后台登录界面图 …