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

JSON Web Token (JWT) 详解:由来、原理与应用实践

1. JWT的由来与发展背景

 1.1 HTTP无状态性带来的挑战

        HTTP协议本质上是无状态的,这意味着服务器不会记住之前的请求信息。在早期的Web应用中,用户每次访问受保护资源都需要重新登录,这显然不是良好的用户体验。为解决这一问题,开发者引入了Cookie技术,通过在请求和响应报文中写入Cookie信息来控制客户端状态。

 1.2 Session认证机制的局限性

        传统的基于Session的身份认证机制虽然解决了HTTP无状态的问题,但随着互联网应用的发展,逐渐暴露出几个关键问题:

1.服务器压力增大:每个认证用户都需要在服务端保存Session数据,随着用户量增长,服务器内存消耗显著增加。

2.扩展性问题:在分布式系统或集群环境下,Session数据通常存储在单台服务器内存中,当用户请求被负载均衡到不同服务器时,会出现Session不一致的问题。

3.CSRF攻击风险:Session机制依赖Cookie,容易受到跨站请求伪造(CSRF)攻击。

4.移动端适配困难:移动应用对Cookie的支持不如浏览器完善,使得基于Session的认证在移动端表现不佳。

1.3 JWT的诞生

        为解决上述问题,JSON Web Token(JWT)应运而生。JWT是一种开放标准(RFC 7519),定义了一种紧凑且自包含的方式,用于在各方之间安全地传输JSON格式的信息。JWT的设计理念是将用户认证信息直接包含在Token中,而不是存储在服务器端,从而实现了无状态认证

2. JWT的核心结构与工作原理

2.1 JWT的组成结构

JWT由三部分组成,使用点号(.)连接:`Header.Payload.Signature`

2.1.1 Header(头部)

头部通常包含两部分信息:
typ:令牌类型,固定为"JWT"
alg:签名算法,如HS256(HMAC SHA-256)或RS256(RSA SHA-256)

示例:

json
{
  "alg": "HS256",
  "typ": "JWT"
}

头部经过Base64Url编码后形成JWT的第一部分。

2.1.2 Payload(负载)

负载包含声明(claims),即关于实体(通常是用户)和其他元数据的声明。声明分为三种类型:

1. 注册声明(Registered claims):预定义的声明,建议但不强制使用:
   - iss (issuer):签发者
   - exp (expiration time):过期时间
   - sub (subject):主题(用户ID)
   - aud (audience):接收方
   - iat (issued at):签发时间
   - nbf (not before):生效时间
   - jti (JWT ID):唯一标识

2. 公共声明(Public claims):可以自定义的公开字段,应避免冲突

3. 私有声明(Private claims):提供者和消费者共同定义的声明

示例:

http://www.xdnf.cn/news/887311.html

相关文章:

  • FPGA 的硬件结构
  • Cursor 集成 Figma MCP 实现阅读理解原型图生成方案
  • 【Fifty Project - D33】
  • PlayWright | 初识微软出品的 WEB 应用自动化测试框架
  • 记一次 Windows XP 系统安装配置 Minio
  • vue对axios的封装和使用
  • 在 UE5 蓝图中配置Actor类型的Asset以作为位置和旋转设置目标
  • 动态表单 LiveCycle 与 AcroForms 对比
  • VAE变分自编码器详解
  • 用 NGINX 搭建高效 IMAP 代理`ngx_mail_imap_module`
  • v-if与v-for联合使用
  • IDEA 开发PHP配置调试插件XDebug
  • 【C++11新特性】
  • 移动应用开发期末复习
  • 能不能用string接收数据库的datetime类型字段
  • ServBay 1.13.0 更新,新增第三方反向代理/内网穿透
  • 【C语言练习】082. 使用C语言实现简单的加密算法
  • 钉钉 - 机器人消息推送(签名版)
  • 【C++高阶二】STL的map和set
  • 软件测试基础知识总结
  • 基于51单片机的温控电机系统
  • Axure 与 Cursor 集成实现方案
  • 服务虚拟化HoverFly
  • MySQL中的部分问题(1)
  • EXCEL如何快速批量给两字姓名中间加空格
  • 区间动态规划
  • Next.js中Protected Route(受保护路由)
  • Next.js 中间件鉴权绕过漏洞 CVE-2025-29927
  • [Java恶补day16] 238.除自身以外数组的乘积
  • 命名管道实现本地通信