写点什么

秘密任务 3.0:如何通过 JWT 认证确保 WebSockets 安全

作者:数据追梦人
  • 2025-04-18
    广东
  • 本文字数:2971 字

    阅读完需:约 10 分钟

间谍机构 3.0:如何通过 JWT 认证确保 WebSockets 安全

在之前的文章中,我们探讨了如何通过 WebSockets + DTOs 设计实时操作。现在,我们迎来了一项新的挑战:确保 WebSocket 通信在任务执行过程中保持安全。如果敌方潜伏在我们的实时通信渠道中,机密情报可能会被泄露。


任务: 实现 JWT 认证,确保只有 授权特工 能访问我们的网络。我们开始行动!

1️⃣ 为什么要保护 WebSockets?

security-265130_1280.jpg


WebSockets 允许 即时双向通信,但如果没有适当的安全措施,敌方特工可能会:


  • 拦截传输(敏感情报泄露)

  • 冒充特工(会话劫持)

  • 发起未授权攻击(破坏任务关键数据)


🔹 你的目标: 在建立连接之前,使用 JWT 对每个特工进行 身份认证

2️⃣ JWT + WebSockets 如何协同工作

步骤 1:特工认证(JWT 发行)

在特工能够访问 WebSocket 任务频道之前,必须先进行身份认证并获得授权。

1. 特工通过安全的 API 登录总部

  • 特工提供其 操作凭证(例如,用户名和密码或多因素认证)。

  • 请求通过 HTTPS 发送,以防止监听。

  • 示例 API 请求:


     POST /api/auth/login       Content-Type: application/json       { "username": "AgentX", "password": "TopSecret123" }
复制代码

2. 服务器验证凭证并发放 JWT 令牌

  • 如果认证成功,服务器生成一个 JWT(JSON Web Token),其中包含:

  • 特工的 唯一 ID

  • 特工的 授权级别

  • 一个 过期时间 用于强制会话时限

  • JWT 使用 私钥 签名,以防篡改。


示例 JWT 负载:


   {     "sub": "AgentX",     "role": "field-operative",     "exp": 1714598400   }
复制代码

3. 特工接收 JWT 令牌

特工在成功认证后,服务器会将 JWT 令牌作为 HTTP-only Cookie 返回给客户端。


更安全的方法: 服务器 设置一个 HTTP-only cookie,确保它随着请求自动发送。


示例 HTTP 响应(使用 Cookie 方法):


HTTP/1.1 200 OK  Set-Cookie: jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...; HttpOnly; Secure; SameSite=Strict  
复制代码

4. 特工如何处理 JWT 令牌

  • 浏览器 自动存储 Cookie,并在随后的请求中自动附带。

  • 不需要客户端手动存储令牌。

  • 令牌对 JavaScript 不可访问,防止 XSS 攻击。


客户端示例(无需手动存储 JWT):


