面试系列:单点登录的知识(一)

news2024/11/19 12:38:56

大家好,我是车辙,由于目前接手的业务涉及到了单点登录,所以一直在疯狂的去补充这方面的知识。也写下了这篇面试形式的文章,写的不好大家轻点 Diss。

面试开始

在焦急的等待中,一位看上去比较年轻的小伙子走了过来。我心想:这么年轻,看来今天的面试稳了。“你好,我是今天的面试官,一位97年的架构师。我看你简历上写了精通单点登录,我们今天就聊聊这个吧”

什么是单点登录

这也太简单了。讲个自己的糗事,在我刚实习的时候,我曾经以为单点登录就是单用户登录,比如说我在一台手机上登录后,另一台手机再次登录就会把原先的那个给挤掉。因为这个在一次技术分享会上还出了大糗。

实际上,单点登录是指在多个应用系统中,用户只需要登录任意一个系统,就可以访问其他的互相信任的系统。比如说我在天猫登录后,在浏览器上输入淘宝的域名,你就已经登录成功了。

image.png

为什么需要单点登录

面试官:“你觉得为什么需要单点登录,或者说单点登录的价值体现在哪里”

为了方便,如果一款产品的用户体验很差劲,那么基本上是没有用户愿意持续使用的。

通过单点登录,可以让用户在多系统中灵活跳转而不必重新登录,能有效提升用户体验。就像我们杭州的最多跑一次。

常见的登录实现

面试官:那我们先来聊一下常见的登录是怎么做的?

这不就是我们大学时候教的内容么,首先我们后端有个拦截器,每次请求接口时都会在拦截器内部进行判断:根据Cookie中传递的SessionId判断用户信息是否已经保存在Session中。如果不存在,说明用户未登录,让浏览器跳转到登录页进行登录。

登录验证成功后,把用户信息写入到 服务器Session中。于是通过Cookie中的SessionId和服务器建立了会话。

并且一般来说,浏览器中的Cookie不会设置过期时间,而是在服务端的Session中设置,由服务端来控制用户的登录态。

image.png

单点登录的设计思路

面试官:有点东西哈,那么如果要你设计实现一个单点登录系统,有没有什么简单点的方案?

我:首先我们要了解,单点登录其实就是用户的登录态在多个系统间进行共享。我们可以这样思考,假如用户在 A系统 登录后,然后点击 B系统,能够把用户相关信息给带过去,然后在 B系统中判断存在用户信息, 从而进行登录。这样做对于用户来说是完全无感知的,只需要在系统层面帮助用户进行登录即可。

传递数据到前端还是后端

面试官:“既然是传递数据至 系统B,你觉得该把数据传递到 系统B 的浏览器前端页面还是后端服务器呢,或者说两者的实现方式有什么区别?”

我:如果是通过浏览器页面传递信息,前端拿到用户信息后,可以调用 B系统 服务端接口进行登录,与B系统建立会话。

image.png

如果是传递到 B系统 后端服务器,需要在服务器进行登录,然后带上用户信息重定向到B系统前端页面,这时候建立会话完成。

在前后端分离的情况下,我们一般采用第一种方式进行数据传递。

如何传递数据

面试官:“从你的两种方案中,不管是浏览器层面的跳转,还是后端重定向,都需要带上用户信息。如果是方式1,那么这个用户信息放在哪里呢,是URL链接还是其他地方”。

我:既然是通过浏览器传递数据,有两种方式,第一种是通过在Url上拼接参数,比如 http://www.baidu.com?userId=123 。

第二种是通过Cookie的形式传递,但是由于Cookie不能跨域,就导致了部分局限性。

为了体现对技术的追求,我偷偷的补充了一句:不过我发现在淘宝的Cookie中,能够看到天猫的domain,好像是用Jsonp实现的。

image.png

安全性如何保证

面试官点了点头,内心多少有点赞许了。接着问了面试中最常见的问题之一:不管是URL还是Cookie传递数据,你们如何保证数据的安全性呢?

