CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
WebSocket 实时通信/课时/鉴权与安全
RawBlame
课时目录12 节

WebSocket 实时通信

  1. 01WebSocket 是什么
  2. 02协议与握手
  3. 03Spring WebSocket
  4. 04STOMP 消息
  5. 05浏览器客户端
  6. 06Next.js 与 WebSocket
  7. 07鉴权与安全
  8. 08水平扩展
  9. 09SSE 对照
  10. 10Nginx 反代升级
  11. 11测试与调试
  12. 12综合练习

鉴权与安全

握手阶段 token、Origin 校验。

30 分钟

鉴权与安全

WebSocket 没有 每次消息的 Cookie 自动重发语义与 REST 相同,但握手仍是 HTTP,可在 Upgrade 前完成鉴权。实验台需与 sb-security / Sa-Token 对齐。

学习目标

  • 在握手阶段校验 JWT 或 Session
  • 配置 setAllowedOrigins 防 CSWSH
  • 理解 STOMP 连接后的授权

握手带 Token

方式一:Query(简单,注意日志泄露)

const ws = new WebSocket(`wss://host/ws?token=${accessToken}`);

方式二:Cookie(同源推荐)

浏览器同源请求自动带 Sa-Token cookie;Spring 在 HandshakeInterceptor 里读 HttpSession。

public class AuthHandshakeInterceptor implements HandshakeInterceptor {

    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response,
                                   WebSocketHandler wsHandler, Map<String, Object> attributes) {
        // 从 cookie / header 取 token,校验后把 userId 写入 attributes
        attributes.put("userId", currentUserId);
        return true; // false → 握手失败 403
    }
}

注册:registry.addEndpoint("/ws").addInterceptors(authInterceptor)...

Origin 校验

registry.addEndpoint("/ws")
        .setAllowedOrigins("https://coderoadmap.local"); // 生产禁用 *

与 Nginx Host / ngx-proxy 传递一致,防恶意站点跨站 WebSocket 劫持。

STOMP 层授权

configureClientInboundChannel 拦截 SUBSCRIBE:比对 destination 与 ACL(REST 创建实验间时写入成员列表)。生产用 wss://;Token 优先 Cookie/Header,避免进 access log;速率限制可结合 redis-essentials。

练习

  • 无 token 握手应返回 403,用 curl 验证 Upgrade 失败
  • 对照 sb-jwt 复用同一 JwtParser
  • 设计:用户 A 能否订阅用户 B 的 private /queue?

小结

鉴权在握手完成,授权在订阅/发送时复核。 下一课水平扩展。

加载本节练习…
← 上一课Next.js 与 WebSocket下一课 →水平扩展