当前位置: 首页 > news >正文

WHAT - JWT(JSON Web Token)

目录

  • 组成格式
  • 存储位置
  • 如何解析

在如下文章中,我们都提到了 JWT(JSON Web Token):

  • WHAT - 用户登录系列(二)- 单点登录 SSO
  • WHAT - 用户登录系列(三)- Bearer Token、OAuth 2.0、OIDC、PKCE

我们今天就来介绍一下。

JSON Web Tokens (JWT) 是一种用于在网络应用间安全传递信息的一种简洁的、自包含的方式。JWT可以通过数字签名来验证数据的完整性和来源。

JWT通常用于身份验证和信息交换,特别是在分布式环境中。

组成格式

JWT(JSON Web Token),通常是一个 Base64 编码的字符串,由 三部分 组成:

  1. Header(头部) - 描述签名算法(alg)、令牌类型(typ)等信息
  2. Payload(负载) - 包含用户身份信息(如 subnameemail)、过期时间等
  3. Signature(签名) - 用于验证 Token 的完整性和真实性。由将 Header 和 Payload 使用指定的算法(如HMAC、RSA等)和密钥(始终存储在服务器上)加密后生成的。

示例:

eyJhbGciOiJSUzI1NiIsImtpZCI6IjE2MzEyMzEyMzEyMzEyMzEyIn0.
eyJpc3MiOiJodHRwczovL2lkcC5leGFtcGxlLmNvbSIsInN1YiI6IjEyMzQ1Njc4OTAiLCJhdWQiOiJteWFwcCIsIm5hbWUiOiJUb20gU21pdGgiLCJlbWFpbCI6InRvbS5zbWl0aEBleGFtcGxlLmNvbSIsImlhdCI6MTYzMDQ5NzYwMCwiZXhwIjoxNjMwNTAxMjAwfQ.
MFLw38F5I1p3o4vUuM35Xly_7RYBRjNwhYF83X...

这个 Token 由三部分组成,以 . 分隔。

以前后端交互为例,在后续服务器拿到前端传过来的 JWT 的验证过程中,服务器会首先对 Header 和 Payload 进行解码,然后使用相同的密钥和算法对 Header 和 Payload 重新进行签名,并与 JWT 中的 Signature 部分进行比对,来验证 JWT 的完整性和真实性。

另外,JWT 可能包含其他的声明,如发行人(issuer)、受众(audience)等。服务器可以根据应用程序的需求来验证这些声明是否符合预期,以进一步确保 JWT 的有效性。

存储位置

一般可以存储在:

  1. HTTP Cookie(推荐,配合 HttpOnlySecure
  2. LocalStorage(不推荐,可能被 XSS 攻击窃取)
  3. SessionStorage(仅限当前会话)
  4. Memory(内存存储)(适用于前端 SPA 应用)

🔹 安全建议

  • 尽量存储在 Cookie 中,并启用 HttpOnlySecure 选项,防止 XSS 攻击。
  • 避免存储在 LocalStorage,因为它容易被 JavaScript 访问(可能被 XSS 攻击)。
  • 若存储在内存中,刷新页面后会丢失 Token(适用于短会话)。

如何解析

前端可以使用 jwt-decode 解析:

import jwtDecode from "jwt-decode";

const idToken = "eyJhbGciOiJSUzI1NiIsImtpZCI6...";
const decoded = jwtDecode(idToken);
console.log(decoded);

📌 输出:

{
  "iss": "https://idp.example.com",
  "sub": "1234567890",
  "aud": "myapp",
  "name": "Tom Smith",
  "email": "tom.smith@example.com",
  "iat": 1630497600,
  "exp": 1630501200
}
http://www.dtcms.com/a/109632.html

相关文章:

  • 颜色归一化操作
  • 设计心得——状态机
  • STM32单片机入门学习——第12节: [5-2]对射式红外传感器计次旋转编码器计次
  • 多模态学习(八):2022 TPAMI——U2Fusion: A Unified Unsupervised Image Fusion Network
  • MySQL数据库脱敏实战指南:从原理到企业级实现
  • torch.nn中的非线性激活介绍合集——Pytorch中的非线性激活
  • Webacy 利用 Walrus 技术构建链上风险分析决策层
  • 软考又将迎来新的改革?
  • c#和c++脚本解释器科学运算
  • 约瑟夫环的四种(数组,链表,递归,迭代)解决方案,与空间、时间复杂度分析
  • 【Linux】远程登录时,使用图形界面报错:MoTTY X11 proxy: Unsupported authorisation protocol
  • Vue 学习随笔系列二十二 —— 表格高度自适应
  • 一个完整的 HTTP/HTTPS 请求流程
  • 【电路笔记】-触发器的转换
  • ctfshow VIP题目限免 源码泄露
  • 【面试篇】Es
  • QTableWidget 中insertRow(0)(头插)和 insertRow(rowCount())(尾插)的性能差异
  • 服务器磁盘io性能监控和优化
  • c++中cin.ignore()的作用
  • Unirest:优雅的Java HTTP客户端库
  • CUDA概览
  • Python星球日记 - 第1天:欢迎来到Python星球
  • 十款Steam单机游戏
  • 2025-04-03 Latex学习1——本地配置Latex + VScode环境
  • PandasAI:当数据分析遇上自然语言处理
  • uni-app项目上传至gitee方法详细教程
  • Java代理(六)当前主流动态代理框架性能对比
  • 安全、可靠,企业内部im即时通讯软件选择
  • 十一、buildroot系统登录配置
  • 从0开始的构建的天气预报小时钟(基于STM32F407ZGT6,ESP8266 + SSD1309)——第1章 简单的介绍一下ESP8266和他的编程指令