身为一个对自我要求很高的程序员,这肯定难不倒我。保证数据的安全性总的来说有几种实现:

  1. 从软件层面上进行保证,比如说可见性等。
  2. 通过加密算法对数据进行加密。

因为从浏览器层面保证数据不可见不太现实,所以可以对数据进行加密,并且这个数据加解密的过程应该由服务端来实现

比如:用户在 系统A 登录后,系统A 的服务端通过某种加密算法以及某个秘钥对用户数据进行加密,接着返回给前端。系统A 页面跳转到系统B时带上这个加密信息,接着调用系统B服务端接口进行登录。系统B 通过解密数据获取登录者的用户信息进行登录即可。

image.png

时序图是用代码画的,想了解的访问我之前的文章:这是啥操作,用代码能画这样的图

你们的单点登录具体是如何实现的

“重头戏来了”,因为我们所有系统的顶级域名都是一样的,因此不会存在跨域问题。为了降低接入成本,我们采用的是 Cookie加密 的形式。

比如用户在 系统A 登录后,系统A会往浏览器中写入Cookie, Key 为userInfo,value值为用户A的accountId。当然这个accountId是加密过的。

然后用户在访问系统B的页面时,由于属于同一个顶级域名,会带上 Cookie。调用系统B接口时,判断 Cookie中存在用户信息,如果存在,通过Secret进行解密获取用户的accountId,随后把用户数据放到Session中,从而进行登录。

这样做还有一个好处就是:用户可以直接在浏览器中输入域名进行跳转,而不是需要在 系统A 点击跳转到系统B。毕竟一般的用户都是把链接保存在书签的。

image.png

加密的Secret是怎么实现的

我们的Secret采用的是系统约定的形式,我猜面试官肯定会想Secret全都一样会不会不安全。

这个值在系统中以加密的形式进行存储,并且使用的配置中心,再加上我们系统使用的是专用网络,基本不存在泄漏的风险。

有时候面试的时候,不要等面试官问的时候再说。你可以提前预判他要问的问题,这样在他心里能加不少分呢。

使用Cookie 可能会存在被攻击的风险,你知道哪些吗

面试官说到这神情有点异样,莫非它以前经历过?

使用Cookie存储的方式可能会受到Xss攻击,也就是攻击者在页面上注入恶意脚本,然后在浏览器上运行这段脚本,从而获取用户的数据,比如Cookie等,危害数据安全。这有点像我们后端的SQL注入

所以我们的系统在设置用户Cookie时都会设置 HttpOnly=true,这样通过js脚本将无法读取到cookie信息,增强了使用Cookie的安全性。

另外除了Xss攻击外,还会存在Csrf攻击,也就是跨站请求伪造,攻击者一般会诱导用户进入第三方网站。然后在第三方网站中,通过比较吸引人的链接让用户点击。从而冒充用户对被攻击的网站执行某项操作的目的。

关于Xss 和 Csrf 你可以去看美团技术博客的文章,链接我都帮你们准备好了
如何防止XSS攻击?

如何防止CSRF攻击?

我怎么听起来有点像背的,你能举个例子解释下吗

“事也太多了吧,谁面试的时候不准备下八股文背诵”,我默默的竖起了中指。

清了下嗓子,比如说某银行的官网使用的是Cookie-Session登录机制。那么用户在工商银行登录之后,浏览器上会保存有用户的SessionId。之后用户访问了第三方网站,网站页面上写着“跳楼大甩卖,100元一枚比特币,点击购买”。

image.png

你明知道是假的,但还是忍不住。你一点击,脑海里已经幻想着比特币到账100枚,却没想到收到了短信;“您的银行账户转账10000元”。

你突然两眼一黑,战战兢兢的打开链接地址,没想到链接地址是:“icbc.com?transfer=10000&userId=坏蛋”,它会向银行发出转账请求。并且由于你之前登录过银行,这个请求还会带上Cookie,从而让银行认为这是你发出的“正确行为”。

我顺道还聊了下解决方式:业界会使用 CSRF Token 的方式解决。只不过这个成本较高,所以我们就使用了双重Cookie验证,再加上我们的网络是专用网络,也能提高安全问题。

