文章目錄
- WebSocket
- DNS
- 什么是dns
- 域名解析
- 底層協議
- cookie/session
- Token/JWT
- Nginx
WebSocket
一種網絡通信協議,允許在單個 TCP(半雙工) 連接上進行全雙工通信(客戶端和服務器可同時雙向傳輸數據)。
HTTP是基于請求-響應模式的,也就是說客戶端發送一個請求,服務器返回一個響應,然后連接就關閉了。
如果服務器想主動給客戶端發消息,比如實時更新數據,客戶端必須不斷地輪詢服務器,這會浪費資源。
WebSocket就運用于實時通信方面,比如聊天應用或者在線游戲等。
DNS
什么是dns
DNS,全稱是Domain Name System,域名系統,默認端口號53。
將易記的域名轉換為計算機可識別的IP地址的分布式數據庫系統。
域名結構如 :www.example.com.:
在域名中,越靠右的位置表示其層級越高
- 根域名:最高層,表示為空(如
.
),全球僅有13組根服務器集群。 - 頂級域:如
.com
,.org
,.net
,或國家代碼如.cn
,.uk
。 - 二級域:用戶注冊的域名部分(如
example
在example.com
中)。 - 子域:進一步細分(如
mail.example.com
)。
域名解析
各服務器負責部分(舉例:
根DNS(.)
頂級DNS(.com)
權威DNS(example.com)
- 用戶輸入域名www.example.com,發給本地 DNS 服務器
- 本地域名服務器收到請求,如果緩存里有則直接返回,無則請求其根域名服務器
- 根域名服務器收到請求(發現是.com),將請求發送給頂級域名服務器
- 頂級域名服務器收到請求(發現是www.example.com),將請求發送給權威域名服務器
- 權威域名服務器查詢后將對應的 IP 地址 X.X.X.X 告訴本地 DNS。
- 本地 DNS 再將 IP 地址返回客戶端,客戶端和目標建立連接。
底層協議
DNS 基于UDP協議實現。
- 無連接:UDP 不需要建立連接,直接發送請求,減少了通信延遲。
- 輕量級:DNS 查詢和響應通常是小數據包,一個UDP包就能容納
- 簡單快速: UDP相比于TCP更簡單,傳輸效率更高
cookie/session
HTTP協議是無狀態的
服務器不會記住之前的請求。所以為了跟蹤用戶的狀態,比如用戶是否登錄,就需要用到Cookie和Session。
存儲會話信息或狀態信息,服務器可以識別和跟蹤特定用戶的狀態,以提供一定程度的狀態保持功能
用戶第一次訪問網站時,服務器會創建一個Session,并生成一個唯一的Session ID,然后把這個ID通過Cookie發送給客戶端。之后,客戶端每次請求都會帶上這個Cookie,服務器通過Session ID找到對應的Session,從而識別用戶。
session
保存在服務器端的用戶狀態信息。
-
創建Session:用戶首次訪問時,服務器生成唯一Session ID(如
abc123
)。 -
傳遞Session ID:通過Cookie(或URL重寫:將Session ID附加到URL
http://site.com?sid=abc123
)發送給客戶端。 -
客戶端攜帶Session ID:后續請求包含Session ID。
-
服務器檢索Session:根據Session ID查找服務器存儲的會話數據。
cookie
保存在客戶端(比如瀏覽器)的小型數據片段。
-
服務器生成:服務器通過HTTP響應頭
Set-Cookie
發送Cookie到瀏覽器。 -
瀏覽器存儲:瀏覽器保存Cookie,后續請求自動通過
Cookie
請求頭發送回服務器。 -
服務器讀取:服務器解析Cookie內容,識別用戶狀態。
HTTP/1.1 200 OK Set-Cookie: session_id=abc123; Expires=Wed, 21 Oct 2023 07:28:00 GMT; Secure; HttpOnly; SameSite=Lax
特性 | Cookie | Session |
---|---|---|
存儲位置 | 客戶端(瀏覽器) | 服務器端 |
數據類型 | 文本(鍵值對) | 任意結構(對象、數組等) |
安全性 | 較低(可能被篡改或竊取) | 較高(數據在服務器,僅傳遞Session ID) |
容量限制 | 每個域名≤4KB,總數有限(約50個) | 無硬性限制(受服務器資源影響) |
典型用途 | 用戶偏好、跟蹤標識 | 登錄狀態、敏感數據(如購物車) |
舉個例子:
用戶登錄流程:
- 用戶提交用戶名和密碼。
- 服務器驗證通過,創建Session(存儲用戶ID、角色)。
- 生成Session ID,通過Cookie發送到瀏覽器。
- 瀏覽器后續請求攜帶該Cookie,服務器驗證Session維持登錄狀態。
- 用戶退出時,服務器銷毀Session,清除客戶端Cookie。
如果客戶端禁用cookie?
則session無法正常使用。通過以下2種方式解決:
1.
URL重寫
:將Session ID附加到URL(http://site.com?sid=abc123)。2.
隱藏表單字段
:通過HTML表單傳遞Session ID,當表單提交時,Session ID隨表單數據一起發送回服務器獲取會話狀態。
如果我把數據存儲到 localStorage,和Cookie有什么區別?
- 存儲容量: localStorage>Cookie
- 數據發送:Cookie自動(通過HTTP請求頭的
Cookie
字段),localStorage不會- 生命周期:Cookie設置過期時間,localStorage永久存儲(手動刪除)
- 安全性:Cookie<localStorage
Cookie 適合用于在客戶端和服務器之間傳遞數據、跨域訪問和設置過期時間,而 LocalStorage 適合用于在同一域名下的不同頁面之間共享數據,存儲大量數據和永久存儲數據。
Token/JWT
用戶登錄成功后,服務器生成Token并返回給客戶端,客戶端保存(通常在localStorage或Cookie中),每次請求API時在Authorization頭中攜帶Token。服務器驗證Token的有效性,并據此處理請求。
1.Token通常指的是一種用于身份驗證的令牌(不同于cookie,token開發者手動添加)。當用戶登錄后,服務器生成一個Token返回給客戶端,客戶端在后續的請求中攜帶這個Token來證明自己的身份。這種方式不需要服務器保存會話信息,因此稱為無狀態(stateless)認證。
2.JWT,即JSON Web Token。JWT是一種具體的Token實現方式,它定義了一種緊湊且自包含的方式,用于在各方之間安全地傳輸信息作為JSON對象。
jwt通常由三部分組成:頭部Header、載荷Payload和簽名Signature。通過.
分隔。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
-
頭部Header
說明Token類型及簽名算法
{"alg": "HS256","typ": "JWT" }
-
載荷Payload
包含用戶數據
{"sub": "1234567890","name": "John Doe","admin": true,"iat": 1516239022 }
-
簽名Signature
也是三部分組成:通過base64編碼后的Header和Payload(以.拼接)后,再將它們通過一遍加密算法,最終得到簽名Signature.
這里可以看看我的另一篇文章Java中的jwt學習
jwt令牌解決集群部署
集群部署
將應用程序部署在多個服務器上,有多個應用服務器實例
在單服務器環境下,Session數據存儲在服務器的內存中,但當擴展到多臺服務器時,如果用戶的請求被負載均衡器分發到不同的服務器,后續請求可能到達沒有該用戶Session的服務器,導致用戶需要重新登錄。
- 需要Session共享機制,比如使用數據庫或Redis來集中存儲Session,這樣所有服務器都能訪問同一個Session存儲。
- JWT是自包含的令牌,服務器不需要存儲會話信息,每個服務器實例都可以獨立驗證JWT的簽名,不需要查詢共享的Session存儲。
jwt令牌泄露
- 失效令牌:當檢測到令牌失效,將該令牌標記為失效,服務器會拒絕操作失效令牌
- 刷新令牌:主動刷新令牌,并將舊令牌標記為失效
- 使用黑名單:將泄露的令牌加入黑名單,服務器會拒絕操作在黑名單種的令牌
Nginx
Web服務器、反向代理服務器及電子郵件代理服務器
-
Web服務器
直接托管HTML、CSS、JS、圖片等靜態文件
通過協議將動態請求(如PHP、Python)轉發給后端應用服務器。
-
反向代理服務器
將客戶端請求分發到多個后端服務器(如Tomcat、Node.js)
支持輪詢、加權輪詢、IP哈希、最小連接數等。
nginx負載均衡算法
應用層的nginx用于將客戶端請求合理地分發到后端服務器集群。
- 輪詢:按服務器列表順序依次分發請求,循環往復。
- IP哈希:根據客戶端IP地址計算哈希值,固定將同一IP的請求分發到同一服務器。
- URL哈希:根據訪問的URL計算哈希值,固定將同一IP的請求分發到同一服務器。
- 最短響應時間:按照后端服務器的響應時間來分配請求,響應時間短的優先分配(發送到響應時間快的服務器)。
- 加權輪詢:根據服務器權重分配請求,權重越高處理的請求越多(適用于后端服務器性能不同的場景)。
結合小林Coding不斷學習中,感謝大家的觀看>W<