JWT安全機制與最佳實踐詳解

JWT(JSON Web Token) 是一種開放標準(RFC 7519),用于在各方之間安全地傳輸信息作為緊湊且自包含的 JSON 對象。它被廣泛用于身份驗證(Authentication)和授權(Authorization),是現代 Web 開發中替代傳統 Session-Cookie 方案的流行技術。


核心結構:三部分拼接

JWT 由三部分組成,用 . 分隔:
Header.Payload.Signature
示例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0IiwibmFtZSI6IkpvaG4iLCJpYXQiOjE1MTYyMzkwMjJ9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

1. Header(頭部)
  • 作用:聲明令牌類型和簽名算法。
  • 示例
    {"alg": "HS256",  // 簽名算法(如 HS256、RS256)"typ": "JWT"     // 令牌類型
    }
    
  • Base64Url 編碼 → 生成第一部分。
2. Payload(負載)
  • 作用:攜帶實際數據(如用戶 ID、權限、過期時間)。
  • 包含三類聲明
    • 預定義聲明(Registered Claims):標準字段(非強制)
      iss(簽發者)、exp(過期時間)、sub(主題)、aud(受眾)等。
    • 公開聲明(Public Claims):自定義公開字段(需避免沖突)。
    • 私有聲明(Private Claims):雙方約定的自定義數據。
  • 示例
    {"sub": "1234567890",      // 用戶 ID"name": "Alice","admin": true,"iat": 1516239022         // 簽發時間
    }
    
  • Base64Url 編碼 → 生成第二部分。
3. Signature(簽名)
  • 作用:驗證令牌完整性和來源可信性。
  • 生成公式
    HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),secretKey
    )
    
  • 關鍵點
    • 使用 Header 指定的算法(如 HS256)和密鑰生成。
    • 防篡改:任何對 Header 或 Payload 的修改都會導致簽名驗證失敗。

工作流程:身份驗證場景

客戶端服務端提交用戶名/密碼驗證憑證生成JWT并返回后續請求攜帶JWT(Header: Authorization: Bearer <token>)驗證簽名+檢查有效期返回受保護資源客戶端服務端

關鍵特性

特性說明
無狀態(Stateless)服務端無需存儲會話信息,減輕數據庫壓力。
跨域友好可放在 HTTP Header 或 URL 中,不受同源策略限制(與 Cookie 不同)。
自包含(Self-contained)Payload 可直接解析出用戶信息,減少查詢次數。
可擴展性自定義 Payload 添加業務數據(如用戶角色、權限列表)。

安全注意事項

  1. 敏感信息泄露
    問題:Payload 僅 Base64 編碼(非加密),可被解碼查看。
    解決

    • 避免在 Payload 存儲密碼、銀行卡號等敏感數據。
    • 敏感數據需加密后再放入 Payload。
  2. 簽名算法安全

    • 禁用 "alg": "none":防止攻擊者繞過簽名驗證。
    • 推薦強算法:如 HS256(對稱)或 RS256(非對稱)。
  3. 密鑰管理

    • HS256:密鑰需足夠復雜(長度 >32 字符),并在服務端安全存儲。
    • RS256:私鑰嚴格保密,公鑰用于驗證(更安全)。
  4. 令牌過期

    • 必設 exp(過期時間),縮短攻擊窗口期(建議 15-30 分鐘)。
  5. 令牌吊銷問題
    難點:JWT 天然無狀態,無法中途廢止(除非等待過期)。
    解決方案

    • 維護令牌黑名單(需犧牲無狀態性)。
    • 設置短有效期 + 使用 Refresh Token 機制(見下圖)。

最佳實踐:Access Token + Refresh Token

1. 登錄請求
2. 返回 Access Token + Refresh Token
3. 用 Access Token 請求資源
4. Token 過期
5. 用 Refresh Token 申請新 Access Token
6. 驗證后返回新 Access Token
客戶端
服務端
API
  • Access Token:短有效期(如 15 分鐘),用于請求資源。
  • Refresh Token:長有效期(如 7 天),存儲于數據庫,用于獲取新 Access Token。

代碼示例:Node.js 生成/驗證 JWT

const jwt = require('jsonwebtoken');// 生成 JWT(HS256 對稱算法)
const payload = { userId: "123", role: "admin" };
const secret = "your-strong-secret"; // 密鑰
const token = jwt.sign(payload, secret, { expiresIn: '1h' });
console.log("Generated Token:", token);// 驗證 JWT
jwt.verify(token, secret, (err, decoded) => {if (err) console.error("驗證失敗:", err.message);else console.log("Decoded Payload:", decoded); // { userId: '123', role: 'admin', iat: ..., exp: ... }
});