这块内容,美团技术博客的文章都提到了,没看的同学建议去看下,上文给了链接哦。

因为你是Cookie,如果其他人拿到了你的用户信息怎么办

emm,面试官你的问题很刁钻嘛。事实上传统的 session+cookie 方案,如果泄露了sessionId,别人同样可以盗用你的身份,就像Csrf攻击。

就像前端页面的真人验证一样,只要你们的信息是保存在前端页面的,只要能看你的前端代码,不管使用的加密逻辑再复杂,总是能被人破解的。

我之前有个同学,他们公司有部分业务是搞爬虫的,叫 MoXieKeJi。 他们公司就是爬取其他公司的个人征信、个人信息,然后给第三方公司提供风控数据。支付宝的安全做的还不错吧,照样被他们把用户的芝麻信用、蚂蚁花呗的数据搞出来了。蚂蚁改一次逻辑,他们也跟着改,最后蚂蚁发了律师函,后面整个公司都被请去喝茶了。

所以我觉得考虑这个问题,还不如考虑下别人为什么能够拿到你的信息。比如说使用Https

不过要是攻击者直接打开了我的浏览器,把我的Cookie信息拿走,那我就真的无能为力了。

用户登录的时效性怎么保证

面试官:在这种方式下,用户登录的时效性你们是怎么保证的,不管是对当前系统还是多系统的维度下。

我:在单系统条件下,如果是标准的 Cookie-Session 机制,用户登录后调用接口,这个 Session 会进行续签,从而让会话保持下去。会话的生命周期变成了主要由服务端来保证

但是通过目前的这种形式,通过Cookie中是否存在用户信息判断是否登录,会出现一个情况就是只要这个用户信息也就是Cookie一直存在,那么用户就永远不会退出。(因为我们只会对数据进行解密,并且用户在登录后,Cookie并不会设置有效期),也就是说这个会话的生命周期变成了由 Cookie 来保证。

所以我们有两种方案,一种是对 Cookie 添加过期时间,比如 30 分钟,只要Cookie消失了,说明用户登录状态失效。第二种是在userInfo这个CookieValue值中添加过期信息,然后每次接口调用时服务端判断是否超时。

你觉得这种方案可行吗

我好像看见了面试官嘴角的微笑,不急不慢的说到。

但是问题点在于续签问题,这两种方式不可避免的都需要刷新,也就是说用户只要请求后端服务,都需要重新设置Cookie的过期时间或者修改Value的值。这个相对的就比较蠢了,而且还会有性能问题。

所以我们项目的目前方案是由Cookie来保证这个会话的生命周期,并且不进行续签

更好的解决方案

面试官:你们的单点登录方案其实就是依靠JWT设计实现的。但是通过Cookie来保证会话的生命周期终究不是个特别好的思路。有没有更好的方案,比如说由后端来控制会话的生命周期?

# JSON Web Token - 在Web应用间安全地传递信息

我:就知道你要问这个。我们可以把系统A 和 系统B 的用户会话信息由服务端控制,进行统一控制。比如使用Spring-Session方案,使用同一个 Redis。这样的话用户在系统A登录后,将用户会话信息保存在Redis中。然后在打开系统B时,
因为Cookie同域,调用 系统B 接口时,上传的是同一个SessionId,系统B从Redis中判断用户已经登录了,返回登录成功,进行续签。

image.png

有优化空间没

面试官:这样一来,系统A 和 系统B 都会存在很多相同的后端代码,一个改动其他系统也要跟着改。到时候如果有很多个系统,修改成本是不是太大了?

我:确实是的。所以我们可以把 系统A 和 系统B 的那些代码搞成个服务端的认证中心,这样一来不是方便多了。而且Cookie始终有着跨域的问题。按照这个思路,我是不是可以把前端页面也搞成同一个,形成认证中心的前端页面。

“等等,这不就是CAS的设计思路嘛”

image.png

面试结束

面试官:“好小子,领悟力可以呀,有当架构师的潜力,明天就来上班吧。对了,到时候我们再聊聊 CAS 的问题”

总结

