
一、兩條標準路線日常開發二選一路線 1Cookie Session有狀態會話流程回顧登錄成功 → 服務端生成 Session圖2存入 Redis / 內存通過Set-Cookie請求頭發送sessionID 到瀏覽器端(圖1)瀏覽器會在每次請求中自動攜帶Cookie服務器根據 sessionId 查詢會話數據核心 ? Cookie 瀏覽器傳輸載體? Session 服務端保存會話數據路線 2Token典型 JWT無狀態認證流程回顧登錄返回 Token 字符串前端把 Token 存在 localStorage / Cookie 注意Token也是可以存儲在Cookie中的前端手動在 HeaderAuthorization: Bearer xxx攜帶服務端校驗簽名不需要服務端存儲會話二、登錄場景案例方案 1Cookie Session 完整流程整體原理登錄后服務端生成唯一 SessionIdSession 數據保存在服務端Redis / 內存服務端通過Set-Cookie把 SessionId 下發瀏覽器后續請求瀏覽器自動帶上 Cookie。步驟 1用戶登錄請求POST /login Content-Type: application/json { username:zhangsan, password:123456 }步驟 2服務器處理校驗賬號密碼正確生成唯一 SessionIdsess_987654321abc服務端存儲 SessionMock Redis 數據Key: sess_987654321abc Value: {userId:1001, username:zhangsan, role:user, loginTime:2026-08-04} Expire: 30分鐘步驟 3下次訪問需要鑒權的接口例如 /user/info瀏覽器自動攜帶 Cookie不需要前端手動處理請求自動帶上GET /user/info Cookie: SESSIONIDsess_987654321abc步驟 4服務端邏輯讀取 Cookie 里的SESSIONID→ 查詢 Redis 找到會話數據 → 識別用戶是 zhangsan正常返回信息。步驟 5退出登錄服務端刪除 Redis 中sess_987654321abc這條數據會話失效。缺點集群部署需要 Session 共享跨域場景 Cookie 傳遞麻煩。方案 2Token (JWT) 方案【方式 AToken 存在 LocalStorage】整體原理登錄成功服務端生成一段自包含信息的 JWT 字符串服務端不保存會話。 前端自己存儲 Token每次請求手動放到請求頭 Authorization。步驟 1登錄請求和上面一樣POST /login { username:zhangsan, password:123456 }步驟 2服務端校驗賬號密碼生成 JWTMock Token此處簡化模擬 JWT 字符串真實 JWT 由三段 Base64 簽名組成返回給前端{ code:200, token:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEwMDEsInVzZXJuYW1lIjoiemhhbmdzYW4iLCJyb2xlIjoidXNlciIsImV4cCI6MTc4MDQwMDAwMH0.Sdfsdf234sdf }步驟 3前端存儲前端 JS 把 token 存入瀏覽器localStoragelocalStorage.setItem(token,eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9......)步驟 4請求受保護接口 /user/info前端手動組裝 Header發送請求GET /user/info Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEwMDEsInVzZXJuYW1lIjoiemhhbmdzYW4iLCJyb2xlIjoidXNlciIsImV4cCI6MTc4MDQwMDAwMH0.Sdfsdf234sdf步驟 5服務端處理獲取 Header 中的 token校驗簽名不需要查 Redis / 數據庫解碼得到內置數據userId:1001,username:zhangsan判斷是否過期返回用戶信息??關鍵點服務端沒有保存這份 token 信息無狀態步驟 6退出登錄單純前端刪除 localStorage 里的 token 即可 缺陷token 沒過期前服務端無法主動讓它失效需要維護黑名單 Redis方案 3混合模式【Token 存入 Cookie企業常用安全方案】很多項目為了防 XSS 攻擊把 JWT 放到 CookieHttpOnly 區分于 CookieSession Cookie 里放的是Token 字符串不是 SessionId流程區別登錄成功 →Set-Cookie: access_tokenxxxxJWT; HttpOnly瀏覽器自動攜帶 Cookie服務端讀取 Cookie 拿到 JWT校驗簽名 ? 載體是 Cookie認證方案卻是 Token 路線 充分證明Cookie 只是存儲工具不和 Session 綁定死。三、JWT的優缺點? JWT 的優點無狀態服務端不用存儲會話用戶信息直接放在 token 里面服務端只需要校驗簽名不用去 Redis / 數據庫查會話記錄。擴容簡單多臺機器不需要做會話共享天然適合分布式、微服務。跨端友好移動端、小程序、前后端分離項目都能用不像 Cookie 受瀏覽器同源策略限制。減少數據庫 / 緩存查詢壓力解析出 token 就拿到用戶信息不用每次請求根據 sessionId 查詢用戶。擴展性強可以在 payload 里攜帶用戶角色、權限等附加信息。?? JWT 缺點面試官大概率追問一并記Token 一旦下發無法直接作廢。除非維護黑名單否則有效期內一直可用不能存敏感數據payload 只是 base64 編碼不是加密前端可以解碼看到內容體積更大每次請求都要攜帶網絡開銷比單純 sessionId 大刷新 token 機制需要額外設計。