WebSocket 的鉴权验权
websocket之四:WebSocket 的鉴权授权方案 - duanxz - 博客园 (cnblogs.com) (opens new window)
协议相关
首先要明确的是,WebSocket 是基于 HTTP 的协议(而 HTTP 基于 TCP,有时我们也说 WebSocket 基于 TCP 协议),HTTP 有诸多缺点,如
- 首先,他不支持异步请求,解决方案如 Ajax
- 其次,服务端无法进行主动推送(非双工通信),可使用 Comet 对请求进行挂起,延迟推送,这样客户端不需要忙等(但实际上服务端做了忙等的工作)
- 当然,HTTP 还有着其他的缺点,如他本身是一个无状态的协议,即每个 HTTP 连接无法对用户进行识别,需要服务端维护用户 Session,同时用户在本地 Cookie 中存储 SessionID,进行状态的维护
- 并且,HTTP 并没有安全方面的考量,其明文在链路中直接封装在 TCP 报文中传输,解决方案是 HTTPS,通过在 HTTP 外层再套一层 SSL 协议,实现数据加密、身份验证、完整性验证,其中身份验证通过证书实现,完整性验证通过数字签名实现
当然了,这样的缺点是完全能接受的,人们需要一个轻量的、易扩展的并且能够保证可靠传输的应用层协议
为了实现异步请求和服务端推送的功能,提出了 WebSocket 这样的全双工异步通信的协议,相应的,由于 WebSocket 基于 HTTP,他天然的继承了这些个 HTTP 的部分“缺点”(3、4 )
This protocol doesn’t prescribe any particular way that servers can authenticate clients during the WebSocket handshake. The WebSocket server can use any client authentication mechanism available to a generic HTTP server, such as cookies, HTTP authentication, or TLS authentication.
WebSocket 协议的 RFC(Request For Comment) 提到,可以使用例如 Cookies、HTTP auth 或 TLS auth 来进行鉴权,本文关注其安全性方面的考量,在基本的 WebSocket 连接上添加简单的身份验证和完整性验证的功能