关于单点登录的内容,这一节就暂时到这啦。下一章我们来聊下这节末尾提到的CAS以及相似的Oauth2

补充一点:我们在面试的时候,对于技术思路一定要有连贯性,层层挖掘深入,特别是大厂的那些面试官。比如JVM类加载的问题,可能流程是这样的:

image.png

我当初就是被这一套组合拳打的满地找牙,还有最好是结合自己做的项目。有些同学可能会觉得没接触过,你可以把这些技术给带入进去,进行自我的模拟面试,只要逻辑清晰,有自己的理解和思考,面试成绩应该都不会太差。

如果这篇文章对您有所帮助,可以关住《车辙的编程学习圈》。

我是车辙,掘金小册《SkyWalking》作者,一名常被HR调侃为XX杨洋的互联网打工人。

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

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

相关文章

Leetcode:701. 二叉搜索树中的插入操作(C++)

目录 问题描述: 实现代码与解析: 递归: 原理思路: 迭代: 原理思路: 问题描述: 给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二…

Codeforces Round #843 (Div. 2)——A,B,C,E

​​​​​​​​​​​Dashboard - Codeforces Round #842 (Div. 2) - Codeforces A: 思维构造 题意:给定一个由 ab 组成的字符串,将该字符串拆分成 3 个部分(a,b,c),要求中间部分的字典序最大…

2022 年终总结

在 12 月 31 号晚上这天,打开朋友圈大家都在告别 2022、迎接 2023,我却想不到任何值得发的内容。没有外出体会元旦的节日氛围,也没有观看任何跨年活动,2022 年最后一秒跟全年的 3153.6 万秒没有任何区别。 甚至这篇总结都差点没有…

RK3568源码编译与交叉编译环境搭建

本篇进行飞凌OK3568-C开发板的Linux系统开发需要用的软件交叉编译环境的配置。 对于软件开发,如果只是使用C/C代码,则在自己的Ubuntu虚拟机中添加RK3568对应的交叉编译器(gcc/g)即可,如果要进行Qt开发,则还要再交叉编译与RK3568配…

UDS诊断系列介绍09-1485服务

本文框架1. 系列介绍1.1 14服务概述1.2 85服务概述2. 14服务请求与应答2.1 14服务请求2.2 14服务正响应3. 85服务请求与应答3.1 85服务请求3.2 85服务正响应3.3 否定应答4. Autosar系列文章快速链接1. 系列介绍 UDS(Unified Diagnostic Services)协议&a…

graalvm+spring-cloud-gateway打造又快又小的类nginx本地网关

前言 网关是微服务架构的入口,外网请求通过网关转发到独立的微服务。项目一般会经过多个环境的测试,最终发布到生产。一个http请求,如:http://public_host/api/v1/some_service/some_path?ab&cd会先经过公网域名&#xff0c…

ThinkPHP5.x未开启强制路由(s参数)RCE

官方公告:https://blog.thinkphp.cn/869075 由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的getshell漏洞,受影响的版本包括5.0和5.1版本 ThinkPHP5基础 环境搭建 官网直接下载完整包 https://www.thinkphp.cn/down/870.…

ElasticSearch集群架构及底层原理

前言ElasticSearch考虑到大数据量的情况,集群有很多的部署模式,本篇不会具体进行演示了,只是说明一下有哪些架构可以选,及一些原理的简单介绍,如果要看具体操作的那么可以自行进行搜索,这不是本篇博客要介绍…

OCR文字识别软件哪个好?7大文字识别软件

由于从各种文档中提取文本的需求非常普遍,许多办公软件或公司都提供了OCR工具。在本文中,我们为您推出了一系列功能强大且易于使用的最佳 OCR 软件。 什么是 OCR 软件? OCR 软件是一种程序或工具,可以使用光学字符识别技术识别数…

小红书数据分析网站:揭晓普通博主1个月涨粉百万的密码!

导语: 随着2023年的来临,回首小红书动态,行业热度依旧高涨,越来越多的达人涌入小红书。在时尚领域,更是出现了如氧化菊这样的大势变装博主!短短一周涨粉13W的变装博主为何能突围,强势吸睛呢&am…

