首页 > web前端 > js教程 > 正文

掌握 JWT(JSON Web 令牌):深入探讨

霞舞
发布: 2025-01-21 21:12:01
原创
577人浏览过

json web token (jwt)详解:跨域认证的流行解决方案

掌握 JWT(JSON Web 令牌):深入探讨

JWT是当前最广泛使用的跨域身份验证解决方案。本文将深入探讨其工作原理和使用方法。

一、跨域认证的挑战

互联网应用离不开用户身份验证。传统的流程通常如下:

  1. 用户提交用户名和密码给服务器。
  2. 服务器验证通过后,会在当前会话中存储用户信息,例如用户角色、登录时间等。
  3. 服务器返回一个session_id给用户,并写入用户的cookie。
  4. 用户后续请求都会通过cookie发送session_id给服务器。
  5. 服务器根据session_id查找用户信息,确定用户身份。

这种模式的扩展性差。在单机环境下可行,但在服务器集群或跨域微服务架构中,需要会话数据共享,每个服务器都能访问会话数据。例如,网站A和网站B属于同一公司,希望用户登录其中一个网站后,访问另一个网站也能自动登录,该如何实现?

一种方案是将会话数据持久化到数据库或其他存储层,各个服务请求数据时访问持久层。这种方法架构清晰,但工作量大,且持久层故障会造成单点故障。

另一种方案是服务器不存储会话数据,所有数据都保存在客户端,随每次请求发送给服务器。JWT正是这种方案的典型代表。

二、JWT的工作原理

JWT的原理是服务器验证用户身份后,生成一个JSON对象并返回给用户,例如:

<code>{"name": "alice", "role": "admin", "expiration time": "0:00, july 1, 2024"}</code>
登录后复制

用户后续与服务器通信时,需要携带此JSON对象。服务器根据此对象验证用户身份。为了防止数据篡改,服务器生成对象时会添加签名(具体细节稍后介绍)。

服务器不再保存会话数据,成为无状态服务器,更容易实现扩展。

三、JWT的数据结构

实际的JWT是一个长字符串,由点(.)分隔成三部分:

掌握 JWT(JSON Web 令牌):深入探讨

为了便于阅读,这里分行显示,实际JWT中没有换行符。

三部分分别为:

  • Header (头部)
  • Payload (有效载荷)
  • Signature (签名)

写成一行,格式为:Header.Payload.Signature

掌握 JWT(JSON Web 令牌):深入探讨

下面分别介绍这三部分:

3.1 Header (头部)

Header是一个JSON对象,描述JWT的元数据,通常如下:

<code>{"alg": "HS256", "typ": "JWT"}</code>
登录后复制

alg属性表示签名算法(algorithm),默认为HMAC SHA256 (HS256);typ属性表示token类型,JWT token统一为"JWT"。

使用Base64Url算法将JSON对象转换为字符串(稍后详细介绍)。

3.2 Payload (有效载荷)

Payload也是一个JSON对象,存储实际需要传输的数据。JWT定义了7个标准字段:

  • iss (Issuer): 发行者
  • exp (Expiration Time): 过期时间
  • sub (Subject): 主题
  • aud (Audience): 观众
  • nbf (Not Before): 生效时间
  • iat (Issued At): 发行时间
  • jti (JWT ID): 唯一标识符

除了标准字段,还可以自定义私有字段。例如:

<code>{"sub": "1234567890", "name": "john doe", "admin": true}</code>
登录后复制

注意,JWT默认不加密,任何人都可读取。因此,不要在Payload中放置敏感信息。

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online30
查看详情 Find JSON Path Online

Payload也需要使用Base64Url算法转换为字符串。

3.3 Signature (签名)

Signature是前两部分的签名,用于防止数据篡改。

需要一个密钥(secret),只有服务器知道,不能泄露。使用Header中指定的签名算法(默认为HMAC SHA256),根据以下公式生成签名:

<code>HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)</code>
登录后复制

计算出签名后,将Header、Payload、Signature组合成一个字符串,用点(.)分隔,返回给用户。

3.4 Base64Url

Header和Payload的编码算法是Base64Url。它与Base64类似,但对URL不安全的字符进行了替换:=省略,+替换为-/替换为_

四、JWT的使用方法

客户端收到JWT后,可以存储在cookie或localStorage中。

每次与服务器通信时,需要携带JWT。可以将其放在HTTP请求头的Authorization字段中:

Authorization: Bearer <JWT>

或者在跨域请求时,将其放在POST请求的数据体中。

五、JWT的特点

(1) JWT默认不加密,但可以加密。

(2) 未加密的JWT不能存储敏感数据

(3) JWT不仅用于身份验证,也可用于信息交换。

(4) JWT最大的缺点是服务器不保存会话状态,无法在使用过程中撤销令牌或更改权限。

(5) JWT本身包含认证信息,一旦泄露,任何人都可获得权限。应设置较短的有效期,并对重要权限进行二次验证。

(6) JWT应通过HTTPS传输,避免明文传输。

Leapcell:最佳无服务器平台

掌握 JWT(JSON Web 令牌):深入探讨

推荐一个部署Web服务的优秀平台:Leapcell

1. 多语言支持

  • 支持JavaScript、Python、Go或Rust开发。

2. 免费部署无限项目

  • 只需支付使用费用,无请求不收费。

3. 高性价比

  • 按需付费,无闲置费用。

4. 简化的开发者体验

  • 直观的用户界面,轻松设置。
  • 自动化的CI/CD管道和GitOps集成。
  • 实时指标和日志记录。

5. 可扩展性和高性能

  • 自动缩放,轻松处理高并发。
  • 零运营开销。

掌握 JWT(JSON Web 令牌):深入探讨

更多信息请访问Leapcell文档!

Leapcell Twitter: https://www.php.cn/link/86fd6c86e53687c67e50bd29a08b133e

以上就是掌握 JWT(JSON Web 令牌):深入探讨的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

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