马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
在实时通讯场景(如在线谈天、实时数据推送)中,WebSocket因其高效的双向通讯本领成为首选技能
然而,当客户端与服务器摆设在差别源时,跨域题目同样大概拦阻WebSocket的毗连
一、WebSocket与跨域的关系
WebSocket的跨域限定
固然WebSocket协议本身不受同源战略的直接限定,但欣赏器在创建WebSocket毗连时仍会校验跨域安全性:
客户端发起WebSocket毗连时,欣赏器会在握手哀求的HTTP头中自动添加Origin字段(如Origin: https://client-domain.com)
服务器必须显式验证Origin字段,决定是否允许该跨域毗连。
若服务器未做验证,恶意网站大概通过伪造Origin挟制WebSocket通讯
与CORS的区别
CORS:针对HTTP哀求,依赖服务器设置相应头(如Access-Control-Allow-Origin)
WebSocket:在HTTP握手阶段完成跨域验证,无需额外相应头,但需服务器自动查抄Origin字段
二、WebSocket跨域的实现方式
服务器端验证Origin(核心步调)
以Node.js的ws库为例,手动验证Origin字段:- const WebSocket = require('ws');
- const server = new WebSocket.Server({ port: 8080 });
- server.on('connection', (socket, request) => {
- const origin = request.headers.origin;
- const allowedOrigins = ['https://client-domain.com', 'https://trusted-site.com'];
- if (!allowedOrigins.includes(origin)) {
- socket.close(1008, 'Unauthorized origin'); // 拒绝非法来源
- return;
- }
- // 合法连接的处理逻辑
- socket.on('message', (message) => {
- console.log('Received:', message);
- });
- });
复制代码 Nginx反向署理(生产环境保举)
通过Nginx署理埋伏跨域细节,使欣赏器以为WebSocket服务与前端同源:- server {
- listen 80;
- server_name client-domain.com;
- location /ws {
- proxy_pass http://websocket-server:8080;
- proxy_http_version 1.1;
- proxy_set_header Upgrade $http_upgrade;
- proxy_set_header Connection "Upgrade";
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header Origin ""; # 可选:覆盖Origin头以简化服务器验证
- }
- }
复制代码 前端毗连地点改为同源的ws://client-domain.com/ws,Nginx将哀求转发至真实的WebSocket服务器。
前端代码示例
- const socket = new WebSocket('wss://client-domain.com/ws');
- socket.onopen = () => {
- console.log('WebSocket连接已建立');
- socket.send('Hello Server!');
- };
- socket.onmessage = (event) => {
- console.log('收到消息:', event.data);
- };
- socket.onerror = (error) => {
- console.error('连接错误:', error);
- };
复制代码 三、安全性考量
严格校验Origin字段
克制利用通配符(如允许全部Origin),防止跨站WebSocket挟制(Cross-Site WebSocket Hijacking)。
利用WSS协议(WebSocket over TLS)
加密通讯防止中央人攻击,同时今世欣赏器要求安全上下文(HTTPS页面)中才气利用WebSocket。
身份验证与鉴权
在握手阶段转达Token(如URL参数wss://server.com/ws?token=xxx)。
利用Cookie时需设置SameSite和Secure属性。
四、优缺点
优点
- 原生支持双向实时通讯,延长低
- 绕过传统HTTP跨域限定,实用复杂场景
- 今世欣赏器广泛兼容(IE10+)
缺点
- 需服务器自动验证Origin
- 长毗连大概增长服务器资源斲丧
- 需额外处理惩罚断线重连、心跳检测等逻辑
总结
WebSocket通过基于Origin字段的握手验证机制,是跨域实时通讯
须要在服务器端严格校验泉源,并团结反向署理、TLS加密等技能保障安全性
对于须要高频双向数据交换的应用(如在线协作、实时监控 ),WebSocket的跨域本领将成为关键上风
|