websocket安全认证必须在握手阶段完成,推荐服务端拦截http upgrade请求校验token、cookie或url参数,并启用wss加密及tls 1.2+,配合session绑定与心跳验证防止劫持。

WebSocket 安全认证不能在连接建立后才做,必须在握手阶段完成验证,否则存在未授权连接风险。核心思路是:利用 WebSocket 构造函数的 headers(仅限浏览器环境受限)或服务端拦截升级请求(更可靠),结合 Token、Cookie、URL 参数等方式传递凭证,并在服务端校验有效性。
服务端拦截 HTTP Upgrade 请求做鉴权(推荐)
WebSocket 握手本质是 HTTP GET 请求带 Upgrade: websocket 头。Node.js(如 ws 库)或 Nginx 可在协议升级前检查请求头、查询参数或 Cookie。
-
用 query 参数传 token(简单常用):
前端连接时写new WebSocket("wss://example.com/ws?token=abc123");服务端解析url查询字符串,验证 token 签名、过期时间、权限范围。 -
读取 Cookie 鉴权(需同域或配置 credentials):
前端建立连接时设置credentials: 'include'(WebSocket构造函数不支持该选项,需用fetch+upgrade模拟不现实);更可行的是让前端先发一次带 Cookie 的普通请求获取临时 token,再用于 WebSocket 连接。 -
校验 Origin 防止跨站滥用:
服务端检查Origin请求头是否在白名单内(注意:Origin 可被伪造,仅作辅助,不可替代身份认证)。
使用 JWT 或短期有效 Token 做握手凭证
避免长期有效的密钥暴露风险,推荐使用签名 Token,在握手时一次性验证。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- Token 应含用户 ID、过期时间(
exp)、随机 jti(防重放),由后端签发,前端存储在内存或localStorage(注意 XSS 风险)。 - 服务端收到握手请求后,解析并验证签名、时效性、是否被吊销(可查 Redis 黑名单)。
- 验证失败立即拒绝升级,返回
401或403,ws库可通过verifyClient钩子实现:
const wss = new WebSocket.Server({
port: 8080,
verifyClient: (info, done) => {
const url = new URL(info.req.url, 'http://localhost');
const token = url.searchParams.get('token');
if (!token || !verifyJWT(token)) {
return done(false, 401, 'Unauthorized');
}
done(true);
}
});
启用 WSS(TLS 加密)是安全前提
明文 WebSocket(ws://)传输的 token、Cookie 或任何凭证都可被中间人截获。必须使用 wss:// 协议,确保全程加密。
- Nginx 反向代理时,将
wss流量终止在 Nginx,用 HTTPS 证书;后端与 Nginx 之间可用ws://(内网可信)。 - 自签名证书不可用于生产环境,需从 Let’s Encrypt 等权威机构获取有效证书。
- 禁用老旧 TLS 版本(如 TLS 1.0/1.1),强制 TLS 1.2+。
补充防护:连接后二次校验与心跳绑定
握手通过只代表初始合法,还需防止连接复用或会话劫持。
- 服务端为每个合法连接生成唯一 session ID,存入内存或 Redis,关联用户身份和过期时间。
- 首次消息发送时,要求客户端附带签名或 nonce,服务端比对 session 状态,防止“握手后冒充”。
- 结合心跳帧(ping/pong)定期验证连接活跃性与归属,超时未响应或签名异常则主动关闭。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










