0

0

JWT 访问令牌与刷新令牌的安全实践指南

碧海醫心

碧海醫心

发布时间:2025-08-16 16:24:01

|

1007人浏览过

|

来源于php中文网

原创

jwt 访问令牌与刷新令牌的安全实践指南

本文旨在深入探讨 JWT (JSON Web Token) 在访问令牌和刷新令牌场景下的安全应用。重点分析了使用不同密钥对访问令牌和刷新令牌进行签名的重要性,以及 JWT 本身的数据完整性保障机制,并提供了在 FastAPI 等后端框架中安全使用 JWT 的最佳实践建议,帮助开发者构建更安全的身份验证系统。

JWT 安全基础

JWT (JSON Web Token) 是一种用于在各方之间安全地传输信息的开放标准 (RFC 7519)。它通常用于身份验证和授权,通过对 JSON 对象进行签名,保证数据的完整性和真实性。理解 JWT 的安全机制对于正确使用它至关重要。

JWT 的组成部分:

  • Header (头部): 包含令牌的类型 (typ) 和所使用的签名算法 (alg)。
  • Payload (载荷): 包含声明 (claims),这些声明是关于用户或其他实体的声明信息。
  • Signature (签名): 通过头部指定的算法,使用密钥对头部和载荷进行签名,用于验证令牌的完整性。

JWT 的安全性:

JWT 的安全性依赖于签名算法和密钥的保密性。如果密钥泄露,任何人都可以伪造 JWT。因此,务必妥善保管密钥,并选择安全的签名算法,例如 HMAC SHA256 (HS256) 或 RSA。

访问令牌与刷新令牌

在基于 JWT 的身份验证系统中,通常会使用访问令牌和刷新令牌两种令牌。

  • 访问令牌 (Access Token): 用于访问受保护资源的短期令牌。
  • 刷新令牌 (Refresh Token): 用于获取新的访问令牌的长期令牌。

为什么需要刷新令牌?

访问令牌的有效期通常较短,以减少令牌泄露造成的风险。当访问令牌过期时,用户无需重新登录,可以使用刷新令牌来获取新的访问令牌,从而提供更好的用户体验。

使用不同的密钥对访问令牌和刷新令牌进行签名

一个关键的安全实践是使用不同的密钥对访问令牌和刷新令牌进行签名。

原因:

标小兔AI写标书
标小兔AI写标书

一款专业的标书AI代写平台,提供专业AI标书代写服务,安全、稳定、速度快,可满足各类招投标需求,标小兔,写标书,快如兔。

下载
  • 降低风险: 如果访问令牌的密钥泄露,攻击者只能伪造访问令牌,而无法获取新的访问令牌。
  • 增强安全性: 刷新令牌的密钥可以更严格地保护,例如存储在硬件安全模块 (HSM) 中。

实现方法 (FastAPI 示例):

import jwt
import datetime

ACCESS_TOKEN_SECRET_KEY = "your_access_token_secret"
REFRESH_TOKEN_SECRET_KEY = "your_refresh_token_secret"

def create_access_token(data: dict, expires_delta: datetime.timedelta = None):
    to_encode = data.copy()
    if expires_delta:
        expire = datetime.datetime.utcnow() + expires_delta
    else:
        expire = datetime.datetime.utcnow() + datetime.timedelta(minutes=15)
    to_encode.update({"exp": expire})
    encoded_jwt = jwt.encode(to_encode, ACCESS_TOKEN_SECRET_KEY, algorithm="HS256")
    return encoded_jwt

def create_refresh_token(data: dict, expires_delta: datetime.timedelta = None):
    to_encode = data.copy()
    if expires_delta:
        expire = datetime.datetime.utcnow() + expires_delta
    else:
        expire = datetime.datetime.utcnow() + datetime.timedelta(days=7)
    to_encode.update({"exp": expire})
    encoded_jwt = jwt.encode(to_encode, REFRESH_TOKEN_SECRET_KEY, algorithm="HS256")
    return encoded_jwt

def verify_access_token(token: str):
    try:
        payload = jwt.decode(token, ACCESS_TOKEN_SECRET_KEY, algorithms=["HS256"])
        return payload
    except jwt.ExpiredSignatureError:
        return None
    except jwt.InvalidTokenError:
        return None

def verify_refresh_token(token: str):
    try:
        payload = jwt.decode(token, REFRESH_TOKEN_SECRET_KEY, algorithms=["HS256"])
        return payload
    except jwt.ExpiredSignatureError:
        return None
    except jwt.InvalidTokenError:
        return None

注意事项:

  • 请勿在代码中硬编码密钥,应使用环境变量或配置文件进行管理。
  • 定期更换密钥,以提高安全性。
  • 考虑使用更安全的签名算法,例如 RS256。

JWT 的数据完整性

JWT 的签名机制保证了数据的完整性。任何对 JWT 载荷的修改都会导致签名验证失败。因此,即使攻击者能够获取到 JWT,也无法修改其中的内容,除非他们拥有签名密钥。

防止刷新令牌被用作访问令牌:

虽然 JWT 保证了数据完整性,但仍然需要防止刷新令牌被误用或恶意地当作访问令牌使用。可以在访问令牌和刷新令牌的载荷中添加不同的声明,例如 token_type,用于区分令牌的类型。

示例:

# 访问令牌载荷
access_token_payload = {
    "sub": "user123",
    "token_type": "access_token"
}

# 刷新令牌载荷
refresh_token_payload = {
    "sub": "user123",
    "token_type": "refresh_token"
}

在验证令牌时,检查 token_type 声明,确保令牌的类型与预期一致。

总结

安全地使用 JWT 需要理解其基本原理,并采取适当的安全措施。使用不同的密钥对访问令牌和刷新令牌进行签名,并验证令牌的类型,可以有效提高系统的安全性。 此外,定期审查和更新安全策略,以应对新的威胁和漏洞。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

412

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

533

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

27

2025.12.22

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6090

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

805

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1062

2023.12.21

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

25

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
SQL 教程
SQL 教程

共61课时 | 3.4万人学习

10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号