websocket鉴权授权

515 阅读1分钟

websocket的鉴权授权方案

限定允许的连接,其它未授权的连接不可建立,防止恶意连接。 连接建立后再进行鉴权,超时未监管关闭该连接

流程:

  1. 发起请求的浏览器端,发出协商报文:
  2. 服务器端响应101状态码(即切换到socket通讯方式),其报文:
  3. 协议切换完成,双方使用Socket通讯

鉴权

  1. 在连接建立时,检查连接的HTTP请求头信息(比如cookies中关于用户的身份信息)
  2. 在每次接收到消息时,检查连接是否已授权过,及授权是否过期
  3. 以上两点,只要答案为否,则服务端主动关闭socket连接

授权 服务端在连接建立时,颁发一个ticket给peer端,这个ticket可以包含但不限于:

  1. peer端的uniqueId(可以是ip,userid,deviceid…任一种具备唯一性的键)
  2. 过期时间的timestamp
  3. token:由以上信息生成的哈希值,最好能加盐

安全性的补充说明

有朋友问:这一套机制如何防范重放攻击,私以为可以从以下几点出发:

  • 可以用这里提到的expires,保证过期,如果你愿意,甚至可以每次下发消息时都发送一个新的Ticket,只要上传消息对不上这个Ticket,就断开,这样非Original Peer是没法重放的
  • 可以结合redis,实现 ratelimit,防止高频刷接口,这个可以参考 express-rate-limit,原理很简单,不展开
  • 为防止中间人,最好使用wss(TLS

SSE

一种服务器端到客户端(浏览器)的单向消息推送(半双工通信模式)

http2