JSON Web Token (JWT):跨域身份驗證的熱門方案
本文介紹了當下最受歡迎的跨域身份驗證解決方案—JSON Web Token (JWT) 的原理和使用方法。
一、跨域身份驗證的挑戰
網路服務離不開使用者驗證。傳統流程如下:
- 使用者傳送使用者名稱和密碼給伺服器。
- 伺服器驗證成功後,將使用者角色、登入時間等相關資料儲存在目前會話中。
- 伺服器傳回一個 session_id 給用戶,寫入用戶的 Cookie。
- 使用者後續每次要求,都會透過 Cookie 將 session_id 傳送回伺服器。
- 伺服器收到 session_id 後,尋找預先儲存的數據,從而識別使用者身分。
此模型的擴展性差:單機環境沒問題,但伺服器叢集或跨網域面向服務的架構則需要會話資料共享,每台伺服器都能讀取會話。例如,網站 A 和網站 B 是同一家公司的關聯服務,要求使用者登入其中一個網站後,造訪另一個網站也能自動登入。一種解決方案是持久化會話數據,將其寫入資料庫或其他持久層,各服務收到請求後從持久層請求資料。此方案架構清晰,但工作量較大,且持久層故障會導致單點故障。另一種方案是伺服器完全不保存會話數據,所有數據保存在客戶端,每次請求都發送回伺服器。 JWT 正是這種方案的代表。
二、JWT 的原理
JWT 的原理是伺服器驗證後產生一個 JSON 物件並回傳給用戶,例如:
{"name": "Alice", "role": "admin", "expiration time": "2024年7月1日0:00"}
之後使用者與伺服器通訊時需要回傳此 JSON 對象,伺服器完全根據此對象決定使用者身分。為防止使用者篡改數據,伺服器產生此物件時會添加簽名(細節後述)。伺服器不再保存任何會話數據,即伺服器變為無狀態的,更容易實現擴展。
三、JWT 的資料結構
實際的 JWT 類似:
它是一個很長的字串,由點 (.) 分隔成三個部分。注意 JWT 內部沒有換行符,此處分行只是為了方便顯示。 JWT 的三個部分如下:
- Header (頭部)
- Payload (酬載)
- Signature (簽名)
一行表示為:Header.Payload.Signature
以下分別介紹這三個部分。
3.1 Header (頭)
Header 部分是一個 JSON 對象,描述 JWT 的元數據,通常如下:
{"alg": "HS256", "typ": "JWT"}
其中 alg 屬性表示簽章演算法,預設為 HMAC SHA256 (HS256);typ 屬性表示此令牌的類型,JWT 令牌統一寫為 JWT。此 JSON 物件最終使用 Base64URL 演算法轉換為字串(細節後述)。
3.2 Payload (酬載)
Payload 部分也是一個 JSON 對象,用於儲存實際需要傳輸的資料。 JWT 定義了 7 個官方欄位可選:
- iss (issuer):發行者
- exp (expiration time):過期時間
- sub (subject):主題
- aud (audience):受眾
- nbf (Not Before):生效時間
- iat (Issued At):簽發時間
- jti (JWT ID):序號
除了官方字段,還可以自訂私有字段。例如:
{"name": "Alice", "role": "admin", "expiration time": "2024年7月1日0:00"}
注意,JWT 預設不會加密,任何人都可以讀取,因此不要在此部分放置秘密訊息。此 JSON 物件也需要使用 Base64URL 演算法轉換為字串。
3.3 Signature (簽名)
Signature 部分是前兩部分的簽名,用於防止資料竄改。首先需要指定一個金鑰 (secret),此金鑰只有伺服器知道,不能外洩給使用者。然後使用 Header 中指定的簽章演算法(預設為 HMAC SHA256)根據以下公式產生簽章:
{"alg": "HS256", "typ": "JWT"}
計算出簽章後,將 Header、Payload 和 Signature 三部分組合成一個字串,各部分之間以 "點" (.) 分隔,即可傳回給使用者。
3.4 Base64URL
如前所述,Header 和 Payload 的序列化演算法是 Base64URL。此演算法基本上與 Base64 演算法類似,但有一些細微差別。作為令牌,JWT 有時可能放在URL 中(例如api.example.com/?token=xxx),Base64 中的三個字元、/ 和= 在URL 中有特殊含義,需要替換:= 被省略, 被替換為-,/ 被替換為_。這就是 Base64URL 演算法。
四、JWT 的使用方法
客戶端收到伺服器傳回的 JWT 後,可以儲存在 Cookie 或 localStorage 中。之後客戶端每次與伺服器通訊都需要攜帶此 JWT。可以將其放在 Cookie 中自動發送,但這無法跨域。更好的方法是將其放在 HTTP 請求頭的 Authorization 欄位中:
Authorization: Bearer
另一種方法是在跨域時將 JWT 放在 POST 請求的資料體中。
五、JWT 的幾個特性
(1) JWT 預設不加密,但可以加密。產生原始 Token 後,可以用金鑰再次加密。
(2) JWT 未加密的情況下,無法寫入秘密資料。
(3) JWT 不僅可以用於身份驗證,還可以用於資訊交換。有效使用 JWT 可以減少伺服器查詢資料庫的次數。
(4) JWT 最大的缺點是伺服器不保存會話狀態,無法在使用過程中撤銷某個令牌或更改令牌的權限。也就是說,JWT 一旦發出,就一直有效直到過期,除非伺服器部署額外邏輯。
(5) JWT 本身包含身份驗證訊息,一旦洩露,任何人都可以獲得令牌的所有權限。為減少被盜,JWT 的有效期限應設定得相對較短。對於一些較重要的權限,使用者在使用時應再次進行身份驗證。
(6) 為減少被盜,JWT 不應使用 HTTP 協定明文傳輸,而應使用 HTTPS 協定傳輸。
Leapcell:最佳無伺服器 Web 代管平台
最後,推薦一個部署 Web 服務的最佳平台:Leapcell
1. 多語言支援
- 使用 JavaScript、Python、Go 或 Rust 開發。
2. 免費部署無限專案
- 只按使用付費-無請求,無收費。
3. 無與倫比的成本效益
- 隨選付費,無空閒費用。
- 例如:25 美元支援 694 萬次要求,平均回應時間為 60 毫秒。
4. 簡化的開發者體驗
- 直覺的 UI,輕鬆設定。
- 全自動 CI/CD 管道和 GitOps 整合。
- 即時指標和日誌記錄,提供可操作的見解。
5. 輕鬆擴充與高效能
- 自動擴展,輕鬆處理高並發。
- 零營運開銷-只需專注於建置。
在文件中了解更多!
Leapcell Twitter:https://www.php.cn/link/7884effb9452a6d7a7a79499ef854afd
以上是掌握 JWT(JSON Web 令牌):深入探討的詳細內容。更多資訊請關注PHP中文網其他相關文章!

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。

JavaScript不需要安裝,因為它已內置於現代瀏覽器中。你只需文本編輯器和瀏覽器即可開始使用。 1)在瀏覽器環境中,通過標籤嵌入HTML文件中運行。 2)在Node.js環境中,下載並安裝Node.js後,通過命令行運行JavaScript文件。

如何在Quartz中提前發送任務通知在使用Quartz定時器進行任務調度時,任務的執行時間是由cron表達式設定的。現�...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Dreamweaver Mac版
視覺化網頁開發工具

記事本++7.3.1
好用且免費的程式碼編輯器