扫二维码登录现在比较常见,比如微信、支付宝等 PC 端登录,并且越来越多的APP支持扫码登录,其中原理如何呢?

PC端Cookie + Session 登录

HTTP 是一种无状态的协议,客户端每次发送请求时,首先要和服务器端建立一个连接,在请求完成后又会断开这个连接。这种方式可以节省传输时占用的连接资源,但同时也存在一个问题:每次请求都是独立的,服务器端无法判断本次请求和上一次请求是否来自同一个用户,进而也就无法判断用户的登录状态。

为了解决 HTTP 无状态的问题,Lou Montulli 在 1994 年的时候,推出了 Cookie。Cookie 是服务器端发送给客户端的一段特殊信息,这些信息以文本的方式存放在客户端,客户端每次向服务器端发送请求时都会带上这些特殊信息。有了 Cookie 之后,服务器端就能够获取到客户端传递过来的信息了,如果需要对信息进行验证,还需要通过 Session。客户端请求服务端,服务端会为这次请求开辟一块内存空间,这个便是 Session 对象。有了 Cookie 和 Session 之后,我们就可以进行登录认证了。

Cookie + Session 实现流程:

  • 用户访问com/pageA,并输入密码登录。

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

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

Cookie + Session 存在的问题:

  • 由于服务器端需要对接大量的客户端,也就需要存放大量的 SessionId,这样会导致服务器压力过大。

  • 如果服务器端是一个集群,为了同步登录态,需要将 SessionId 同步到每一台机器上,无形中增加了服务器端维护成本。

  • 由于 SessionId 存放在 Cookie 中,所以无法避免 CSRF 攻击。

移动端基于token的认证机制

为了解决 Session + Cookie 机制暴露出的诸多问题,我们可以使用 Token 的登录方式。Token 是服务端生成的一串字符串,以作为客户端请求的一个令牌。当第一次登录后,服务器会生成一个 Token 并返回给客户端,客户端后续访问时,只需带上这个 Token 即可完成身份认证。

Token 机制实现流程:

用户首次登录时:

  • 用户输入账号密码,并点击登录。

  • 服务器端验证账号密码无误,创建 Token。

  • 服务器端将 Token 返回给客户端,由客户端自由保存。

后续页面访问时:

  • 用户访问com/pageB 时,带上第一次登录时获取的 Token。

  • 服务器端验证 Token ,有效则身份验证成功。

Token 的优缺点:

  • 服务器端不需要存放 Token,所以不会对服务器端造成压力,即使是服务器集群,也不需要增加维护成本。

  • Token 可以存放在前端任何地方,可以不用保存在 Cookie 中,提升了页面的安全性。

  • Token 下发之后,只要在生效时间之内,就一直有效,如果服务器端想收回此 Token 的权限,并不容易。

二维码扫码登录的原理

二维码扫码登录的流程图:

扫码登录可以分为三个阶段:待扫描、已扫描待确认、已确认。

待扫描阶段

待扫描阶段也就是流程图中 1~5 阶段,即生成二维码阶段,这个阶段跟移动端没有关系,是 PC 端跟服务端的交互过程。

每次用户打开PC端登陆请求,系统返回一个唯一的uid,并将uid的信息绘制成二维码返回给用户。这里的uid一定是唯一的,否则就会造成你登陆了其他用户的账号或者其他用户登陆你的账号。

此时在 PC 端会启动一个定时器,轮询查询二维码是否被扫描。如果移动端未扫描的话,那么一段时间后二维码将会失效。二维码增加超时机制之后,会增加攻击者攻击的难度,不过攻击者也可能利用脚本去自动刷新二维码。

已扫描待确认阶段

流程图中第 6 ~ 10 阶段,我们在 PC 端登录微信时,手机扫码后,PC 端的二维码会变成已扫码,请在手机端确认。这个阶段是移动端跟服务端交互的过程。

首先移动端扫描二维码,获取二维码 ID,然后将手机端登录的信息凭证(token)和 二维码 ID 作为参数发送给服务端,此时的手机一定是登录的,不存在没登录的情况。

服务端接受请求后,会将 token 与二维码 ID 关联,为什么需要关联呢?你想想,我们使用微信时,移动端退出, PC 端是不是也需要退出,这个关联就有点把子作用了。然后会生成一个一次性 token,这个 token 会返回给移动端,一次性 token 用作确认时候的凭证。

PC 端的定时器,会轮询到二维码的状态已经发生变化,会将 PC 端的二维码更新为已扫描,请确认。

二维码扫描一定要有这个确认的页面,明确告知用户要做的操作,假设没有确认这个环节,那么是极其容易上当的。另外,二维码扫描确认之后,再往用户app或手机等发送登录提醒的通知,告知如果不是本人登录的,则建议用户立即修改密码

已确认

流程图中的 第 11 ~ 15 步骤,这是扫码登录的最后阶段,移动端携带上一步骤中获取的临时 token ,确认登录,服务端校对完成后,会更新二维码状态,并且给 PC 端生成一个正式的 token ,后续 PC 端就是持有这个 token 访问服务端。

