首页 > 其他分享 >身份验证演变过程

身份验证演变过程

时间:2023-06-12 12:37:02浏览次数:33  
标签:演变 身份验证 用户 Token session 服务器 过程 id 服务端

身份验证演变过程_服务端

 

本文将从Web应用 由传统身份验证到基于Token的身份验证的演变过程的角度,介绍Session、Cookie、Token。


很久以前,Web 应用基本用作文档的浏览,如网络黄页。既然仅仅是浏览,因此服务器不需要记录具体用户在某一段时间里都浏览了哪些文档,每次请求都是一个新的HTTP协议,对服务器来说都是全新的。

基于Session的身份验证

随着交互式Web应用的兴起,比如,购物等需要登录的网站。引出了一个新的问题,那就是要记录哪些用户登录了系统进行了哪些操作,即要管理会话(什么是会话?简单的讲如果用户需要登录,那么就可以简单的理解为会话,如果不需要登录,那么就是简单的连接。),比如,不同用户将不同商品加入到购物车中, 也就是说必须把每个用户区分开。因为HTTP请求是无状态的,所以想出了一个办法,那就是给每个用户配发一个会话标识(Session id),简单的讲就是一个既不会重复,又不容易被找到规律以仿造的随机字符串,使得每个用户的收到的会话标识都不一样, 每次用户从客户端向服务端发起HTTP请求的时候,把这个字符串给一并发送过来, 这样服务端就能区分开谁是谁了,至于客户端(浏览器)如何保存这个“身份标识”,一般默认采用 Cookie 的方式,这个会话标识(Session id)会存在客户端的Cookie中。

虽然这样解决了区分用户的问题,但又引发了一个新的问题,那就是每个用户(客户端)只需要保存自己的会话标识(Session id),而服务端则要保存所有用户的会话标识(Session id)。 如果访问服务端的用户逐渐变多, 就需要保存成千上万,甚至几千万个,这对服务器说是一个难以接受的开销 。 再比如,服务端是由2台服务器组成的一个集群, 小明通过服务器A登录了系统, 那session id会保存在服务器A上, 假设小明的下一次请求被转发到服务器B怎么办? 服务器B可没有小明 的 session id。

可能会有人讲,如果使小明登录时,始终在服务器A上进行登录(sticky session),岂不解决了这个问题?那如果服务器A挂掉怎么办呢? 还是会将小明的请求转发到服务器B上。

如此一来,那只能做集群间的 session 复制共享了, 就是把 session id 在两个机器之间进行复制,如下图,但这对服务器的性能和内存提出了巨大的挑战。

身份验证演变过程_服务端_02

 

因此,又想到如果将所有用户的Session集中存储呢,也就想到了缓存服务Memcached——由于 Memcached 是分布式的内存对象缓存系统,因此可以用来实现 Session 同步。把session id 集中存储到一台服务器上, 所有的服务器都来访问这个地方的数据, 如此就避免了复制的方式, 但是这种“集万千宠爱于一身”使得又出现了单点故障的可能, 就是说这个负责存储 session 的服务器挂了, 所有用户都得重新登录一遍, 这是用户难以接受的。

身份验证演变过程_服务端_03

 

那么索性存储Session的服务器也搞成集群,增加其可靠性,避免单点故障,但不管如何,Session 引发出来的问题层出不穷。

于是有人就在思考, 为什么服务端必须要保存这session呢, 只让每个客户端去保存不行吗?可是服务端如果不保存这些session id ,又将如何验证客户端发送的 session id 的确是服务端生成的呢? 如果不验证,服务端无法判断是否是合法登录的用户,对,这里的问题是验证, session 只是解决这个验证问题的而产生的一个解决方案,是否还有其它方案呢?

基于Token 的身份验证

例如, 小明已经登录了系统,服务端给他发一个令牌(Token), 里边包含了小明的 user id, 后续小明再次通过 Http 请求访问服务器的时候, 把这个 Token 通过 Http header 带过来不就可以了。

服务端需要验证 Token是自己生成的,而非伪造的。假如不验证任何人都可以伪造,那么这个令牌(token)和 session id没有本质区别,如何让别人伪造不了?那就对数据做一个签名(Sign)吧, 比如说服务端用 HMAC-SHA256 加密算法,再加上一个只有服务端才知道的密钥, 对数据做一个签名, 把这个签名和数据一起作为 Token 发给客户端, 客户端收到 Token 以后可以把它存储起来,比如存储在 Cookie 里或者 Local Storage 中,由于密钥除了服务端任何其他用户都不知道, 就无法伪造令牌(Token)。

身份验证演变过程_客户端_04

 

如此一来,服务端就不需要保存 Token 了, 当小明把这个Token发给服务端时,服务端使用相同的HMAC-SHA256 算法和相同的密钥,对数据再计算一次签名, 和 Token 中的签名做个对比, 如果相同,说明小明已经登录过了, 即验证成功。若不相同, 那么说明这个请求是伪造的。