適用場景 vs 不適用場景

適用場景不適用場景
無狀態 API 認證需要即時吊銷令牌的系統
微服務間安全通信傳輸大量敏感數據
單點登錄(SSO)客戶端無法安全存儲令牌的場景
移動端/前后端分離應用

調試工具

  • 在線解析:https://jwt.io
    (可查看 Header/Payload,但勿泄露真實 Token)

總結

  • JWT 本質Base64(Header).Base64(Payload).Signature
  • 核心價值:無狀態、跨域友好、自包含。
  • 安全鐵律:強簽名算法、短有效期、避免敏感數據、密鑰嚴格保護。
  • 進階方案:Access Token + Refresh Token 平衡安全性與用戶體驗。

理解 JWT 的機制和安全實踐,是構建現代分布式系統的必備技能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/90761.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/90761.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/90761.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何解決pip安裝報錯ModuleNotFoundError: No module named ‘ipython’問題

【Python系列Bug修復PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘ipython’問題 摘要 在開發過程中&#xff0c;我們常常會遇到pip install報錯的問題&#xff0c;其中一個常見的報錯是 ModuleNotFoundError: No module named…

從三維Coulomb勢到二維對數勢的下降法推導

題目 問題 7. 應用 9.1.4 小節描述的下降法&#xff0c;但針對二維的拉普拉斯方程&#xff0c;并從三維的 Coulomb 勢出發 KaTeX parse error: Invalid delimiter: {"type":"ordgroup","mode":"math","loc":{"lexer&qu…

直播一體機技術方案解析:基于RK3588S的硬件架構特性?

硬件配置??主控平臺??? 搭載瑞芯微RK3588S旗艦處理器&#xff08;四核A762.4GHz 四核A55&#xff09;? 集成ARM Mali-G610 MP4 GPU 6TOPS算力NPU? 雙通道LPDDR5內存 UFS3.1存儲組合??專用加速單元??→ 板載視頻采集模塊&#xff1a;支持4K60fps HDMI環出采集→ 集…

【氮化鎵】GaN取代GaAs作為空間激光無線能量傳輸光伏轉換器材料

2025年7月1日,西班牙圣地亞哥-德孔波斯特拉大學的Javier F. Lozano等人在《Optics and Laser Technology》期刊發表了題為《Gallium nitride: a strong candidate to replace GaAs as base material for optical photovoltaic converters in space exploration》的文章,基于T…

直播美顏SDK動態貼紙模塊開發指南:從人臉關鍵點識別到3D貼合

很多美顏技術開發者好奇&#xff0c;如何在直播美顏SDK中實現一個高質量的動態貼紙模塊&#xff1f;這不是簡單地“貼圖貼臉”&#xff0c;而是一個融合人臉關鍵點識別、實時渲染、貼紙驅動邏輯、3D骨骼動畫與跨平臺性能優化的系統工程。今天&#xff0c;就讓我們從底層技術出發…

學習游戲制作記錄(劍投擲技能)7.26

1.實現瞄準狀態和接劍狀態準備好瞄準動畫&#xff0c;投擲動畫和接劍動畫&#xff0c;并設置參數AimSword和CatchSword投擲動畫在瞄準動畫后&#xff0c;瞄準結束后才能投擲創建PlayerAimSwordState腳本和PlayerCatchSwordState腳本并在Player中初始化&#xff1a;PlayerAimSwo…

【c++】問答系統代碼改進解析:新增日志系統提升可維護性——關于我用AI編寫了一個聊天機器人……(14)

在軟件開發中&#xff0c;代碼的迭代優化往往從提升可維護性、可追蹤性入手。本文將詳細解析新增的日志系統改進&#xff0c;以及這些改進如何提升系統的實用性和可調試性。一、代碼整體背景代碼實現了一個基于 TF-IDF 算法的問答系統&#xff0c;核心功能包括&#xff1a;加載…

visual studio2022編譯unreal engine5.4.4源碼

UE5系列文章目錄 文章目錄 UE5系列文章目錄 前言 一、ue5官網 二.編譯源碼中遇到的問題 前言 一、ue5官網 UE5官網 UE5源碼下載地址 這樣雖然下載比較快,但是不能進行代碼git管理,以后如何虛幻官方有大的版本變動需要重新下載源碼,所以我們還是最好需要visual studio2022…

vulhub Earth靶場攻略

