












你說的非常對:傳統 Web 項目用 Session/Cookie,前後端分離的接口項目(RESTful API)必須用 JWT,核心原因是架構變了—— 傳統是服務端渲染頁面,現在是前端獨立、接口無狀態。
我用最通俗、最核心的方式,把兩者的區別講清楚:
SessionID 存在Cookie裡
所以:接口鑑權必須拋棄 “服務端存狀態” 的方案 → JWT 應運而生
JWT = JSON Web Token
一句話:把用戶身份信息加密成一串字符串,存在客戶端,服務端不存任何登錄狀態。
工作流程:
表格
| 對比維度 | Session / Cookie | JWT |
|---|---|---|
| 存儲位置 | 服務端存儲,客戶端只存 ID | 全部存在客戶端,服務端零存儲 |
| 狀態 | 有狀態(服務端要查會話) | 無狀態(Stateless,接口天然支持分佈式) |
| 跨域 / 跨端 | 差(依賴 Cookie,跨域限制大) | 極強(支持 Web、小程序、App、第三方接口) |
| 分佈式部署 | 麻煩(需要 Session 共享) | 極簡單(多臺服務器直接用同一密鑰驗證) |
| 請求方式 | 瀏覽器自動帶 Cookie | 前端手動傳(請求頭 / 參數) |
| 安全特點 | 易受 CSRF 攻擊 | 無 CSRF 風險 |
| 適用場景 | 傳統網站、服務端渲染 | 前後端分離、RESTful API、微服務 |
你可以簡單記:
網站用 Session,接口用 JWT;有狀態用 Session,無狀態用 JWT。
<!-- JWT 工具:jjwt,Spring5 兼容 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
此內容由慣性聚合(RSS閱讀器)自動聚合整理,僅供閱讀參考。 原文來自 — 版權歸原作者所有。