JWT解析

什么是JWT

JSON Web Token (JWT) 是一種開放標準 (RFC 7519),它定義了一種緊湊且獨立的方式,用于在各方之間以 JSON 對象的形式安全地傳輸信息。此信息可以驗證和信任,因為它是經過數字簽名的。JWT 可以使用密鑰(使用 HMAC算法)或使用 RSA 或 ECDSA 的公鑰/私鑰對進行簽名。

簡單來說,JWT就是用來判斷某種信息是否可以被信任的一種簽名json

JWT使用場景

1. 身份驗證(Authentication):JWT 可以被用作用戶登錄的身份驗證憑證。當用戶成功登錄后,服務端可以生成一個包含用戶信息的 JWT,并將其返回給客戶端。以后,客戶端在每次請求時都會攜帶這個 JWT,服務端通過驗證 JWT 的簽名來確認用戶的身份。

2. 授權(Authorization):在用戶登錄后,服務端可以生成包含用戶角色、權限等信息的 JWT,并在用戶每次請求時進行驗證。通過解析 JWT 中的聲明信息,服務端可以判斷用戶是否有權限執行特定的操作或訪問特定的資源。

3. 信息交換(Information Exchange):由于 JWT 的聲明信息可以被加密,因此可以安全地在用戶和服務器之間傳遞信息。這在分布式系統中非常有用,因為可以確保信息在各個環節中的安全傳遞。

4. 單點登錄(Single Sign-On):JWT 可以被用于支持單點登錄,使得用戶在多個應用之間只需要登錄一次即可使用多個應用,從而提高用戶體驗。

JWT優勢

無狀態:JWT 的驗證是基于密鑰的,因此它不需要在服務端存儲用戶信息。這使得 JWT 可以作為一種無狀態的身份認證機制。

跨語言支持:JWT 的標準化和簡單性質使得它可以在多種語言和平臺之間使用。

安全性高:由于 JWT 的載荷可以進行加密處理,因此 JWT 能夠保證數據的安全傳輸。同時,JWT 的簽名機制也能夠保證數據的完整性和真實性。

為什么需要JWT

在一些web項目中,使用Cookie-Session模式實現用戶認證的相關流程大致如下:

  1. 用戶在瀏覽器端填寫用戶名和密碼,并發送給服務端
  2. 服務端對用戶名和密碼校驗通過后會生成一份保存當前用戶相關信息的session數據和一個與之對應的標識(通常稱為session_id)
  3. 服務端返回響應時將上一步的session_id寫入用戶瀏覽器的Cookie
  4. 后續用戶來自該瀏覽器的每次請求都會自動攜帶包含session_id的Cookie
  5. 服務端通過請求中的session_id就能找到之前保存的該用戶那份session數據,從而獲取該用戶的相關信息。

這種方案依賴于客戶端(瀏覽器)保存 Cookie,并且需要在服務端存儲用戶的session數據。

在移動互聯網時代,用戶可能使用瀏覽器也可能使用APP來訪問服務器,我們的web應用可能是前后端分開部署在不同的端口,有時候我們還需要支持第三方登錄,這下Cookie-Session的模式就有些力不從心了。

JWT就是一種基于Token的輕量級認證模式,服務端認證通過后,會生成一個JSON對象,經過簽名后得到一個Token(令牌)再發回給用戶,用戶后續請求只需要帶上這個Token,服務端解密之后就能獲取該用戶的相關信息了。

JWT的結構

JWT由三部分組成,使用.分隔,他們是:

  • Header(頭部)
  • Payload(載荷)
  • Signature(簽名)
Header

JWT頭部通常由兩部分組成:令牌的類型(JWT)和正在使用的簽名算法,例如 HMAC SHA256 或 RSA。

{"alg": "HS256","typ": "JWT"
}

然后,JSON 數據經過 Base64Url 編碼以形成 JWT 的第一部分。

Payload

JWT 的載荷也稱為聲明信息,包含了一些有關實體(通常是用戶)的信息以及其他元數據。有三種類型的聲明:已注冊公共私有聲明。

  • **已注冊的聲明(Registered Claims):**這些是一組預定義的聲明,不是強制性的,但建議使用,以提供一組有用的、可互操作的聲明。包括 iss(發行者)、sub(主題)、aud(受眾)、exp(過期時間)、nbf(生效時間)、iat(發布時間)和 jti(JWT ID)等。

