首页 > 其他分享 >什么是 JSON Web Token

什么是 JSON Web Token

时间:2023-09-24 21:57:54浏览次数:34  
标签:Web 令牌 验证 JWT JSON 用户 Token 身份验证 Payload

JSON Web Token(JWT),又称为JSON令牌,是一种用于在网络应用之间安全地传输信息的开放标准(RFC 7519)。它采用了一种紧凑的、自包含的方式来表示信息,通常用于身份验证和授权。JWT的设计目标是确保信息的完整性和安全性,同时具备易于使用和传输的特点。

JWT的结构

JWT由三个部分组成,它们之间以.分隔,分别是:

  1. Header(头部):包含了关于令牌的元数据和描述,通常包括令牌的类型(typ)和签名算法(alg)等信息。这一部分是一个JSON对象,通常会被base64url编码。

  2. Payload(载荷):包含了需要传输的数据,也是一个JSON对象,通常包括一些声明(claim)和用户定义的数据。常见的声明有:

    • iss(Issuer):令牌的发行者。
    • sub(Subject):令牌的主题,通常是用户的唯一标识符。
    • aud(Audience):令牌的受众,表示该令牌针对哪些接收者。
    • exp(Expiration Time):令牌的过期时间。
    • iat(Issued At):令牌的颁发时间。
    • nbf(Not Before):令牌的生效时间。
    • jti(JWT ID):令牌的唯一标识符。

    除了标准声明,你还可以在Payload中添加自定义的数据。

  3. Signature(签名):用于验证JWT的真实性和完整性。签名的生成方式通常是将Header和Payload部分组合起来,使用一个密钥(secret key)进行哈希运算,然后再与令牌中的签名部分比对。这个部分确保了令牌在传输过程中没有被篡改。

下面是一个JWT的示例:

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

Payload:
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

Signature:
HMACSHA256(
  base64UrlEncode(Header) + "." +
  base64UrlEncode(Payload),
  secret_key
)

上述示例中,Header指定了使用HS256(HMAC SHA-256)算法进行签名,Payload包含了主题(sub)、姓名(name)以及颁发时间(iat)等信息,Signature使用了一个秘钥(secret_key)来生成。

JWT的工作流程

JWT的工作流程通常涉及三个主要角色:颁发者(Issuer)、用户(User)、验证者(Verifier)。

  1. 颁发者(Issuer):颁发者是负责创建JWT的实体。颁发者将用户的信息和一些声明以及一个签名加工在一起,生成一个JWT,并将其发送给用户。

  2. 用户(User):用户是JWT的持有者,通常是一个需要在不同应用之间传递信息的实体。用户可以在需要的时候将JWT发送给不同的应用来进行身份验证或授权。

  3. 验证者(Verifier):验证者是负责验证JWT的实体。它们接收到JWT后,首先会解析JWT的Header和Payload,然后使用事先共享的密钥来验证Signature的有效性。如果验证成功,验证者可以信任JWT中包含的信息。

JWT的工作流程如下:

  • 用户通过某种方式(例如用户名密码登录)向颁发者请求令牌。
  • 颁发者验证用户的身份后,创建一个JWT,包含用户的信息和一些声明,然后使用自己的私钥来签名JWT。
  • 颁发者将JWT发送给用户。
  • 用户在与不同的应用通信时,可以将JWT发送给应用作为身份验证或授权凭证。
  • 应用接收到JWT后,使用之前与颁发者共享的公钥来验证JWT的签名,确保JWT没有被篡改。
  • 如果JWT验证通过,应用可以信任其中的信息,并根据需要执行相应的操作。

JWT的优点