靶場下載 下載鏈接&#xff1a;https://download.vulnhub.com/theplanets/Earth.ova 靶場使用 將壓縮包解壓到一個文件夾中&#xff0c;右鍵&#xff0c;用虛擬機打開&#xff0c;就創建成功了&#xff0c;然后啟動虛擬機&#xff1a; 這時候靶場已經啟動了&#xff0c;咱們現…

Python訓練Day24

浙大疏錦行 元組可迭代對象os模塊

Spring核心:Bean生命周期、外部化配置與組件掃描深度解析

Bean生命周期 說明 程序中的每個對象都有生命周期&#xff0c;對象的創建、初始化、應用、銷毀的整個過程稱之為對象的生命周期&#xff1b; 在對象創建以后需要初始化&#xff0c;應用完成以后需要銷毀時執行的一些方法&#xff0c;可以稱之為是生命周期方法&#xff1b; 在sp…

日語學習-日語知識點小記-進階-JLPT-真題訓練-N1階段(1):2017年12月-JLPT-N1

日語學習-日語知識點小記-進階-JLPT-真題訓練-N1階段&#xff08;1&#xff09;&#xff1a;2017年12月-JLPT-N1 1、前言&#xff08;1&#xff09;情況說明&#xff08;2&#xff09;工程師的信仰&#xff08;3&#xff09;真題訓練2、真題-2017年12月-JLPT-N1&#xff08;1&a…

(一)使用 LangChain 從零開始構建 RAG 系統|RAG From Scratch

RAG 的主要動機 大模型訓練的時候雖然使用了龐大的世界數據&#xff0c;但是并沒有涵蓋用戶關心的所有數據&#xff0c; 其預訓練令牌&#xff08;token&#xff09;數量雖大但相對這些數據仍有限。另外大模型輸入的上下文窗口越來越大&#xff0c;從幾千個token到幾萬個token,…

OpenCV學習探秘之一 :了解opencv技術及架構解析、數據結構與內存管理?等基礎

?一、OpenCV概述與技術演進? 1.1技術歷史? OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是由Intel于1999年發起創建的開源計算機視覺庫&#xff0c;后來交由OpenCV開源社區維護&#xff0c;旨在為計算機視覺應用提供通用基礎設施。經歷20余年發展&…

什么是JUC

摘要 Java并發工具包JUC是JDK5.0引入的重要并發編程工具&#xff0c;提供了更高級、靈活的并發控制機制。JUC包含鎖與同步器&#xff08;如ReentrantLock、Semaphore等&#xff09;、線程安全隊列&#xff08;BlockingQueue&#xff09;、原子變量&#xff08;AtomicInteger等…

零基礎學后端-PHP語言(第二期-PHP基礎語法)(通過php內置服務器運行php文件)

經過上期的配置&#xff0c;我們已經有了php的開發環境&#xff0c;編輯器我們繼續使用VScode&#xff0c;如果是新來的朋友可以看這期文章來配置VScode 零基礎學前端-傳統前端開發&#xff08;第一期-開發軟件介紹與本系列目標&#xff09;&#xff08;VScode安裝教程&#x…

擴散模型逆向過程詳解:如何從噪聲中恢復數據?

在擴散模型中&#xff0c;逆向過程的目標是從噪聲數據逐步恢復出原始數據。本文將詳細解析逆向條件分布 q(zt?1∣zt,x)q(\mathbf{z}_{t-1} \mid \mathbf{z}_t, \mathbf{x})q(zt?1?∣zt?,x)的推導過程&#xff0c;揭示擴散模型如何通過高斯分布實現數據重建。1. 核心問題 在…

2025年7月份實時最新獲取地圖邊界數據方法,省市區縣街道多級聯動【文末附實時geoJson數據下載】

動態生成最新行政區劃 GeoJSON 數據并結合 ECharts 實現地圖下鉆功能 在開發基于地圖的數據可視化應用時&#xff0c;一個常見的挑戰是獲取準確且最新的行政區劃邊界數據&#xff08;GeoJSON&#xff09;。許多現有的在線資源可能數據陳舊&#xff0c;無法反映最新的行政區劃調…

Spark實現WorldCount執行流程圖

spark可以分區并行執行&#xff0c;同時并行執行也可以基于內存完成迭代代碼對于大部分spark程序來說都是以driver開始driver結束&#xff0c;中間都是executor分布式運行

編程與數學 03-002 計算機網絡 02_網絡體系結構與協議

編程與數學 03-002 計算機網絡 02_網絡體系結構與協議一、網絡體系結構的基本概念&#xff08;一&#xff09;分層體系結構的優點&#xff08;二&#xff09;協議、接口與服務的概念二、OSI參考模型&#xff08;一&#xff09;七層模型的層次劃分及功能&#xff08;二&#xff…