注意:聲明名稱只有三個字符長,因為JWT是緊湊的

  • **公共聲明(Public claims):**這些聲明可以由使用 JWT 的用戶隨意定義。但為避免沖突,應在 IANA JSON Web 令牌注冊表中定義它們,或將其定義為包含抗沖突命名空間的 URI。

  • **私有聲明(Private Claims):**這些聲明是保留給特定的應用程序使用的,不會與其他應用程序沖突。

示例有效負載:

{"sub": "123456789","name": "John","admin": true
}

注意:注意,對于簽名令牌,此信息雖然可以防止篡改,但任何人都可以讀取。除非 JWT 已加密,否則不要將機密信息放在 JWT 的 payload 或 header 元素中。

對有效負載進行 Base64Url 編碼,以形成 JSON Web 令牌的第二部分。

Signature

JWT 的簽名是由頭部、載荷和密鑰共同生成的。它用于驗證 JWT 的真實性和完整性。一般情況下,簽名也會采用 Base64 編碼。
例如,如果要使用 HMAC SHA256 算法,將按以下方式創建簽名:

HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)

簽名用于驗證消息在整個過程中沒有被更改,并且在使用私鑰簽名的令牌的情況下,它還可以驗證 JWT 的發件人是否是它所聲稱的身份。

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

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

相關文章

C語言中的自定義類型 —— 結構體.位段.聯合體和枚舉

自定義類型 1. 前言2. 結構體2.1 結構體的聲明2.2 結構體變量的定義和初始化2.3 結構體的特殊聲明2.4 結構體的自引用2.5 結構體的內存對齊2.6 修改默認對齊數2.7 結構體傳參 3. 位段4. 聯合體5. 枚舉6. 結言 1. 前言 在C語言中已經為用過戶提供了內置類型,如&…

StarRocks 查詢優化器深度解析

StarRocks 查詢優化器概覽 1. Development History of StarRocks 過去五年,StarRocks 發布了三個大版本: StarRocks 1.0:通過向量化引擎和 CBO,打造極速 OLAP 數據庫。 StarRocks 2.0:通過主鍵模型、數據湖分析和查詢…

如何提高情商?(優化版)

引言 提高情商(EQ)是一個需要長期練習和自我反思的過程,核心在于理解自己、管理情緒、共情他人并有效溝通。以下是一些具體且可操作的方法,結合理論和實際場景,幫助你逐步提升: 一、核心方法:…

Python爬蟲實戰:獲取好大夫在線各專業全國醫院排行榜數據并分析,為患者就醫做參考

一、引言 在當今醫療資源豐富但分布不均的背景下,患者在選擇合適的心血管內科醫院時面臨諸多困難。好大夫在線提供的醫院排行榜數據包含了醫院排名、線上服務得分、患者評價得分等重要信息,對患者選擇醫院具有重要的參考價值。本研究通過爬取該排行榜數據,并進行深入分析,…

【AI面試準備】電商購物車AI測試設計與實施

面試題:案例實踐: 為電商購物車設計AI測試:通過用戶行為日志訓練點擊路徑預測模型,動態生成邊界條件測試用例。 為了順利通過面試,回答應結構清晰、技術深入,并突出實際應用與創新。以下為分步解答&#…

Java 中使用 Callable 創建線程的方法

一、Callable 接口概述? Callable接口位于java.util.concurrent包中,與Runnable接口類似,同樣用于定義線程執行的任務,但它具有以下獨特特性:? 支持返回值:Callable接口聲明了一個call()方法,該方法會在…

2025-SMS短信驗證服務或存風險,小心賬號隱私“失守”

近期,火絨安全情報中心監測到一款偽裝成具備SMS短信驗證碼接收服務的程序。該程序通過部署持久化后門(即僵尸網絡節點)竊取敏感信息。火絨安全提醒廣大用戶務必從官方或可信渠道下載軟件,避免因使用來路不明的程序而導致賬號被盜或…

docker部署Open WebUI下載速度慢解決方法

docker pull ghcr.nju.edu.cn/open-webui/open-webui:main改成這個就可以了

氣泡圖、桑基圖的繪制

