JWT 登录鉴权全流程完整步骤

 更新时间:2026年01月23日 09:58:57   作者:Aerkui  
JWT是一种用于在各方之间安全传输信息的开放标准,JWT的优势在于无状态、分布式支持和简单性,本文给大家介绍JWT登录鉴权全流程,感兴趣的朋友跟随小编一起看看吧

一、什么是 JWT?

JWT(JSON Web Token) 是一种开放标准(RFC 7519),用于在各方之间安全地传输信息。它常被用作用户登录后的身份凭证(替代传统的 Session)。

JWT 长什么样?

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJ1c2VyX2lkIjoxMjMsImV4cCI6MTcwMDAwMDAwMH0.
HMACSHA256(base64UrlEncode(header)+'.'+base64UrlEncode(payload), secret)

由三部分组成,用 . 连接:

  1. Header(头部):算法和类型
  2. Payload(载荷):用户数据 + 过期时间等
  3. Signature(签名):防篡改的关键

二、JWT 登录鉴权完整流程

📌 场景假设

  • 用户:alice
  • 密码:123456
  • 后端服务:提供 /login 和受保护的 /profile 接口

✅ 步骤 1:用户提交账号密码(登录)

POST /login
Content-Type: application/json
{
  "username": "alice",
  "password": "123456"
}

🔒 注意:密码应通过 HTTPS 传输!明文密码绝不应在日志或前端存储。

✅ 步骤 2:服务端验证账号密码

# 伪代码(Python + Flask)
from werkzeug.security import check_password_hash
@app.route('/login', methods=['POST'])
def login():
    data = request.json
    user = User.query.filter_by(username=data['username']).first()
    if not user or not check_password_hash(user.password_hash, data['password']):
        return jsonify({"error": "用户名或密码错误"}), 401
    # 验证通过,生成 JWT
    token = generate_jwt(user_id=user.id)
    return jsonify({"token": token})

⚠️ 安全提示:

  • 密码必须加盐哈希存储(如 bcrypt、scrypt)
  • 失败时不要区分“用户不存在”还是“密码错误”,防止枚举攻击

✅ 步骤 3:服务端生成 JWT 并返回

import jwt
import datetime
def generate_jwt(user_id):
    payload = {
        'user_id': user_id,
        'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=2),  # 2小时过期
        'iat': datetime.datetime.utcnow()  # 签发时间
    }
    secret = 'your_strong_secret_key'  # 必须保密!建议从环境变量读取
    return jwt.encode(payload, secret, algorithm='HS256')