JWT在现代应用程序中广泛使用,因为它具有多个优点:

  1. 轻量级和自包含性:JWT是紧凑的文本格式,易于传输和解析。所有必要的信息都包含在JWT本身中,无需在服务器上保留会话状态。

  2. 分布式身份验证:JWT使得分布式系统中的身份验证变得更加简单,因为不同的应用可以共享相同的JWT颁发者,而无需在各自的数据库中存储用户凭据。

  3. 无状态:由于JWT本身包含了所有必要的信息,服务器不需要维护会话状态,这对于负载均衡和容错性很有帮助。

  4. 可扩展性:JWT的Payload可以包含自定义声明,可以根据应用的需求添加额外的信息。

  5. 安全性:JWT使用签名来保护其完整性,防止篡改。使用适当的算法和密钥可以确保JWT的安全性。

使用场景

JWT通常用于以下场景:

  1. 身份验证:用户登录后,颁发者可以生成一个包含用户信息的JWT,用户可以在请求中携带该JWT,以证明其身份。

  2. 授权:应用可以使用JWT来授权用户访问某些资源或执行特定操作。JWT的Payload可以包

含用户的角色和权限信息。

  1. 单点登录(SSO):JWT可以用于实现单点登录,用户只需登录一次,就可以访问多个关联的应用。

  2. 密码重置:JWT可以用于生成包含密码重置信息的令牌,用户可以使用该令牌来重置其密码。

  3. 信息交换:JWT可以用于不同应用之间安全地交换信息,例如在微服务架构中。

安全考虑

虽然JWT在许多场景下非常有用,但也需要谨慎使用以确保安全性:

  1. 密钥管理:密钥的安全管理是关键。泄漏密钥会导致令牌被伪造,因此需要采用适当的密钥管理措施,如定期轮换密钥。

  2. 过期时间:JWT通常包含了过期时间(exp)声明,应用需要定期检查令牌的有效性,并确保不使用已过期的令牌。

  3. 非对称加密:对于高度敏感的信息,可以考虑使用非对称加密算法,以提高安全性。在这种情况下,验证者使用颁发者的公钥来验证签名。

  4. 避免在令牌中存储敏感信息:尽量避免在JWT的Payload中存储敏感信息,因为Payload部分是Base64编码的,可能会被解码。

  5. 使用HTTPS:JWT在传输过程中可能会被截获,因此建议在使用JWT时始终使用HTTPS来确保通信的安全性。

示例应用:使用Node.js和Express验证JWT

下面是一个使用Node.js和Express验证JWT的简单示例:

const express = require('express');
const jwt = require('jsonwebtoken');

const app = express();
const secretKey = 'your-secret-key';

// 中间件:验证JWT
const verifyToken = (req, res, next) => {
  const token = req.headers.authorization;
  
  if (!token) {
    return res.status(401).json({ message: '无法验证身份' });
  }

  jwt.verify(token, secretKey, (err, decoded) => {
    if (err) {
      return res.status(401).json({ message: '身份验证失败' });
    }
    req.user = decoded;
    next();
  });
};

// 路由:受保护的资源
app.get('/protected', verifyToken, (req, res) => {
  res.json({ message: '欢迎访问受保护的资源', user: req.user });
});

// 路由:生成JWT
app.post('/login', (req, res) => {
  const user = { id: 1, username: 'user123' };
  const token = jwt.sign(user, secretKey, { expiresIn: '1h' });
  res.json({ token });
});

app.listen(3000, () => {
  console.log('服务器运行在端口 3000');
});

在上述示例中,服务器使用Express框架创建,包含了两个路由。/login路由用于生成JWT,/protected路由受保护,只有携带有效JWT的请求才能访问。

结论

JSON Web Token(JWT)是一种广泛用于身份验证和授权的标准,它具有轻量级、自包含、分布式、无状态、可扩展等优点,适用于多种应用场景。然而,使用JWT时需要注意密钥管理、安全性和合适的过期时间等方面,以确保应用的安全性。

JWT在现代应用程序中扮演着重要的角色,为开发人员提供了一种灵活且安全的方式来传输信息和验证用户身份。它已成为许多Web应用、移动应用和API的标准身份验证方法之一,可以帮助开发人员构建更安全、更灵活的应用程序。

