JWT(JSON Web Token)原理详解

1. 核心结构

JWT由三部分组成,通过.连接:

  • 头部(Header)
    包含元数据,通常为:

    {
      "alg": "HS256",  // 签名算法(如HMAC SHA256)
      "typ": "JWT"     // 令牌类型
    }
    

    经Base64Url编码后形成第一部分。

  • 载荷(Payload)
    存储实际数据(称为"声明"),例如:

    {
      "sub": "123456",      // 主题(用户ID)
      "name": "Alice",
      "iat": 1516239022    // 签发时间戳
    }
    

    经Base64Url编码后形成第二部分。

  • 签名(Signature)
    对前两部分组合的加密签名:

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

    用于验证数据完整性。

完整JWT格式:
Header.Payload.Signature
示例:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTYiLCJuYW1lIjoiQWxpY2UiLCJpYXQiOjE1MTYyMzkwMjJ9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

2. 工作流程
graph LR
A[客户端登录] --> B[服务器验证身份]
B --> C[生成JWT]
C --> D[返回JWT给客户端]
D --> E[客户端存储JWT<br>(如LocalStorage)]
E --> F[后续请求携带JWT]
F --> G[服务器验证签名<br>并读取Payload]
G --> H[授权访问资源]
3. 签名验证原理

服务器通过以下步骤验证:

  1. 用相同算法(如HS256)和密钥重新计算签名
  2. 对比客户端提交的签名与计算值
  3. 若匹配,则证明:
    • 数据未被篡改( 签名 新 ≡ 签名 原 \text{签名}_\text{新} \equiv \text{签名}_\text{原} 签名签名
    • 载荷信息可信
4. 关键特性
  • 无状态性:服务器无需存储会话信息
  • 自包含性:所有必要数据都在令牌中
  • 跨域支持:适用于API和微服务架构
  • 安全性依赖:签名密钥的保密性(若泄露则令牌可伪造)
5. 代码示例(生成JWT)
import jwt
from datetime import datetime, timedelta

secret_key = "your_secret_key"  # 必须严格保密

# 构建Payload
payload = {
    "user_id": "123",
    "exp": datetime.utcnow() + timedelta(hours=1)  # 1小时后过期
}

# 生成JWT
token = jwt.encode(payload, secret_key, algorithm="HS256")
print("JWT:", token)

注意:实际应用中需:

  1. 使用强密码学算法(如RS256)
  2. 设置合理过期时间(exp声明)
  3. 通过HTTPS传输防止截获
  4. 敏感数据避免存入Payload(因Base64可解码)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、pandas是什么?

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、使用步骤

1.引入库

代码如下(示例):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

2.读入数据

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