pc端扫码登陆中的安全性问题

314 阅读2分钟

一、安全设计类问题

  1. 如何防止二维码被恶意截屏复用?

    • 动态刷新机制:二维码ID绑定PC设备指纹,10秒自动失效并重新生成
    • 加密混淆:对二维码内容进行非对称加密,仅目标APP可解密
  2. 临时Token的防重放攻击方案?

    • 一次性使用:服务端标记临时Token状态,确认后立即失效
    • 时间戳+IP双因子校验

二、高并发场景优化

  1. 轮询导致服务端压力大,如何优化?

    • 长轮询+WebSocket混合:扫码前用长轮询,扫码后切换WebSocket推送
    • 分级轮询策略:未扫码时低频(5秒/次),扫码后高频(1秒/次)
  2. Redis集群中二维码状态同步延迟怎么处理?

    • 本地缓存+版本号:PC端缓存状态版本,服务端返回增量变更

三、异常场景设计

1. ‌移动端确认后PC端断网,如何恢复登录?

服务端持久化登录态,PC端重连后通过设备ID自动恢复会话

以下是PC端断网后确认扫码登录状态的完整技术方案:

  1. 持久化登录凭证机制

    • PC端首次生成二维码时,服务端会将二维码ID与设备指纹(如浏览器指纹4)绑定存储到Redis,有效期通常为5分钟
    • 移动端扫码确认后,服务端会将该设备指纹标记为"已授权"状态
  2. 断网状态检测与恢复

    // PC端检测网络恢复后的处理逻辑
    window.addEventListener('online', () => {
      const deviceId = getBrowserFingerprint(); // 获取设备唯一标识
      axios.post('/session/restore', { deviceId })
        .then(res => {
          if (res.data.loggedIn) {
            updateAuthState(res.data.token); // 恢复登录态
          }
        });
    });
    
  3. 服务端验证流程

    • 接收设备ID后,服务端会检查:

      1. 该设备是否存在未过期的授权记录
      2. 移动端扫码确认时间是否在有效期内
      3. 会话令牌是否未被撤销

. ‌多设备同时扫描同一二维码的冲突解决?

乐观锁机制:仅第一个完成绑定的设备生效,后续请求返回冲突提示