[LCTF]bestphp2022安洵杯 babyphp

目录 <1> [LCTF]bestphp‘s revenge SoapClient触发反序列化导致ssrf serialize_hander处理session方式不同导致session注入 crlf漏洞 <2> 安洵杯 babyphp SoapClient 触发ssrf session反序列化 利用文件操作原生类读取flag <3> XCTF Final Web1 解…

Spring Security 解析(六) —— 基于JWT的单点登陆(SSO)开发及原理解析

Spring Security 解析(六) —— 基于JWT的单点登陆(SSO)开发及原理解析 在学习Spring Cloud 时&#xff0c;遇到了授权服务oauth 相关内容时&#xff0c;总是一知半解&#xff0c;因此决定先把Spring Security 、Spring Security Oauth2 等权限、认证相关的内容、原理及设计学习…

[极客大挑战 2019]Secret File

目录 信息收集 解题思路 信息收集 先看源码&#xff0c;发现一个php文件 <a id"master" href"./Archive_room.php" style"background-color:#000000;height:70px;width:200px;color:black;left:44%;cursor:default;">Oh! You found me&…

9.2 容器库概览

文章目录所有容器的共性&#xff1a;迭代器迭代器的范围容器类型成员begin和end成员容器的定义和初始化与顺序容器大小相关的构造函数赋值和swapassignedswap容器大小操作关系运算符所有容器的共性&#xff1a; 表格一&#xff1a; 类型别名说明iterator迭代器const_iterator…

用R语言理解全微分

文章目录6 全微分梯度的概念全微分前情提要 R语言微积分极限π,e,γ\pi, e, \gammaπ,e,γ洛必达法则连续性和导数数值导数差商与牛顿插值方向导数 6 全微分 梯度的概念 对于任意函数f(x0,x1,⋯,xn)f(x_0,x_1,\cdots,x_n)f(x0​,x1​,⋯,xn​)&#xff0c;其梯度为 ∇f(∂f∂…

解决从BIOS选择从U盘启动但是系统仍然从硬盘启动的问题

我怀疑是BIOS失去了记忆能力&#xff0c;不能记住我的选择&#xff0c;所以仍然按默认从硬盘启动。 解决&#xff1a;重置BIOS即可 下面用物理方法重置BIOS。 在主板上找到这三根针&#xff0c;将上面的黑色套子拔出&#xff0c;然后插入旁边的另外两根针&#xff0c;例如开始…

基于python知识图谱医疗领域问答系统实现

直接上结果展示: “让人类永远保持理智,确实是一种奢求” ,机器人莫斯,《流浪地球》 项目概况 本项目为一个使用深度学习方法解析问题,知识图谱存储、查询知识点,基于医疗垂直领域的对话系统的后台程序 运行效果:

aws beanstalk 结合packer创建自定义平台

参考资料 https://github.com/aws-samples/eb-custom-platforms-samples#updating-packer-templateElastic Beanstalk 自定义平台 今天使用eb平台创建环境的时候&#xff0c;发现有名为packer的选项&#xff0c;查询文档发现aws beanstalk支持自定义平台&#xff0c;这功能几…

4. 使用预训练的PyTorch网络进行图像分类

4. 使用预训练的PyTorch网络进行图像分类 这篇博客将介绍如何使用PyTorch预先训练的网络执行图像分类。利用这些网络只需几行代码就可以准确地对1000个常见对象类别进行分类。这些图像分类网络是开创性的、最先进的图像分类网络&#xff0c;包括VGG16、VGG19、Inception、Dens…

windows下 pytorch的安装(gpu版本以及cpu版本)

一. 查看是否有gpu 打开cmd 输入nvidia-smi 是以下这种情况的就是有gpu 没有gpu的话就会报错 下载安装cuda以及cudnn&#xff08;安装cpu版本可以跳过此步骤直接进行pytorch的安装&#xff09; 下载cuda 看清楚两个箭头指的地方 一个是11.3.0 一个是日期 后面下载cudnn的时…