# JWT怎么用
## 目錄
1. [JWT基礎概念](#1-jwt基礎概念)
- 1.1 [什么是JWT](#11-什么是jwt)
- 1.2 [JWT的結構](#12-jwt的結構)
2. [JWT工作原理](#2-jwt工作原理)
- 2.1 [生成與簽名](#21-生成與簽名)
- 2.2 [傳輸與驗證](#22-傳輸與驗證)
3. [JWT使用場景](#3-jwt使用場景)
- 3.1 [身份認證](#31-身份認證)
- 3.2 [信息交換](#32-信息交換)
4. [JWT實戰指南](#4-jwt實戰指南)
- 4.1 [生成JWT(代碼示例)](#41-生成jwt代碼示例)
- 4.2 [驗證JWT(代碼示例)](#42-驗證jwt代碼示例)
5. [安全最佳實踐](#5-安全最佳實踐)
- 5.1 [密鑰管理](#51-密鑰管理)
- 5.2 [令牌過期](#52-令牌過期)
6. [常見問題解答](#6-常見問題解答)
7. [總結](#7-總結)
---
## 1. JWT基礎概念
### 1.1 什么是JWT
JSON Web Token(JWT)是一種開放標準(RFC 7519),用于在各方之間安全地傳輸信息作為JSON對象。這種信息可以被驗證和信任,因為它是數字簽名的。
**核心特點:**
- 緊湊:可通過URL、POST參數或HTTP頭部發送
- 自包含:包含所有必要信息,減少數據庫查詢
- 可驗證:基于數字簽名(HMAC或RSA)
### 1.2 JWT的結構
JWT由三部分組成,用點(.)分隔:
Header.Payload.Signature
**1. Header(頭部)**
```json
{
"alg": "HS256",
"typ": "JWT"
}
alg
:簽名算法(如HS256、RS256)typ
:令牌類型(固定為JWT)2. Payload(負載) 包含聲明(claims),分為三類: - 注冊聲明(預定義):iss(簽發者)、exp(過期時間)、sub(主題)等 - 公共聲明:可自定義但建議遵循IANA規范 - 私有聲明:各方共享的自定義數據
示例:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
3. Signature(簽名) 通過以下方式創建:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
graph TD
A[用戶登錄] --> B[服務器驗證憑證]
B --> C[生成Header+Payload]
C --> D[簽名處理]
D --> E[返回JWT給客戶端]
graph TD
A[客戶端攜帶JWT請求] --> B[服務器驗證簽名]
B --> C{驗證結果}
C -->|成功| D[返回請求數據]
C -->|失敗| E[返回401錯誤]
典型流程: 1. 用戶輸入憑據登錄 2. 服務器生成JWT并返回 3. 客戶端存儲JWT(通常localStorage或cookie) 4. 后續請求攜帶JWT(Authorization頭) 5. 服務器驗證后響應數據
安全地在不同系統間傳遞信息: - 服務間API通信 - 單點登錄(SSO) - 無狀態身份驗證
const jwt = require('jsonwebtoken');
const secret = 'your-256-bit-secret';
const token = jwt.sign(
{
userId: 123,
role: 'admin'
},
secret,
{ expiresIn: '1h' }
);
console.log(token);
jwt.verify(token, secret, (err, decoded) => {
if (err) {
console.error('驗證失敗:', err);
return;
}
console.log('解碼內容:', decoded);
});
建議設置: - 訪問令牌:15分鐘-1小時 - 刷新令牌:7-30天
// 設置過期時間
jwt.sign(payload, secret, { expiresIn: '15m' });
Q:JWT比Session好在哪? A:無需服務器存儲狀態,更適合分布式系統
Q:如何使JWT失效? A:JWT本身無法失效,可通過短有效期+黑名單機制實現
JWT作為現代Web開發的重要技術,提供了簡潔安全的身份驗證方案。正確使用時需注意: - 敏感數據不要放在Payload - 必須使用HTTPS傳輸 - 合理設置有效期 - 選擇適當的簽名算法
”`
(注:此為精簡框架,實際1萬字內容需擴展每個章節的詳細說明、更多代碼示例、性能分析、不同語言實現對比、歷史演進等內容。)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。