身份验证演变过程_服务器_05

 

这样一来, 服务端只需要生成 Token,而不需要保存Token, 只是验证Token就好了 ,也就实现了时间换取空间(CPU计算时间换取session 存储空间)。没了session id 的限制, 当用户访问量增大, 直接加机器就可以轻松地做水平扩展,也极大的提高了可扩展性。




标签:演变,身份验证,用户,Token,session,服务器,过程,id,服务端
From: https://blog.51cto.com/u_14347868/6461361

相关文章

  • 运营的3个方法论:过程法、要素法、分类法
    研究了这么久的营销和运营,我越发深刻地认可一句话:”上帝不掷骰子。”这是来自爱因斯坦的一句名言。我是一个极度相信科学的人,我相信好的运营模型、指标、策略对于实践一定有重要作用,火爆的产品、活动背后绝不是随机地做做推广可以带来的。 海盗模型、漏斗分析法、马斯洛的需求层......
  • SQL Server 只读账号/只读登录名可查看存储过程及函数权限
    USETCsfc--数据库名)GRANTVIEWDefinitionTOtestUser--开启,只读账户queryuser在TCsfc数据库中可查看存储过程及标量值函数的权限USETCsfc--(数据库名)REVOKEVIEWDefinitionTOtestUser--撤销,只读账户queryuser在TCsfc数据库中可查看存储过程及标量值函数的权限......
  • 强化学习及过程监督学习笔记
    写在前面笔者将在这篇文章中,写下有关过程监督,反馈对齐,奖励模型,和数据构造相关的论文的笔记。论文主要来自Openai的论文。 论文挖坑列表一篇Openai中提到的用于训练奖励模型的方法K.Cobbe,V.Kosaraju,M.Bavarian,M.Chen,H.Jun,L.Kaiser,M.Plappert,J.Tworek,......
  • 深入分析Java类的加载过程
    PhotobyrizknasfromPexels:Java是一种面向对象的编程语言,它的核心特性之一就是动态加载类。Java程序在运行时可以根据需要加载和卸载类,从而实现灵活的功能扩展和更新。那么,Java中类是如何从文件加载到内存中的Class对象呢?本文将从Java虚拟机的角度,详细介绍类的加载过程,包......
  • 前端——模块化演变过程
    第一阶段——基于文件划分的方式实现模块化文件为独立的模块,在对应位置调用全局成员。缺点:污染全局作用域,命名冲突问题,完全依靠约定。第二阶段——命名空间方式使用全局对象方式实现模块化,解决了命名冲突的问题。缺点:污染全局作用域第三阶段——立即执行函数方式使用立即执行......
  • 徒手体验卷积运算的全过程
    前言最近的失业潮引起很多打工人的恐慌,特别是ChatGPT之类的生成式AI的推出,其智能程度和自主学习能力远程人们想象.加剧了大家的恐慌情绪,在裁员潮这个当口,纷纷引发各行各业的猜测--人工智能替代大部分岗位,而且有些行业甚至已经使用上了ChatGPT类的生成式AI进行替代人类的部分工......
  • 盘点一个Python自动化办公过程中Excel数据为空的处理
    大家好,我是皮皮。一、前言前几天在Python群,粉丝问了一个Python自动化办公的问题,这里拿出来给大家分享下。这个问题相信很多人都会遇到,原始Excel数据中,这个【编号】列一般是有相关数据的,但是如果没有的话,就先写为“暂无编号”,如下图所示:后来发现通过Python代码,将其写入到word文件,不......
  • 记录一次新手渗透的过程
    这是严格意义上的第一次动手实操,相对于无限的理论学习与记忆,我个人是觉得让我动手操作一次让我的收获更大。目标靶机:http://testphp.vulnweb.com/工具使用:KaliLinux参考文档:   【渗透测试】渗透测试最强秘籍(Part1:信息收集)–绿盟科技技术博客(nsfocus.net)明确目标之......
  • 基于XC7Z100+OV5640(DSP接口)YOLO人脸识别前向推理过程(部分3)
    基于ZYNQ的摄像头显示系统本文介绍了如何使用ZYNQ开发板、OV5640摄像头和HDMI显示器搭建一个摄像头显示系统本文的内容主要分为以下几个部分:硬件介绍Vivado工程创建Vitis工程创建实验结果展示硬件介绍ZYNQ开发板使用的是ZINC7100芯片,具有双核ARMCortex-A9处理器......
  • Python中带else子句的for循环执行过程
    这几天在厦门讲课,每天6小时,没有太多时间写新代码,宾馆不知道咋想的也不提供WiFi,只好用手机做个热点临时分享一点基础知识,300M的包月流量伤不起,热点瞬间就把仅剩的40M流量用完了,赶紧发完关闭热点。在Python中,有while和for两种循环,并且都可以带有else子句。其中while循环常用于无法提......