1、氣泡圖 使用氣泡圖分析某一年中國同歐洲各國之間的貿易情況。 氣泡圖分析的三個維度: ? 進口額:橫軸 ? 出口額:縱軸 ? 進出口總額:氣泡大小 數據來源:鏈接: 國家統計局數據 數據概覽(進出口總額&…

前端面經-VUE3篇(三)--vue Router(二)導航守衛、路由元信息、路由懶加載、動態路由

一、導航守衛 vue Router 中的 導航守衛(Navigation Guards) 是一個非常重要的功能,用于在路由切換過程中,攔截、控制、檢查或延遲頁面跳轉。 你可以理解為: 🔐 “進門前的保安”,控制哪些頁面…

MATLAB實現二氧化硅和硅光纖的單模光波特性與仿真

一.二氧化硅和硅光纖的單模光波特性 利用麥克斯方程的精確解研究二氧化硅和硅亞波長直徑導線的單模光波特性。研究了單模條件、模場。 二氧化硅光纖導線是圓形截面,包層是空氣包層,階梯型變化的折射率,導線線徑D非常小長度足夠長&#xff0…

【Linux系統】第二節—基礎指令(2)

hello ~ 好久不見 自己想要的快樂要自己好好爭取! 云邊有個稻草人-個人主頁 Linux—本篇文章所屬專欄—歡迎訂閱—持續更新中 目錄 本節課核心指令知識點總結 本節基本指令詳解 07.man 指令 08.cp 指令 09.mv 指令 10.cat 指令 11.more 指令 12.less 指令 …

為了結合后端而學習前端的學習日志——【黑洞光標特效】

前端設計專欄 今天給大家帶來一個超酷的前端特效——黑洞光標!讓你的鼠標變成一個會吞噬光粒子的迷你黑洞,點擊時還會噴射出綠色能量粒子!🌠 🚀 效果預覽 想象一下:你的鼠標變成一個旋轉的黑洞&#xff0…

[硬件電路-11]:模擬電路常見元器件 - 什么是阻抗、什么是輸入阻抗、什么是輸出阻抗?阻抗、輸入阻抗與輸出阻抗的全面解析

1. 阻抗(Impedance) 定義:阻抗是電路或元件對交流信號(AC)流動的阻礙能力,用符號Z表示,單位為歐姆(Ω)。它綜合了電阻(R)、電感(L&am…

機器學習和深度學習的對比

深度 數據經過深層網絡后,語義信息表征能力強,對幾何細節信息表征能力弱。 數據依賴性 深度學習算法需要大量的數據來訓練,而傳統的機器學習使用制定的規則。所以,當數據量少時,深度學習的性能差于機器學習&#xf…

Kubernetes 安裝 minikube

安裝 minikube 在 Ubuntu 上安裝 minikube minikube 是一個工具,它可以在本地快速運行一個單節點的 Kubernetes 集群。它主要用于:本地學習 Kubernetes、測試和開發 Kubernetes 應用程序、快速嘗試 Kubernetes 的功能。 系統配置最低要求如下 CPU&#…

【學習筆記】深度學習:典型應用

作者選擇了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰寫的《Deep Learning》(人工智能領域的經典教程,深度學習領域研究生必讀教材),開始深度學習領域學習,深入全面的理解深度學習的理論知識。 之前的文章參考下面的鏈接&#xf…

ComputeShader繪制全屏純色紋理

參考 Getting Started With Compute Shaders In Unity 環境 Win10 Unity20194.40 全屏純色紋理示例 使用ComputerShader逐個像素設置顏色 ComputeShader腳本 設置紋理顏色 #pragma kernel CSMainRWTexture2D<float4> Result;//紋理 half4 solidColor;//顏色[numth…

數學實驗(Matlab語言環境和線性代數實驗)

一、Matlab語言環境和線性代數實驗 1.Matlab語言環境 Matlab簡介 Matlab&#xff1a;Matrix Laboratry 矩陣實驗室 Matlab 提供了強大的科學計算、靈活的程序設計流程、高質量的圖形可視化與界面設計等功能&#xff0c;被廣泛應用于科學計算、控制系統、信息處理等領域的分…

Android面試總結之GC算法篇

一、GC 機制核心原理與算法 面試題 1&#xff1a;Android 中為什么采用分代回收&#xff1f;分代策略如何優化 GC 效率&#xff1f; 標準答案&#xff1a; 分代回收基于對象生命周期的差異&#xff0c;將堆分為年輕代&#xff08;Young Gen&#xff09;和老年代&#xff08;Ol…