websocket 带头部信息请求 header_关于websocket跨域的一个奇怪问题

最近在建设 websocket 长连接网关,过程中遇到一件比较奇怪的事情,做下简单的记录。

需求十分的简单,websocket 网关在做权限校验的时候期望复用现有登录逻辑的 jwt-token。如下图所示,sso 与 websocket 网关属于不同的二级域名,登录的 jwt-token cookie 的 domain 设置为 *.xx.com。所以我们的期望是浏览器与 websocket 网关进行 handshark 请求时可以带上 jwt-token cookie。

e68633aff1fae2e5bcb60c29cb642fab.png

结果自然是不行的,服务端并没有收到来自 *.xx.com 的 cookie。于是开始考虑可能和跨域行为有关系。

CORS

CORS 是一种用于解决跨域的 w3c 标准,全称为 "跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器,发出 XMLHttpRequest 请求,从而克服了 AJAX 只能同源使用的限制。CORS 基于 http 协议关于跨域方面的规定,使用时,客户端浏览器直接异步请求被调用端服务端,在响应头增加响应的字段,告诉浏览器后台允许跨域。

概括的说,CORS 就是服务端对跨域权限的控制,由一组标准的 header 来控制客户端的跨域行为,不同浏览器对于 CORS 的实现均有不同。

常用的 CORS header 主要有:

  • Access-Control-Allow-Origin :指示请求的资源能共享给哪些域,可以是具体的域名或者 * 表示所有域。

  • Access-Control-Allow-Credentials :指示当请求的凭证标记为 true 时,是否响应该请求。

  • Access-Control-Allow-Headers :用在对预请求的响应中,指示实际的请求中可以使用哪些 HTTP 头。

  • Access-Control-Allow-Methods:指定对预请求的响应中,哪些 HTTP 方法允许访问请求的资源。

CORS 处理请求的流程如下:

  1. 判断当前请求是否简单请求。

  2. 如果不是简单请求,则会使用 OPTIONS 方法先发起一个预检请求 (PreFlight),预检请求通过返回的 response 里设置了对应的 header 并匹配上了才会进行下一步具体的请求。

  3. 预检请求后会发起实际请求,但会根据返回的 response header 来决定请求行为,例如根据服务端设置的 Access-Control-Allow-Credentials 值来决定请求是否携带当前域的 cookie。

这里涉及到的简单请求和非简单请求的概念,那么简单请求和非简单请求有什么区别呢?若请求满足所有下述条件,则该请求可视为简单请求:

  1. 使用了下列 HTTP 方法:GET、HEAD、POST。

  2. 只用了以下 header:Accept、Accept-Language、Content-Language、Content-Type(有额外限制)、DPR、Downlink、Save-Data、Viewport-Width、Width。

  3. 请求中的任意 XMLHttpRequestUpload 对象均没有注册任何事件监听器;XMLHttpRequestUpload 对象可以使用 XMLHttpRequest.upload 属性访问。

  4. 请求中没有使用 ReadableStream 对象。

经过一番简单的科普,回到我们的问题上来。浏览器对 websocket 的 handshark 请求会不会应用同源策略呢。我们先不回答,先来看看如果 CORS 应用在 websocket 上会是什么样的。

首先一个 websocket 的握手连接报文大概如下:


GET / HTTP/1.1

Upgrade: websocket

Connection: Upgrade

Host: ws.xx.com

Origin: http://www.xx.com

Sec-WebSocket-Key: sB9cRrP/a9NdMgdcy2VJFX==

Sec-WebSocket-Version: 11

它和普通 HTTP 请求的区别是多了两行 header


Upgrade: websocket

Connection: Upgrade

显然它们不属于 CORS 安全的 header 集合,自然浏览器会认为这不是一个 "简单请求"。那么它会按照发起 "预检请求",随后根据返回的 response header 来判断下一步行为。此处我们希望能带上当前域的 cookie,那么按照 CORS 标准,我们需要在服务端做一些配置,让其支持 CORS 并带上 Access-Control-Allow-Credentials 为 true 的 response header。

我们使用的是 Netty 来构建 websocket 网关,Netty 支持 CORS 很简单:


CorsConfig corsConfig = CorsConfigBuilder.forAnyOrigin().allowNullOrigin().allowCredentials().build();

pipeline.addLast(new CorsHandler(corsConfig));

结果是什么呢?我们的 websocket 服务端正确拿到了 *.xx.com 的 cookie,并完成了后续鉴权工作。

websocket 需要 CORS 么?

所以真相是什么呢?websocket 也需要 CORS 支持来避免跨域问题么?

google 任何 websocket 与跨域相关的问题都会告诉你,websocket 本身就是支持跨域的,websocket 本身没有同源策略!也就是说,在第一幅图中,我们应该不作任何事就可以把 xx.com 的 cookie 带到 ws.xx.com 的 websocket 网关上去,这似乎和我们实际情况不符。

我们使用的是 chrome,后来突发奇想试了下 firefox 与 safari,结论是这两者不用配置任何 CORS 相关属性就可以把 cookie 带上。难道这是 chrome 的一个 bug? 翻了翻网络,找到了一个似乎可以应征的 bug report: Cookies not sent in Websocket handshake with cookies blocked and domain whitelisted (https://bugs.chromium.org/p/chromium/issues/detail?id=947413)


作者:fredalxin

来源链接:

https://fredal.xin/websocket-cors-problem

fcd79076519f71ed4b4c8322e6288455.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hinton 最新研究:神经网络的未来是前向-前向算法

文|李梅、黄楠编|陈彩娴源|AI科技评论在未来万亿参数网络只消耗几瓦特的新型硬件上,FF 是最优算法。过去十年,深度学习取得了惊人的胜利,用大量参数和数据做随机梯度下降的方法已经被证明是有效的。而梯度下…

LeetCode 355. 设计推特(哈希map+set)

1. 题目 设计一个简化版的推特(Twitter),可以让用户实现发送推文,关注/取消关注其他用户,能够看见关注人(包括自己)的最近十条推文。你的设计需要支持以下的几个功能: postTweet(userId, tweetId): 创建一…

写出一段代码将链表中的两个节点位置互换位置_面试 leetcode 算法专题系列(二)—— 链表...

前言:只照着常考题去刷题确实是一种方法。但调研之后发现自己还是考虑不周,刷题刷的不应该是题,而是解题的思路和熟练程度。于是我决定重新组织一下刷题笔记的讲解顺序,不再以面试常考题来刷。而是以面试出题频率,方法…

感人至深的文章

http://bbs2.news.163.com/bbs/baoliao/75948727.html 转载于:https://www.cnblogs.com/shf/archive/2008/05/12/1192975.html

2022年度最佳开源软件榜单出炉!

源| OSC开源社区(ID:oschina2013)InfoWorld 公布了 2022 年最佳开源软件榜单。InfoWorld 是致力于引领 IT 决策者走在科技前沿的国际科技媒体品牌,每年 InfoWorld 都会根据软件对开源界的贡献,以及在业界的影响力评选出…

程序员面试金典 - 面试题 16.13. 平分正方形(数学)

1. 题目 给定两个正方形及一个二维平面。请找出将这两个正方形分割成两半的一条直线。 假设正方形顶边和底边与 x 轴平行。 每个正方形的数据square包含3个数值,正方形的左下顶点坐标[X,Y] [square[0],square[1]],以及正方形的边长square[2]。 所求直…

吵翻了!确认录取后导师和学生“互放鸽子”,网友:线上选拔太混乱

源 | 募格学术参考 | 中国科学报、科学网博客、知乎等导师和学生互相“放鸽子”是种怎样的体验?近日,《中国科学报》的一篇文章揭露了疫情下线上推免选拔的乱象。因为某些原因,产生了一些所谓“海王院校”(指在夏令营或预推免中&a…

监控和剖析数据库操作P6Spy,SQL Profiler,SQL 使用简介

新一篇: 关于java类的动态装载 几乎 80% - 85% 的数据库性能问题是由于应用数据库的设计或者应用程序本身的代码所引起的。因此良好的事务处理能力需要在设计应用程序的时候,在设计数据库的时候就考虑到性能和伸缩性。 ---- DB2 Magazine 在我们 Java 开发应用程序的…

python新手练习项目_适合Python 新手的5大练手项目,你练了么?

已经学习了一段时间的Python,如果你看过之前W3Cschool的文章,就知道是时候该进去【项目】阶段了。 但是在练手项目的选择上,还存在疑问?不知道要从哪种项目先下手? W3Cschool首先有两点建议: 最好不要写太应…

LeetCode 866. 回文素数(除11外,偶数位的回文数都不是质数)

1. 题目 求出大于或等于 N 的最小回文素数。 回顾一下,如果一个数大于 1,且其因数只有 1 和它自身,那么这个数是素数。 例如,2,3,5,7,11 以及 13 是素数。 回顾一下,…

首个在ImageNet上精度超过80%的二值神经网络BNext问世,-1与+1的五年辛路历程

源 | 机器之心两年前,当 MeliusNet 问世时,机器之心曾发表过一篇技术文章《第一次胜过 MobileNet 的二值神经网络,-1 与 1 的三年艰苦跋涉》,回顾了 BNN 的发展历程。彼时,依靠早期 BNN 工作 XNOR-Net 起家的 XNOR.AI…

中countif函数_countif与countifs:单条件与多条件计数适用场景

countif()的语法图丑~~图丑~~见谅~~Countif函数:对指定区域中符合指定条件的单元格计数。该函数的语法规则如下:countif(range,criteria)参数:range 要计算其中非空单元格数目的区域参数:criteria 以数字、表达式或文本形式定义的…

极大似然模型1

first_step.m%clear; syms rou fai2 k1 k2 k3 n rorn ii clc; ninput(观测时刻数 n); disp( dealing ); disp(Just wait for a few minutes............); k1sym((1-rou*rou)*(1-fai2*fai2)*Xmn(rorn,1)*Xmn(rorn,1)); k2sym((1-fai2^2)*(Xmn…

LeetCode 1177. 构建回文串检测(前缀和)

1. 题目 给你一个字符串 s,请你对 s 的子串进行检测。 每次检测,待检子串都可以表示为 queries[i] [left, right, k]。我们可以 重新排列 子串 s[left], ..., s[right],并从中选择 最多 k 项替换成任何小写英文字母。 如果在上述检测过程…

张俊林:ChatGPT会成为下一代搜索引擎吗

文|张俊林知乎本文将从以下几个方面展开:引言ChatGPT的技术原理ChatGPT能否取代Google、百度等传统搜索引擎引言作为智能对话系统,ChatGPT最近两天爆火,都火出技术圈了,网上到处都在转ChatGPT相关的内容和测试例子,效果…

k8s dashboard_k8s集群部署Dashboard

部署Dashboard(Web UI)* dashboard-deployment.yaml // 部署Pod,提供Web服务 * dashboard-rbac.yaml // 授权访问apiserver获取信息 * dashboard-service.yaml // 发布服务,提供对外访问 ​…

.Net笔试题 有答案

在对SQL Server 数据库操作时应选用(a)。 a)SQL Server .NET Framework 数据提供程序; b)OLE DB .NET Framework 数据提供程序; c)ODBC .NET Framework 数据提供程序; d)Oracle .NET Framework数据提供程序&#x…

程序员面试金典 - 面试题 17.13. 恢复空格(DP+Trie树)

文章目录1. 题目2. 解题2.1 动态规划2.2 Trie树1. 题目 哦,不!你不小心把一个长篇文章中的空格、标点都删掉了,并且大写也弄成了小写。 像句子"I reset the computer. It still didn’t boot!"已经变成了"iresetthecomputeri…

2022的结尾,对话系统起飞了

文 | 郑楚杰知乎编者记:近日来,ChatGPT的连续刷屏让人们重新看到了AI的希望,编者通过对ChatGPT的试用,发现其对话能力早已不同于两年前的对话系统了,可以说,有了质的飞跃,向着用户体验奇点迈进了…

python清除列表内容_Python 列表的清空方式

情况列表的操作: del list[:] list[] list[:][] def func(L): L.append(1) print L #L[:][] #del L[:] L [] print L L[] func(L) print L 输出结果: [1] [] [1] 分析:L是可变数据类型,L作为参数,函数内对L的改变&…