fetch("https://hq-secure.com/api/auth/login", {  method: "POST",  credentials: "include", // 确保发送 Cookie  headers: { "Content-Type": "application/json" },  body: JSON.stringify({ username: "AgentX", password: "TopSecret123" }),})  .then(response => {    if (response.ok) console.log("登录成功,JWT 存储在 HttpOnly Cookie 中!");  })  .catch(error => console.error("认证失败", error));
复制代码


缺点: WebSockets 不会自动附带 Cookie,因此客户端需要 手动获取 JWT,并在连接 WebSocket 时附上。

步骤 2:建立安全的 WebSocket 连接

一旦认证通过,特工必须在建立 WebSocket 连接时提供 JWT 令牌。

1. 特工在连接请求时提供 JWT

  • WebSocket 客户端将 JWT 放入请求头 或作为 查询参数

  • 示例 WebSocket 连接请求:


     const socket = new WebSocket("wss://hq-secure.com/missions?token=eyJhbGciOiJIUzI1...");
复制代码

2. WebSocket 服务器在建立连接前验证 JWT

  • 服务器 提取并验证 JWT,检查:

  • 签名完整性(确保未被篡改)

  • 过期时间(拒绝过期令牌)

  • 特工的授权级别(仅允许授权访问)

  • 如果 JWT 无效或过期,连接会被拒绝。

3. 访问控制:授权或拒绝

  • 如果有效,WebSocket 连接建立,特工可以接收任务更新。

  • 如果无效或过期,服务器 立即关闭连接

  • 示例服务器端验证:


     if (!isValidJWT(token)) {         socket.close(4001, "未经授权:无效令牌");     }
复制代码


通过强制 基于 JWT 的认证,我们确保只有 授权特工 可以访问任务数据,同时维持 安全的实时通信

3️⃣ 在 Node.js 中实现 JWT + WebSockets

步骤 1:安装所需工具

npm install express socket.io jsonwebtoken cors
复制代码

步骤 2:生成和验证 JWT 凭证

const jwt = require("jsonwebtoken");const SECRET_KEY = "top_secret_mission_code"; // 🔥 保持机密!
// 生成安全的授权令牌function generateToken(agent) { return jwt.sign({ id: agent.id, codename: agent.codename }, SECRET_KEY, { expiresIn: "1h" });}
// 验证特工授权function verifyToken(token) { try { return jwt.verify(token, SECRET_KEY); } catch (err) { return null; }}
复制代码

步骤 3:WebSocket 总部 - 仅接受授权特工

const express = require("express");const http = require("http");const { Server } = require("socket.io");
const app = express();const server = http.createServer(app);const io = new Server(server, { cors: { origin: "*" } });
// 安全的 WebSocket 通信io.use((socket, next) => { const token = socket.handshake.auth.token; const agent = verifyToken(token); if (!agent) return next(new Error("未经授权的访问 - 授权失败!")); socket.agent = agent; // 将特工信息附加到会话 next();});
io.on("connection", (socket) => { console.log(`特工已连接: ${socket.agent.codename}`);
socket.on("message", (msg) => { console.log(`来自 ${socket.agent.codename} 的传输: ${msg}`); });
socket.on("disconnect", () => { console.log(`特工断开连接: ${socket.agent.codename}`); });});
server.listen(3000, () => console.log("安全 WebSocket 总部在端口 3000 上运行"));
复制代码


现在,只有经过验证的特工才能建立安全的通信通道!

4️⃣ 现场特工设置:连接到安全的 WebSocket

步骤 1:安装 WebSocket 客户端模块

npm install socket.io-client
复制代码

步骤 2:现场特工连接总部

import { io } from "socket.io-client";
const clearanceToken = localStorage.getItem("jwt"); // 获取安全令牌const socket = io("http://localhost:3000", { auth: { token: clearanceToken },});
socket.on("connect", () => { console.log("✅ 与总部建立了安全通道!");});
socket.on("message", (msg) => { console.log("收到的传输:", msg);});
socket.on("disconnect", () => { console.log("安全通道丢失!正在重试...");});
复制代码


现在,只有拥有有效清除令牌的特工才能访问任务更新!

5️⃣ 特工安全协议:最佳实践

使用 HTTP-only Cookies 存储 JWT(防止敌人 XSS 攻击)。


设置短生命周期令牌(例如 1 小时有效期),以减少安全风险。


实施刷新令牌,以便令牌过期后,特工能够重新认证。


加密 WebSocket 通道(WSS) 使用 SSL/TLS 保障通信安全。


监控并记录所有 WebSocket 连接,以检测可疑活动。

6️⃣Apipost 如何提供帮助

Apipost 是一款强大的工具,可帮助你实时测试、调试和监控 WebSocket 通信。

Apipost 的好处:

  • 一体化 API 解决方案 → 设计、测试、调试、CI/CD 集成、模拟服务、无缝文档化 —— 一应俱全。

  • 无需登录 → 直接开始使用,无需账号注册。

  • 智能认证 → 内置支持 OAuth 2.0、JWT Bearer、AWS 签名、基本认证等。

  • 支持多种通信协议 → 支持 HTTP、GraphQL、WebSocket、TCP、SSE 等。

任务完成:为什么选择 JWT + WebSockets?


总部指令: 你现在具备了利用 JWT 和 WebSockets 构建 安全实时网络 的能力。将这一策略部署到实战中,确保没有未经授权的访问!

发布于: 刚刚阅读数: 5
用户头像

还未添加个人签名 2025-03-26 加入

还未添加个人简介

评论

发布
暂无评论
秘密任务 3.0:如何通过 JWT 认证确保 WebSockets 安全_数据追梦人_InfoQ写作社区