微信二维码扫码登录的原理相关推荐

  1. 应用宝ysdk微信二维码扫码登录没有回调问题

    在更新ysdk版本的时候,发现新版本ysdk增加了微信二维码扫码登录,但是打包测试发现并没有登录回调. 接下来就开始排查了,检查了生命周期都没有问题,那问题出现在哪里呢?用ysdk提供的demo换上我 ...

  2. js调用微信利用二维码扫码登录

    js调用微信利用二维码扫码登录 准备工作 网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统. 在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐 ...

  3. spring boot高性能实现二维码扫码登录(中)——Redis版

    前言 本打算用CountDownLatch来实现,但有个问题我没有考虑,就是当用户APP没有扫二维码的时候,线程会阻塞5分钟,这反而造成性能的下降.好吧,现在回归传统方式:前端ajax每隔1秒或2秒发 ...

  4. spring boot高性能实现二维码扫码登录(上)——单服务器版

    前言 目前网页的主流登录方式是通过手机扫码二维码登录.我看了网上很多关于扫码登录博客后,发现基本思路大致是:打开网页,生成uuid,然后长连接请求后端并等待登录认证相应结果,而后端每个几百毫秒会循环查 ...

  5. 对于微信二维码相关官方文档的一些注解(微信登录和绑定微信、关注公众号)

    转载自:https://www.jianshu.com/p/d533c69be034 由于微信官方文档对此的描述虽然还可以,但是还是有一些让人疑惑的地方,所以笔者做了一些注解,希望对大家有所帮助 为什 ...

  6. 开放平台–扫描微信二维码登录

    准备 如不了解第三方登录流程,建议先大概了解一下,在来看看代码. 说明: 由于开放平台无测试号测试,所以只能上开放平台进行配置信息.公众平台的测试号并不能给开放平台使用. 微信开放平台地址:https ...

  7. java微信二维码登录

    1.注册 微信开放平台:https://open.weixin.qq.com 2.邮箱激活 3.完善开发者资料 4.开发者资质认证 准备营业执照,1-2个工作日审批.300元 5.创建网站应用 提交审 ...

  8. Day212.OAuth2、微信二维码登入注册功能、用户登录信息前后端供、讲师列表前后端 -谷粒学院

    谷粒学院 OAuth2的使用场景 一.OAuth2解决什么问题 1.OAuth2提出的背景 照片拥有者想要在云冲印服务上打印照片,云冲印服务需要访问云存储服务上的资源 2.图例 资源拥有者:照片拥有者 ...

  9. 二维码扫码登录是什么原理?

    在日常生活中,二维码出现在很多场景,比如超市支付.系统登录.应用下载等等.了解二维码的原理,可以为技术人员在技术选型时提供新的思路.对于非技术人员呢,除了解惑,还可以引导他更好地辨别生活中遇到的各种二 ...

  10. 细说二维码扫码登录的原理

    前言 在日常生活中,二维码出现在很多场景,比如超市支付.系统登录.应用下载等等.了解二维码的原理,可以为技术人员在技术选型时提供新的思路.对于非技术人员呢,除了解惑,还可以引导他更好地辨别生活中遇到的 ...

最新文章

  1. Linux下配置Golang开发环境
  2. c语言16进制按10进制输出,C语言编程:写一个函数,输入一个16进制数,输出相应的10进制数。...
  3. 解决 org.apache.hadoop.io.nativeio.NativeIO$POSIX.stat异常
  4. 深度学习(2) - 感知器
  5. 京东健康携手国控湖北 首批1500万只口罩专供湖北
  6. 设计趋势|平面设计的热点是什么?
  7. 日本「AI 鱼脸识别」项目,每分钟识别 100 条,有望让渔民不再“摸鱼”
  8. .Net读取Excel的数据类型不统一获取空值问题
  9. C#语法基础(二)---数组stringArrayList
  10. 永中集成Office要敢于继续挑战微软Office
  11. linux驱动 平台设备驱动模型
  12. 复联4定档 4.24——十一年21部漫威电影,用数据为你梳理口碑、票房、主演最佳...
  13. SSD-Tensorflow 目标检测(VOC2007)
  14. 一节双曲型方程基于MATLAB的求解,二维双曲型方程的分组并行格式及其数值实验...
  15. java总是permgen out_java.lang.OutOfMemoryError: PermGen space及其解决方法
  16. WPS如何让表格里的文字上下居中
  17. NCPC 2012 Problem B Bread Sorting
  18. [Usaco2008 Open]Crisis on the Farm 牧场危机
  19. 漫画 | 老板,医生说我胃不好!!
  20. 苹果ll是什么版本_新的iPad Pro和旧版本有什么区别?苹果背后的策略是什么?...

热门文章

  1. vulnhub-Odin
  2. 华为手机卡在升级界面_华为安装升级包卡在5 华为手机如何刷机?
  3. 【NLP】HuggingFace BERT 微博评论情感分类
  4. SpacePack 运维工具之 Auto fdisk
  5. 数据库加密乱码_加密数据库中的密码
  6. 弹性波波长计算公式_固体中的弹性波
  7. 汇编(五)堆栈平衡和寻址方式-ESP EBP
  8. 各种建筑风格及其代表建筑
  9. c语言教材1-8章参考答案,C语言课后习题参考答案(第1-8章)
  10. 随着公网对讲机市场占有率得不断增长,部分对讲机厂家为了得到用户的认可,不断升级对讲机及时以及对讲机的功能和性能,因此越来越多的全国对讲机以及公网对讲机问世。但是某些用户不清楚对讲机的原理,不禁会问