慣性聚合 高效追蹤和閱讀你感興趣的部落格、新聞、科技資訊
閱讀原文 在慣性聚合中打開

推薦訂閱源

小众软件
小众软件
博客园 - 叶小钗
有赞技术团队
有赞技术团队
大猫的无限游戏
大猫的无限游戏
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LangChain Blog
Hugging Face - Blog
Hugging Face - Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
aimingoo的专栏
aimingoo的专栏
Blog — PlanetScale
Blog — PlanetScale
爱范儿
爱范儿
T
Tailwind CSS Blog
Jina AI
Jina AI
量子位
Stack Overflow Blog
Stack Overflow Blog
人人都是产品经理
人人都是产品经理
J
Java Code Geeks
V
Visual Studio Blog
月光博客
月光博客

博客园 - 锐洋智能

Eclipse IDE for Enterprise Find/Replace 窗口可以"停驻" 安装 SDelete 方式 SDelete 的核心作用,不是 “删文件”,而是 “把你已经删掉的文件,彻底从磁盘上抹干净”,同时帮你把虚拟机里的 “空闲空间” 变成连续的、可被回收的状态。 windows 10 启动就运行了一个批处理文件 在什么地方修改?启动项中? 让 Spring Framework7.0.7 支持 velocity Java 9+ 开启了模块化安全限制,不允许 Ignite 直接访问底层内存地址,导致 Ignite 启动失败 Spring 5.x + 老项目的 JWT 拦截器 + 自动续期 下是针对 RedisSessionManager 的 Tomcat context.xml 配置示例,覆盖基础单机 Redis、带密码 / 指定库、Redis 哨兵集群、自定义序列化 / 持久化策略 等常见场景 Redis-8.6.3-Windows-x64-cygwin 与 Redis-8.6.3-Windows-x64-msys2 有什么不一样? commons-fileupload2 M4 升级 M5 报错解决方案 阿里云的网络安全策略 ip 地址详细说明 Paralithic、 QLExpress、AviatorScript、exp4j 性能对比一下 java 序列化影响(重要!) paralithic 与 Aviator 表达式那一个更快 券商接受委托的完整时间线 jQuery 4.0 移除了许多已废弃的方法和特性 xheditor插件无限递归错误解决方法 jedis-7.1.0.jar 升级至 jedis-7.2.0.jar 就提示:The type JedisPoolConfig is deprecated The type JedisPooled is deprecated Spring 从 5.x 到 6.x 和 7.x 区别 js 原生 剪切板 复制功能 安装 Microsoft Visual C++ 运行时 Java与Python进程通信优化方案 Autocomplete | jQuery UI 同一面页定义不同的 .ui-autocomplete Quartz的misfire处理策略设置不当导致Job在应用启动时立即执行。 mysql-connector-j-9.5.0.jar BUG 推荐几款好用的CSS在线压缩工具 CSS 变量 定义及引用 TLS virtual host [_default_], certificate type [RSA] configured from keystore [d:/reyo/jks/localhost.jks] using alias [tomcat] with trust store [null] okhttp5.x 需要在 请求级别 控制是否使用重试拦截器,而不是在客户端级别 Apache Commons FileUpload 1.x 与 2.x 的主要区别
接口鑑權:Session/Cookie 與 JWT 的核心區別
锐洋智能 · 2026-05-27 · via 博客园 - 锐洋智能

接口鑑權:Session/Cookie 與 JWT 的核心區別

你說的非常對:傳統 Web 項目用 Session/Cookie,前後端分離的接口項目(RESTful API)必須用 JWT,核心原因是架構變了—— 傳統是服務端渲染頁面,現在是前端獨立、接口無狀態

我用最通俗、最核心的方式,把兩者的區別講清楚:


一、先搞懂:為什麼傳統接口不能用 Session?

1. Session 的工作原理(有狀態)

  1. 瀏覽器登錄 → 服務端生成 Session 存在內存 / 數據庫
  2. 服務端返回一個 SessionID 存在Cookie
  3. 下次請求 → 瀏覽器自動帶 Cookie → 服務端查 Session 確認身份

2. Session 致命缺點(不適合接口)

  • 強依賴 Cookie:跨域、小程序、App、第三方調用都受限
  • 服務端必須存狀態:分佈式 / 多服務器要做 Session 共享(Redis 同步)
  • 前後端分離不友好:前端是純客戶端,不依賴瀏覽器自動帶 Cookie

所以:接口鑑權必須拋棄 “服務端存狀態” 的方案 → JWT 應運而生


二、JWT 是什麼?(無狀態)

JWT = JSON Web Token

一句話:把用戶身份信息加密成一串字符串,存在客戶端,服務端不存任何登錄狀態

工作流程:

  1. 登錄成功 → 服務端用密鑰簽發 JWT(不存任何數據)
  2. 前端把 JWT 存在本地(localStorage / 小程序緩存)
  3. 每次請求接口 → 前端手動把 JWT 放在請求頭裡
  4. 服務端只用密鑰驗證 JWT 是否合法,不用查庫

三、Session / Cookie 與 JWT 的核心區別(一張表看懂)

表格

對比維度Session / CookieJWT
存儲位置 服務端存儲,客戶端只存 ID 全部存在客戶端,服務端零存儲
狀態 有狀態(服務端要查會話) 無狀態(Stateless,接口天然支持分佈式)
跨域 / 跨端 差(依賴 Cookie,跨域限制大) 極強(支持 Web、小程序、App、第三方接口)
分佈式部署 麻煩(需要 Session 共享) 極簡單(多臺服務器直接用同一密鑰驗證)
請求方式 瀏覽器自動帶 Cookie 前端手動傳(請求頭 / 參數)
安全特點 易受 CSRF 攻擊 無 CSRF 風險
適用場景 傳統網站、服務端渲染 前後端分離、RESTful API、微服務

四、最關鍵的 3 個本質區別

1. 有無狀態(最核心)

  • Session:服務端必須記住你登錄了(有狀態)
  • JWT:服務端不記得任何人,只認令牌(無狀態) → 接口架構必須無狀態,所以 JWT 是標準

2. 數據存在哪裡

  • Session:存在服務器
  • JWT:存在客戶端自己手裡

3. 擴展性

  • Session:服務器越多越麻煩
  • JWT:隨便加服務器,完全不用改代碼

五、簡單總結:為什麼接口要用 JWT?

  1. 不依賴 Cookie,跨域、小程序、App 全支持
  2. 服務端不存登錄狀態,分佈式 / 集群隨便擴
  3. 標準通用,所有前後端分離架構都用它
  4. 安全可控,可設置過期、可加密、可防篡改

總結

  • Session/Cookie:適合傳統網站,服務端存狀態,依賴瀏覽器
  • JWT:適合接口鑑權,無狀態、跨端、分佈式友好

你可以簡單記:

網站用 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>