首页
学习
活动
专区
圈层
工具
发布
技术百科首页 >WebSocket >WebSocket是否支持跨域通信?如何处理CORS?

WebSocket是否支持跨域通信?如何处理CORS?

词条归属:WebSocket

1. WebSocket的跨域机制

WebSocket 协议本身不受浏览器同源策略(Same-Origin Policy)的直接限制,这意味着运行在 https://app.example.com 页面中的 JavaScript 可以合法地创建指向 wss://api.other-domain.com 的 WebSocket 连接。然而,浏览器在发起 WebSocket 握手请求时,会自动在 HTTP 头中添加 Origin 字段(如 Origin: https://app.example.com),表明该请求的来源。服务端需要显式检查这个 Origin 字段,决定是否允许该跨域连接。如果服务端未校验或错误配置了 Origin 白名单,可能导致跨站 WebSocket 劫持(CSWSH)攻击。

2. 与 CORS 的区别

HTTP 的跨域资源共享(CORS)机制依赖服务端在响应头中设置 Access-Control-Allow-Origin 等字段来告知浏览器是否允许跨域请求。WebSocket 的跨域处理则发生在 HTTP 握手阶段:服务端在决定是否返回 101 Switching Protocols 响应时,需要检查请求头中的 Origin 字段,如果不在白名单中,应直接拒绝握手(返回 403 Forbidden)。值得注意的是,给 WebSocket 服务添加 Access-Control-Allow-Origin 响应头是无效的,因为握手成功后,通信就不再使用 HTTP 语义,CORS 机制也不适用。

3. 实践中的跨域配置

在 Node.js 中使用 ws 库时,可以通过 verifyClient 回调函数来验证 Origin:检查请求头中的 origin 字段是否在内置的白名单列表中(如 ['https://app.example.com', 'http://localhost:3000']),如果不在列表中,返回 false 拒绝连接。在使用 Nginx 作为反向代理时,需要确保正确透传 Upgrade 和 Connection 头(proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";),否则 WebSocket 握手请求无法到达后端应用,导致跨域连接失败。在生产环境中,应该精确匹配可信域名,避免使用通配符(如 *)放行所有 Origin。

相关文章
WebApi开启CORS支持跨域POST
概念:CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。 现象:如请求出现:Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested res
磊哥
2018-05-08
1.6K0
使用 WebSocket 实现跨域 iframe 通信
本文是使用 WebSocket 实现跨域 iframe 通信思路实现了一个本地 Demo,功能有:
草帽lufei
2024-05-08
1.2K0
SpringBoot开发秘籍 - 处理跨域请求CORS
CORS(Cross-Origin Resource Sharing)"跨域资源共享",是一个W3C标准,它允许浏览器向跨域服务器发送Ajax请求,打破了Ajax只能访问本站内的资源限制。
JAVA日知录
2021-04-07
1.1K0
整站HTTPS后的跨域请求 CORS是否还有效?
| 导语  手Q马上就要全量https了,很多业务都有跨域ajax请求的需求,原来使用的CORS头在HTTPS环境中还继续能用吗?我搜遍了谷歌、百度,都没看到有明确的答案,那么就自己来尝试一下吧。 关于CORS在HTTPS环境下到底效果如何,一直没找到明确的答案。在MDN等网页只能看到CORS是解决HTTP跨域的方案,或者HTTP访问HTTPS/HTTPS访问HTTP都属于跨域范围,但没有人提到两个HTTPS站点能否通过CORS互相访问。那么,就自己动手吧。 首先,使用nodejs搭建一个https服务器。
用户1258909
2018-07-03
1K0
如何配置ajax请求跨域携带cookie,cors支持ajax请求携带cookie
3、ajax在发送跨域请求时如果想携带cookie,必须将请求对象的withcredentials属性设置为true。
挥刀北上
2019-07-19
19.1K5
点击加载更多
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
领券