文章目錄
- cookie與session
- token
- 什么是JWT?
- JWT的組成結構
- 1. Header(頭部)
- 2. Payload(負載)
- 3. Signature(簽名)
- JWT工作原理
- JWT的特點
- 安全注意事項
cookie與session
cookie有哪些屬性
- 鍵值對(必需)
name=value
:Cookie 的核心內容,如session_id=12345
。
- 作用域控制
Domain
:指定 Cookie 可被發送到的域名(如Domain=example.com
),子域名默認繼承。Path
:指定 Cookie 可被發送到的路徑(如Path=/api
),子路徑默認繼承。
- 有效期
Expires
:指定 Cookie 的具體過期時間(如Expires=Wed, 21 Oct 2025 07:28:00 GMT
)。Max-Age
:指定 Cookie 的有效秒數(如Max-Age=3600
表示 1 小時后過期)。
- 安全屬性
Secure
:僅在 HTTPS 連接下發送 Cookie。HttpOnly
:禁止 JavaScript 訪問 Cookie(防 XSS 攻擊)。SameSite
:控制跨站請求時 Cookie 的發送策略:Strict
:僅允許同源請求攜帶 Cookie。Lax
:允許部分安全的跨站請求(如鏈接跳轉)。None
:允許所有跨站請求(需配合Secure
屬性)。
- 其他
Priority
(Chrome 特有):指定 Cookie 的優先級(Low
/Medium
/High
)。Partitioned
(實驗性):隔離不同站點的 Cookie 存儲(防跨站追蹤)。
示例
Set-Cookie: session_id=12345; Domain=example.com; Path=/; Expires=Wed, 21 Oct 2025 07:28:00 GMT; Secure; HttpOnly; SameSite=Lax
cookie原理
http客戶端向服務端發請求,服務端通過http響應返回給客戶端如usrname=xxx pswd=xxx,客戶端在后續請求中攜帶該字段,從而讓服務端識別。
從安全性等角度演變為session
http客戶端向服務端發請求,服務端針對該客戶端生成一個唯一標識,通過http響應返回給客戶端,客戶端在后續請求中攜帶該字段,從而讓服務端識別。【該唯一標識sessionid通常是一個“數據”的標識,該“數據”存儲了該用戶的信息,該sessionid通常存在redis集群,不同服務器在負載均衡時去redis查】
該唯一標識的內容設成什么?
服務端可以根據用戶名和密碼和一些環境信息基于某種算法生成
該值保存在哪
保存在客戶端,分為內存級【會話關閉cookie消失】和磁盤級【cookie過期后消失】
如何實現會話管理?服務端需要存儲哪些信息?
- 服務端對于客戶端發來cookie的value,將value和用戶的唯一標識如user_id建立映射,從而可以獲取該用戶相關信息如用戶登錄狀態,用戶權限信息,用戶登陸ip,用戶使用設備,用戶臨時上下文(瀏覽部分,購物車臨時數據)
- 其他信息:會話創建,過期,活躍時間;
token
為防止客戶端發送的session id被偽造,需對其合法性進行驗證。可采用令牌(token)機制,在用戶登錄后發放包含其user id的token,用戶后續請求時通過Http header攜帶該token。為避免偽造,用HMAC-SHA256算法結合僅服務端知曉的密鑰對數據簽名,將簽名與數據一同作為token,因密鑰保密,他人無法偽造。服務端不保存token,接收后用相同算法和密鑰重新計算簽名并與token中的簽名比對,相同則確認用戶合法登錄并獲取user id,不同則判定數據被篡改。需注意,token數據經Base64編碼(非加密),明文可見,不可包含密碼等敏感信息,且token被盜與session id被盜風險類似。這種不保存session id僅生成和驗證token的無狀態機制,能減輕服務器存儲負擔,便于機器集群水平擴展。【token解決了服務端需要存儲大量的sessionid造成的空間成本,通過token中的user_id直接去數據庫查詢用戶相關信息】
什么是JWT?
JWT(JSON Web Token)是一種開放標準(RFC 7519),用于在網絡應用環境間安全地傳輸聲明(claims)作為JSON對象。它通常用于身份驗證和信息交換。
JWT的組成結構
一個JWT由三部分組成,用點號(.)分隔:
Header.Payload.Signature
1. Header(頭部)
包含令牌類型(typ)和簽名算法(alg),例如:
{"alg": "HS256","typ": "JWT"
}
2. Payload(負載)
包含聲明(claims),聲明是關于實體(通常是用戶)和其他數據的語句。有三種類型的聲明:
- 注冊聲明(預定義):如iss(簽發者)、exp(過期時間)、sub(主題)等
- 公共聲明:可以自定義,但應避免與已注冊聲明沖突
- 私有聲明:用于在同意使用它們的各方之間共享信息
示例:
{"sub": "1234567890","name": "John Doe","admin": true,"iat": 1516239022
}
3. Signature(簽名)
使用編碼后的header、payload、一個密鑰和header中指定的算法生成。例如使用HMAC SHA256算法:
HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)
JWT工作原理
-
認證流程:
- 用戶登錄,服務器驗證憑證
- 服務器創建JWT并返回給客戶端
- 客戶端存儲JWT(通常在localStorage或cookie中)
- 客戶端在后續請求的Authorization頭中攜帶JWT
- 服務器驗證JWT并處理請求
-
驗證過程:
- 服務器收到JWT后,會重新計算簽名
- 比較計算的簽名與JWT中的簽名是否一致
- 驗證過期時間等聲明
JWT的特點
- 無狀態:服務器不需要存儲會話信息
- 可驗證:簽名確保令牌未被篡改
- 包含信息:payload可以包含用戶基本信息
- 跨域友好:適合單點登錄和分布式系統
安全注意事項
- 不要將敏感信息放入JWT(除非加密)
- 使用HTTPS傳輸
- 設置合理的過期時間
- 考慮使用刷新令牌機制
- 防范CSRF攻擊(如果存儲在cookie中)
JWT是現代Web應用和API中廣泛使用的身份驗證機制,特別適合RESTful API和無狀態服務架構。