标签:Web,令牌,验证,JWT,JSON,用户,Token,身份验证,Payload
From: https://www.cnblogs.com/sap-jerry/p/17726760.html

相关文章

  • Angular 应用开发中 Injection Token 的使用方法介绍
    Angular是一个流行的前端JavaScript框架,它提供了一种强大的方式来构建单页应用程序(SPA)。在Angular中,依赖注入(DependencyInjection,DI)是一项关键的功能,它允许我们有效地管理应用程序中的依赖关系。Angular的依赖注入系统使用InjectionToken来实现某些特殊的依赖注入需求。在本文中,......
  • stable-diffusion-webui Github 代码仓库的介绍
    stable-diffusion-webui:一个基于Web的稳定梯度流生成模型训练工具stable-diffusion-webui是一个位于GitHub上的开源代码仓库,地址为https://github.com/AUTOMATIC1111/stable-diffusion-webui。该仓库提供了一个基于Web的用户界面,旨在简化使用StableDiffusion这一生成模......
  • kubepi加入集群,生成token
    防丢失https://www.cnblogs.com/Chinori/p/17506348.html kubectlcreatesakubepi-user--namespacekube-systemkubectlcreateclusterrolebindingkubepi-user--clusterrole=cluster-admin--serviceaccount=kube-system:kubepi-userkubectl-nkube-systemcreatetoke......
  • 无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/
    今天解决了一个很早之前的问题!!!无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]之前一直以为是jar包不匹配,但是改了jar包之后连uri都分辨不出来了后来在网上查到是tomcat的问题,将tomcat的conf目录下的catalina.properties的tomc......
  • webstorm插件分享
    插件修改选中区域背景......
  • [转]Websocket 底层是 TCP 还是 UDP?白话版解析 TCP 和 UDP 传输过程
    原文地址:Websocket底层是TCP还是UDP?白话版解析TCP和UDP传输过程-掘金写在前面在前面陆陆续续写了好几篇数字孪生相关的文章,而其中所涉及的一个其他项目比较不常使用的技术,网络通讯协议Websocket,这个协议主要用于服务器定时向客户端推送数据,相比HTTP更加适合数字......
  • 一文弄懂Java线程池 + Runnable多线程 + 调用WebService接口
    大家好,我是哪吒。一、需求很简单根据接口文档,调用第三方webservice接口,拼接入参,处理回参。RPC调用Webservice接口是一种远程调用的方式,通过指定Webservice接口的调用地址、命名空间、调用的方法名调用远程接口获取结果。二、解决方案通过ExecutorService新建线程池;定义thread类,请......
  • 青少年CTF Web题目 - 哥哥打篮球
    题目链接:青少年CTF训练平台|原中学生CTF平台|青少年CTF(qsnctf.com)打开后是这样的先查看一下源代码,使用快捷键Ctrl+U,然后查看一下这个main.js文件直接搜索if判断语句,发现JSfuck编码,并且发现主要部分乱码了那先看看jsfuck解码的明文是什么,直接放到控制台回车,发现......
  • JavaWeb中对于 request对象和response对象的理解
    1.request对象和response对象的原理1.request和response对象是由服务器创建的。我们来使用它们2.request对象是来获取请求消息,response对象是来设置响应消息2.request对象继承体系结构:ServletRequest--接口|继承HttpServletRequest--接口|实现org.apache.catali......
  • 基于go语言gin框架的web项目骨架
    该骨架每个组件之间可单独使用,组件之间松耦合,高内聚,组件的实现基于其他三方依赖包的封装。目前该骨架实现了大多数的组件,比如事件,中间件,日志,配置,参数验证,命令行,定时任务等功能,目前可以满足大多数开发需求,后续会持续维护更新功能。github地址:https://github.com/czx-lab/sk......