📝 Payload 常见字段(Claims):

  • sub:主题(如用户ID)
  • exp:过期时间(必须设置!
  • iat:签发时间
  • jti:JWT ID(用于黑名单)

✅ 步骤 4:前端保存 Token

// 登录成功后
localStorage.setItem('token', response.data.token);
// 后续请求携带 Token
fetch('/profile', {
  headers: {
    'Authorization': 'Bearer ' + localStorage.getItem('token')
  }
})

💡 存储建议:

  • 短期 Token:可存 localStorage(注意 XSS 风险)
  • 高安全场景:存 HttpOnly Cookie(防 XSS,但需防 CSRF)

✅ 步骤 5:访问受保护接口(携带 Token)

GET /profile
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.xxxxx

✅ 步骤 6:服务端验证 JWT

@app.route('/profile')
def profile():
    auth_header = request.headers.get('Authorization')
    if not auth_header or not auth_header.startswith('Bearer '):
        return jsonify({"error": "缺少 Token"}), 401
    token = auth_header.split(' ')[1]
    try:
        payload = jwt.decode(token, 'your_strong_secret_key', algorithms=['HS256'])
        user_id = payload['user_id']
        user = User.query.get(user_id)
        return jsonify({"username": user.username})
    except jwt.ExpiredSignatureError:
        return jsonify({"error": "Token 已过期"}), 401
    except jwt.InvalidTokenError:
        return jsonify({"error": "无效 Token"}), 401

✅ 验证内容:

  1. 签名是否合法(防篡改)
  2. 是否过期(exp
  3. 用户是否存在(防删除账号后仍能访问)

三、JWT 的优势 vs 传统 Session

特性JWT(无状态)Session(有状态)
服务器存储不需要存 Token需要存 Session(内存/Redis)
扩展性天然支持分布式需共享 Session 存储
跨域支持简单(Header 携带)复杂(需处理 Cookie 跨域)
登出控制困难(除非用黑名单)简单(删 Session 即可)

🧩 结论

  • 小型项目、API 服务 → 推荐 JWT
  • 需要强登出控制、高安全性 → 考虑 Session + Redis

四、安全加固建议(必看!)

1. 使用强密钥

# .env
JWT_SECRET=your_very_long_random_string_32_chars_or_more!

2. 设置合理过期时间

  • Access Token:15分钟 ~ 2小时
  • 刷新 Token(Refresh Token):7天(存数据库,可吊销)

3. 敏感操作二次验证

  • 修改密码、支付等操作,即使有 Token 也要求重新输密码

4. 防止 Token 泄露

  • 前端避免打印 Token 到 console
  • 后端日志不要记录 Authorization Header

5. 考虑使用 JTI + 黑名单(实现登出)

# 登出时将 jti 加入 Redis 黑名单(有效期 = token 剩余时间)
redis.setex(f"blacklist:{payload['jti']}", ttl, "1")
# 验证时检查黑名单
if redis.get(f"blacklist:{payload['jti']}"):
    raise Exception("Token 已失效")

五、常见误区

误区1:JWT 是加密的
→ 错!JWT 默认是签名(Signature),不是加密(Encryption)。Payload 可被 Base64 解码!
✅ 敏感信息(如手机号)不要放 JWT!

误区2:Token 越长越好
→ 过长的 Token 会增加网络开销,且可能被代理截断

误区3:用了 JWT 就绝对安全
→ 安全取决于整体设计:HTTPS、密钥管理、输入校验缺一不可

六、总结:JWT 登录鉴权核心要点

  1. 登录 → 验证账号密码 → 生成带过期时间的 JWT
  2. 请求 → 前端在 Header 中携带 Authorization: Bearer <token>
  3. 鉴权 → 后端验证签名 + 过期时间 + 用户状态
  4. 安全 → 强密钥、短有效期、不存敏感信息、配合 HTTPS

🌟 记住:JWT 是工具,不是银弹。理解其原理,才能用得安全又高效。

附:快速上手资源

  • Python:PyJWT

到此这篇关于JWT 登录鉴权全流程详解的文章就介绍到这了,更多相关JWT 登录鉴权内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python中plot函数语法示例详解

    Python中plot函数语法示例详解

    这篇文章主要介绍了Python中plot函数语法的相关资料,文章详细介绍了MATLAB中的plot()函数,包括其语法、如何绘制二维线图、设置线型、标记符号和颜色以及如何绘制多组二维线图等,需要的朋友可以参考下
    2024-11-11
  • 如何使用python把ppt转换成pdf

    如何使用python把ppt转换成pdf

    这篇文章主要介绍了如何使用python把ppt转换成pdf,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-06-06
  • Python使用Keras库中的LSTM模型生成新文本内容教程

    Python使用Keras库中的LSTM模型生成新文本内容教程

    Python语言使用金庸小说文本库,对文本进行预处理,然后使用Keras库中的LSTM模型创建和训练了模型,根据这个模型,我们可以生成新的文本,并探索小说的不同应用
    2024-01-01
  • python绘图中的 四个绘图技巧

    python绘图中的 四个绘图技巧

    在可视化数据时,通常需要在单个图形中绘制多个图形。 例如,如果您想从不同的角度可视化相同的变量如:数字变量的并排直方图和箱线图,则多个图形很有用。 在这篇文章中,我分享了绘制多个图形的 4 个简单但实用的技巧,具有一定的参考价值,需要的小伙伴可以参考一下
    2021-12-12
  • Python模块常用四种安装方式

    Python模块常用四种安装方式

    这篇文章主要介绍了Python模块常用四种安装方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • python对离散变量的one-hot编码方法

    python对离散变量的one-hot编码方法

    今天小编就为大家分享一篇python对离散变量的one-hot编码方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • 解决pycharm debug时界面下方不出现step等按钮及变量值的问题

    解决pycharm debug时界面下方不出现step等按钮及变量值的问题

    这篇文章主要介绍了解决pycharm debug时界面下方不出现step等按钮及变量值的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Python中计算圆周率的方法汇总(方法合集)

    Python中计算圆周率的方法汇总(方法合集)

    这篇文章主要介绍了Python中计算圆周率的方法汇总(方法合集),包括使用math库中的pi常量,使用级数展开公式计算π,本文给大家列举多种方法帮助大家学习,需要的朋友可以参考下
    2022-06-06
  • Python封装shell命令实例分析

    Python封装shell命令实例分析

    这篇文章主要介绍了Python封装shell命令,实例分析了Python将各种常用shell命令封装进一个类中以便调用的方法,非常具有实用价值,需要的朋友可以参考下
    2015-05-05
  • 如何把外网python虚拟环境迁移到内网

    如何把外网python虚拟环境迁移到内网

    这篇文章主要介绍了如何把外网python虚拟环境迁移到内网,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05

最新评论