V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
doveshelly
V2EX  ›  程序员

app 通过 websocket 与后台端通信如何保证安全性

  •  
  •   doveshelly · 2023-08-15 15:47:49 +08:00 · 2103 次点击
    这是一个创建于 455 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前项目有个需求,用户 app 二维码被扫码头扫了之后,能即时收到通知。 当前做法:扫码头扫码之后将数据传输至后端( java 实现),后台通过 mpass 进行提醒,用户反馈通知有延迟,不开通知也收不到; 新方案:考虑采用 websocet 通知,app 在展码阶段就通过 websocket 与后端建立连接,扫码头扫到码之后通过 websocket 主动推送通知到 app 端。 目前遇到几个问题: ( 1 )安全性如何实现,需要采用 SSL 认证吗 ( 2 )后端分布式多节点,目前能想到的是把连接信息和节点信息都存起来,发通知的时候根据找特定节点去发,有没更好的方式呢

    请教各位大佬,帮忙看看

    20 条回复    2023-08-16 10:07:01 +08:00
    cpstar
        1
    cpstar  
       2023-08-15 15:50:36 +08:00
    支付二维码都是怎么做的?
    iOCZ
        2
    iOCZ  
       2023-08-15 15:51:28 +08:00
    wss vs ws
    haha512
        3
    haha512  
       2023-08-15 16:02:53 +08:00
    1. 肯定要用 SSL 认证,即 wss ,不然和 直接 http 没啥区别,安全有问题
    2. 多节点按照 ip 均衡
    cheng6563
        4
    cheng6563  
       2023-08-15 16:10:14 +08:00
    1.套个 TLS 就行了
    2.A.把所有连接会话存到公共存储。B.后端提供非负载均衡的 WebSocket 服务列表,客户端根据自己的 ID 取模规则连接指定的服务,后端也根据同样的规则找节点。
    sujin190
        5
    sujin190  
       2023-08-15 16:21:37 +08:00
    其实 websocket 状态管理确实挺复杂的,你这个需要展码前就完成 websocket 建立吧,安全性加 TLS 就行但是服务端还是要用 token 做下校验

    其实这种短时通知其实用 http long polling 更方便,可重入实时性也有保证,展码和 http long polling 请求无关前后,spring boot 可以用 DeferredResult 就可以在等待期间释放工作线程了,其它框架估计也有类似支持,如果有多节点的话可以考虑这种

    https://gist.github.com/snower/f8ef25e57c72f9b41fb31ee8b164193b

    http long polling 的好处就是依然是无状态的,实现和维护都简单,而实时性和 websocket 一样
    mango88
        6
    mango88  
       2023-08-15 16:28:44 +08:00
    这种场景 long polling 会简单一点把
    doveshelly
        7
    doveshelly  
    OP
       2023-08-15 16:31:10 +08:00
    @sujin190 http long polling 支持服务服务端主动推送通知给 app 吗?目前设计的是在展码时 app 就去连后台的,关闭码就断开连接
    xiangyuecn
        8
    xiangyuecn  
       2023-08-15 16:33:37 +08:00
    参考二维码登录,不要想复杂了
    doveshelly
        9
    doveshelly  
    OP
       2023-08-15 16:44:58 +08:00
    @xiangyuecn 还是有点不一样的哈,二维码登录是 app 主动去扫,我们这个是 app 生成码被动扫。。
    xiangyuecn
        10
    xiangyuecn  
       2023-08-15 17:00:30 +08:00
    说你不要想复杂了 你不信😂
    sujin190
        11
    sujin190  
       2023-08-15 17:04:43 +08:00
    @doveshelly #7 http long polling 就是用于服务端主动给前端应用推送消息的,流程显示二维码的时候请求一个后端接口,但是这个接口不立刻返回,而且等着另外一个用户扫码之后请求已扫描接口请求来触发这个接口的返回,所以这个也是实时的,之所以这个流程依然是无状态的,是因为服务端会缓存已扫码状态一小段时间,所以无所谓先扫码还是先请求 http long polling ,而且如果请求 http long polling 超时就再次重试就行,知道关闭二维码页面,实现起来也简单,和轮询实现逻辑差不多,但是再次重试不延时所以是实时的
    ilingfeng
        12
    ilingfeng  
       2023-08-15 17:08:44 +08:00
    客户端每隔一段时间向后台查询扫码结果
    lshang
        13
    lshang  
       2023-08-15 17:09:00 +08:00
    听起来跟网站二维码登录或者付款码场景类似啊,你们的 app 就是需要展示二维码的网站或者需要展示付款码的 APP ,感觉生成二维码之后定期轮训一下二维码状态接口就可以了,不需要 websocket 。
    ilingfeng
        14
    ilingfeng  
       2023-08-15 17:11:01 +08:00
    长轮询 可能更好一点
    pelloz
        15
    pelloz  
       2023-08-15 17:16:31 +08:00
    轮询就好了,别弄复杂了。稍微优化一点就是被轮询的接口不要直接查询数据库,检查内存状态或者 redis 都可以。也就是防范一下极限情况数据库被轮挂了。
    coderxy
        16
    coderxy  
       2023-08-15 17:33:22 +08:00
    安全问题用 wss 即可。 其实你们这种用长轮询就可以了。 或者简单粗暴一点,客户端每 500ms 轮询一次更简单。 具体看你们业务量决定。
    qinxi
        17
    qinxi  
       2023-08-15 17:37:25 +08:00
    甚至不需要 ws. sse 就可以, 客户端后续又没有发送数据等需求
    Huelse
        18
    Huelse  
       2023-08-15 18:26:53 +08:00
    扫码头读到二维码地址发送请求,手机 app 上轮询服务端获取状态即可。其他什么事件通知背后实现也是轮询...
    mmdsun
        19
    mmdsun  
       2023-08-15 19:11:20 +08:00 via iPhone
    安全性是啥?要登录、判断授权之类的?

    spring security 支持 websocket 的
    MoYi123
        20
    MoYi123  
       2023-08-16 10:07:01 +08:00
    扫二维码轮询就行了, F12 看了下微博和淘宝都是轮询的.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1034 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 20:18 · PVG 04:18 · LAX 12:18 · JFK 15:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.