websocket連接【新】

https://www.cnblogs.com/chyingp/p/websocket-deep-in.html
https://cloud.tencent.com/developer/article/1887095
https://www.ruanyifeng.com/blog/2017/05/websocket.html

websocket是一種網(wǎng)絡(luò)傳輸協(xié)議,可以在單個tcp連接上進(jìn)行全雙工通訊鹏浅,位于osi模型的應(yīng)用層(http也位于應(yīng)用層)

在 WebSocket 握手成功之后菇绵,數(shù)據(jù)的傳輸是通過已經(jīng)建立的 TCP 連接進(jìn)行的,不再需要 HTTP 的傳輸頭等額外的開銷硅瞧。

websocket與http關(guān)系

websocket復(fù)用了http的握手通道页衙,在http連接的基礎(chǔ)上,客戶端發(fā)起協(xié)議升級,采用的是標(biāo)準(zhǔn)的http報文格式俊庇,且只支持get方法,【最后數(shù)據(jù)傳輸是在tcp協(xié)議上進(jìn)行傳輸?shù)募δ樱帐诌B接是http協(xié)議】

客戶端
GET / HTTP/1.1
Host: localhost:8080
Origin: http://127.0.0.1:3000
Connection: Upgrade  // 表示協(xié)議升級
Upgrade: websocket  // 表示升級到websocket協(xié)議
// websocket版本辉饱,如果服務(wù)器不支持此版本,則會返回Sec-WebSocket-Version 的header拣展,里面有所有他支持的版本
Sec-WebSocket-Version: 13  
// 與服務(wù)器的Sec-WebSocket-Accept配套使用彭沼,提供基本的防護(hù),比如無意鏈接备埃、惡意連接
Sec-WebSocket-Key: w4v7O6xFTi36lq3RNcgctw==  
服務(wù)器端
HTTP/1.1 101 Switching Protocols  // 協(xié)議切換姓惑,完成協(xié)議升級
Connection:Upgrade
Upgrade: websocket
// 這個值與客戶端Sec-WebSocket-Key有關(guān),通過SHA1散列算法獲取摘要信息值按脚,并轉(zhuǎn)成base64字符串
Sec-WebSocket-Accept: Oy4NRAQ13jhfONC7bP8dTKb4PTU=·

websocket的api

var ws = new WebSocket('ws://localhost:8080');

執(zhí)行了上面的語句于毙,websocket就會進(jìn)行連接

websocket.readyState

返回實例對象的當(dāng)前狀態(tài)

  • 0(connecting):正在連接
  • 1(open):連接成功可以通信
  • 2(closing):正在關(guān)閉
  • 3(closed):連接已關(guān)閉,或打開鏈接失敗
websocket.onOpen()

用于連接成功后的回調(diào)函數(shù)

websocket.onClose()

用于連接管壁厚的回調(diào)屬性

websocket.onMessage()

收到服務(wù)器數(shù)據(jù)后的回調(diào)函數(shù)

websocket.send()

向服務(wù)器發(fā)送數(shù)據(jù)的函數(shù)

websocket.error()

用于報錯時的回調(diào)函數(shù)

websocket.bufferedAmount

判斷發(fā)送是否結(jié)束(表示還有多少二進(jìn)制字節(jié)的數(shù)據(jù)沒有發(fā)送出去)

var data = new ArrayBuffer(10000000);
socket.send(data);

if (socket.bufferedAmount === 0) {
  // 發(fā)送完畢
} else {
  // 發(fā)送還沒結(jié)束
}

websocket優(yōu)點

  • 基于tcp協(xié)議基礎(chǔ)上的辅搬,服務(wù)器端實現(xiàn)起來比較容易
  • 與http有良好的兼容性唯沮,能夠通過http代理(握手階段采用http協(xié)議,不容易被屏蔽)
  • 數(shù)據(jù)格式比較輕量堪遂,開銷小
  • 沒有同源限制介蛉,客戶端可以與任意服務(wù)器通信

輪詢(短輪詢)、長輪詢和websocket區(qū)別

image.png
image.png

輪詢(短輪詢):瀏覽器每隔一段時間向服務(wù)器發(fā)送一次請求溶褪,服務(wù)器返回最新的數(shù)據(jù)給瀏覽器
長輪詢:客戶端發(fā)器請求币旧,服務(wù)器端在收到后,會不直接進(jìn)行響應(yīng)竿滨,將請求掛起佳恬,然后判斷請求的數(shù)據(jù)是否有更新捏境,或者超時才會返回給客戶端。 eg:comet的實現(xiàn)方式之一毁葱,另一種(http://www.52im.net/thread-336-1-1.html%235
websocket:全雙工協(xié)議垫言,服務(wù)器端游數(shù)據(jù)更新后可以直接發(fā)消息給客戶端

代理緩存污染攻擊(ws引入掩碼計算為了防止此攻擊)

  • 攻擊者發(fā)送ws協(xié)議升級到攻擊者服務(wù)器
  • 升級請求發(fā)送到了代理服務(wù)器,經(jīng)攻擊者服務(wù)器響應(yīng)后倾剿,代理服務(wù)器將響應(yīng)回復(fù)給攻擊者筷频,連接通道打通
  • 攻擊者通過WebSocket向攻擊者服務(wù)器發(fā)送數(shù)據(jù),其中包含被攻擊資源的地址前痘,以及一個偽造的host(指向被攻擊資源的服務(wù)器)
  • 代理服務(wù)器會緩存數(shù)據(jù)凛捏,當(dāng)下一次被攻擊者發(fā)送請求時,會直接將緩存數(shù)據(jù)發(fā)給被攻擊者

只能說不能完全防范芹缔,但是加大了難度

websocket與cookie和token

websocket通過token傳遞信息坯癣,請求連接的時候一般不會傳入cookie,但配置后可傳(不管是連接還是數(shù)據(jù)傳輸時都是可以的)W钋贰J韭蕖!
原因:

  • 理論上websocket連接請求的時候是可以帶上cookie的芝硬,因為他是在http的基礎(chǔ)上建立的蚜点,可以使用http的特性,如在握手時使用cookie進(jìn)行數(shù)據(jù)傳輸和身份認(rèn)證拌阴,但是這個cookoe不受同源策略限制绍绘。【ps:在發(fā)送數(shù)據(jù)時迟赃,因為走的tcp協(xié)議了陪拘,不在需要http的傳輸頭等額外開銷,但是如果需要的話捺氢,可以配置藻丢!】
  • websocket是否攜帶cookie是可配置的,一些安全性高的站點可能會禁止websocket攜帶cookie以增加安全性和隱私性
  • 實際使用上并沒有帶上cookie摄乒,而是一般使用token進(jìn)行驗證,客戶端請求時攜帶token残黑,服務(wù)端收到請求馍佑,校驗toekn時效性,判斷客戶端是否有操作權(quán)限梨水,token可以避免CSRF攻擊(token可以在客戶端和服務(wù)器端進(jìn)行交換拭荤,每次請求動態(tài)生成,攻擊者無法預(yù)判token值)

websocket配置cookie可攜帶

  • 在服務(wù)器端添加自定義頭部信息疫诽,例如Set-Cookie舅世,告訴客戶端允許攜帶cookie旦委,下方以node舉例
// 服務(wù)器端
const WebSocket = require('ws');
const server = new WebSocket.Server({ port: 8080 });
server.on('connection', (socket, req) => {
  // 允許攜帶 Cookie
  socket.upgradeReq.headers.cookie = req.headers.cookie;
  // 處理 WebSocket 連接
  // ...
});
  • 客戶端設(shè)置相應(yīng)頭部信息,例如** Cookie**頭雏亚,在瀏覽器中使用js缨硝,舉例
const socket = new WebSocket('ws://localhost:8080', {
  headers: {
    'Cookie': document.cookie
  }
});

為什么websocket不建議攜帶cookie

在 WebSocket 連接中攜帶 Cookie 會增加一定的安全風(fēng)險,因此建議只在必要的情況下允許攜帶 Cookie罢低,在實際過程中查辩,按需配置

  • 如果攻擊者能夠截獲websocket連接并獲取cookie,就可以冒充用戶网持,獲取用戶敏感信息宜岛,或者進(jìn)行惡意操作
  • 用戶隱私問題,websocket攜帶cookie功舀,當(dāng)用戶進(jìn)行一些操作萍倡,網(wǎng)站可能會記錄這些操作并與用戶的cookie連接起來,從而產(chǎn)生一些隱私風(fēng)險
  • 如果服務(wù)器用cookie來維持會話狀態(tài)辟汰,那么websocket(攜帶了cookie的)可能會干擾這種狀態(tài)的維護(hù)列敲,導(dǎo)致系統(tǒng)異常
    具體情況如下:
    websocket是基于tcp協(xié)議通信,不同于http協(xié)議的“請求-響應(yīng)”模式莉擒,一旦建立了連接酿炸,就可以客戶端和服務(wù)器端雙向通信,可以發(fā)送多條消息涨冀,這些消息時使用websocket自己的協(xié)議進(jìn)行傳輸?shù)奶钏叮虼瞬粫駂ttp消息一樣攜帶cookie。因此如果服務(wù)器是使用cookie來維持通信的話鹿鳖,當(dāng)出現(xiàn)多個客戶端連接時扁眯,沒有辦法識別客戶端身份因此會導(dǎo)致會話異常
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市翅帜,隨后出現(xiàn)的幾起案子姻檀,更是在濱河造成了極大的恐慌,老刑警劉巖涝滴,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绣版,死亡現(xiàn)場離奇詭異,居然都是意外死亡歼疮,警方通過查閱死者的電腦和手機(jī)杂抽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來韩脏,“玉大人缩麸,你說我怎么就攤上這事∩氖福” “怎么了杭朱?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵阅仔,是天一觀的道長。 經(jīng)常有香客問我弧械,道長八酒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任梦谜,我火速辦了婚禮丘跌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘唁桩。我一直安慰自己闭树,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布荒澡。 她就那樣靜靜地躺著报辱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪单山。 梳的紋絲不亂的頭發(fā)上碍现,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機(jī)與錄音米奸,去河邊找鬼昼接。 笑死,一個胖子當(dāng)著我的面吹牛悴晰,可吹牛的內(nèi)容都是我干的慢睡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼铡溪,長吁一口氣:“原來是場噩夢啊……” “哼漂辐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起棕硫,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤髓涯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后哈扮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纬纪,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年滑肉,在試婚紗的時候發(fā)現(xiàn)自己被綠了育八。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡赦邻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出实檀,到底是詐尸還是另有隱情惶洲,我是刑警寧澤按声,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站恬吕,受9級特大地震影響签则,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜铐料,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一渐裂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钠惩,春花似錦柒凉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至愧沟,卻和暖如春蔬咬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沐寺。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工林艘, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人混坞。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓狐援,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拔第。 傳聞我的和親對象是個殘疾皇子咕村,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容