详解JWT与Token的应用与原理

详解JWT与Token的应用与原理

什么是JWT

JWT(JSON Web Token)是一种用于网络通信的协议,主要用来在网络应用之间传递认证及授权数据。JWT 将用户信息进行编码,形成一个字符串并将其发送到客户端,在客户端需要访问受保护的资源时,将其发送回服务器进行验证。JWT 是有状态的,因为其中包含了用户的信息,而服务器在解析 Token 时,会将其中的信息还原。

JWT 主要由三部分组成:Header、Payload 和 Signature。其中 Header 和 Payload 都是 JSON 格式的数据。Header 主要用来描述 JWT 的元数据信息,例如使用的加密算法等;Payload 则是我们传递的信息部分,例如用户的ID、角色和访问权限等。Signature 是对 Header 和 Payload 的签名,用来防止信息被篡改。

为什么需要 JWT

在传统的 Web 应用中,服务器在用户登录后,会将用户信息保存在 Session 中,并返回 Session ID 给客户端,在后续的请求中客户端需要将这个 Session ID 放在请求头上,以便服务器识别当前用户的身份。

这种方式会遇到一些问题,例如:

  • Session 需要服务器进行存储,增加了服务器的负担;
  • Session 是有状态的,需要多台服务器共享存储,增加了集群的复杂度;
  • Session 无法跨域,使用 JWT 可以解决跨域的问题。

而使用 JWT 的方式,我们只需要在服务器端进行签名即可,不需要进行存储。同时,JWT 本身包含了用户的信息,因此可以避免对 Session 的依赖。并且由于 JWT 存储于客户端,因此可以跨域使用。

如何使用 JWT

生成 JWT

在生成 JWT 时,需要将 Header 和 Payload 部分进行编码,并进行签名。例如:

// Header
{
  "alg": "HS256", // 签名算法
  "typ": "JWT"    // token类型
}

// Payload
{
  "sub": "1234567890", // token的所有用户的唯一标识
  "name": "John Doe",  // 用户名称
  "iat": 1516239022   // token的颁发时间
}

// Signature
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

其中,Header 和 Payload 都是 JSON 格式的数据,并分别进行了 base64 编码。Signature 由 Header 和 Payload 进行签名得到。

验证 JWT

在服务端验证 JWT 时,主要是对 Signature 进行验证。首先服务器需要获取到 Header 和 Payload 部分,并根据 Header 部分指定的算法进行签名,然后验证得到的 Signature 是否一致。

示例1

假设我们的服务器需要对用户进行认证,用户在登录时需要提供用户名和密码,并返回 JWT。后续用户访问受保护的资源时,需要在请求头上携带 JWT。

curl -X POST http://localhost:3000/login \
     -H 'Content-Type:application/json' \
     -d '{"username": "admin", "password": "123456"}'
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6I..."
}

此时客户端可以将 JWT 存储在 localStorage 或 Cookie 中,并在后续请求中将其添加到请求头中。

curl -X GET http://localhost:3000/protected \
     -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6I...'

服务端在验证 JWT 时,可以通过解析 Header 和 Payload 进行验证,并根据用户 ID 查找用户信息,如果验证成功则返回数据。

示例2

假设我们需要开发一个 API,其中部分 API 需要进行权限验证。使用 JWT 可以实现类似的功能。

在用户登录时,服务器会返回 JWT,并在其中包含用户的信息和访问权限。

curl -X POST http://localhost:3000/login \
     -H 'Content-Type:application/json' \
     -d '{"username": "admin", "password": "123456"}'
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6I...",
  "user_id": 1234567890,
  "role": "admin",
  "permissions": ["read", "write"]
}

当用户进行受保护的 API 访问时,需要在请求头上添加 JWT,服务器在验证 JWT 后,可以根据其中包含的用户信息和访问权限判断是否有权限进行访问。

curl -X GET http://localhost:3000/api/v1/users \
     -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6I...'

以上两个示例是 JWT 在实际开发中的两种应用场景,可以根据需要灵活地处理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解JWT与Token的应用与原理 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • Node.js使用Middleware中间件教程详解

    Node.js使用Middleware中间件教程详解 什么是中间件Middleware? Middleware中间件即为应用程序和操作系统之间的连接层,它允许进行定制化的代码挂载,实现对请求和响应的拦截,对数据进行一系列的处理和转派,以完成复杂的业务逻辑。 为什么要使用中间件Middleware? 在进行Web服务开发时,我们经常需要处理各种请求场景,例如:…

    node js 2023年6月8日
    00
  • JavaScript中匿名函数的递归调用

    JavaScript中匿名函数的递归调用是一种常见的编程技巧。本文将介绍如何编写并理解匿名函数的递归调用。 什么是匿名函数 在JavaScript中,函数可以有名字,也可以没有名字。没有名字的函数被称为匿名函数。匿名函数可以像普通函数一样被调用和传递。 以下代码展示了一个匿名函数的例子: (function() { console.log(‘Hello Wo…

    node js 2023年6月8日
    00
  • node.js学习之事件模块Events的使用示例

    Node.js学习之事件模块Events的使用示例 Node.js中的事件驱动模型基本上是所有I/O操作的基础。EventEmitter是Node.js的核心模块之一,它提供了事件处理的接口,可以用于自定义事件,或者处理Node.js内部提供的事件。 事件模块Events的基础使用 继承EventEmitter 我们可以用ES6的方式继承Node.js提供的…

    node js 2023年6月8日
    00
  • 解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题

    当我们使用Node.js连接MySQL数据库时,有可能会出现connect ECONNREFUSED 127.0.0.1:3306的错误。这种错误通常是由于MySQL服务未启动、端口被占用、权限问题等原因引起的。接下来我将详细介绍如何解决这个问题。 问题分析 当我们使用Node.js连接MySQL数据库时,通常使用第三方库,如mysql、mysql2等。这些…

    node js 2023年6月8日
    00
  • 如何在nodejs中体验http/2详解

    当我们使用nodejs开发Web应用程序时,常常需要涉及HTTP协议的使用。那么在HTTP/2协议下,如何在Node.js中体验HTTP/2呢?下面提供一份详细的攻略。 1. 判断Node.js版本 在Node.js中使用HTTP/2协议,需要保证Node.js版本在v8.4.0及以上。可以使用以下命令来判断当前Node.js版本: node -v 2. 安…

    node js 2023年6月8日
    00
  • 前端node Session和JWT鉴权登录示例详解

    我将为您详细讲解“前端node Session和JWT鉴权登录示例详解”的完整攻略。 什么是Session和JWT鉴权? Session和JWT鉴权都是用于登录验证的一种方式。Session是基于服务器端的,而JWT鉴权是基于客户端的。在Session中,用户登录后,服务器会为该用户创建一个session,并返回一个session ID 给客户端,后续的请求…

    node js 2023年6月8日
    00
  • sails框架的学习指南

    Sails框架学习指南 Sails是一个快速开发、基于MVC模式的Node.js Web应用框架,它使用了Node.js的Express框架作为HTTP服务基础,并在此基础之上扩展了一整套功能,如数据访问、模型和实时通讯等。本文将提供一份Sails框架的学习指南,以帮助您更快更好地掌握这个框架。 安装Sails 在开始学习Sails之前,首先需要安装它。在安…

    node js 2023年6月8日
    00
  • 又拍云 Node.js 实现文件上传、删除功能

    以下是“又拍云 Node.js 实现文件上传、删除功能”的完整攻略: 准备工作 首先,你需要拥有一个又拍云的账号,并开通相应的存储服务。然后,在本地电脑上安装Node.js,使用npm包管理器安装以下的依赖库: npm install upyun npm install formidable 其中,upyun是用于操作又拍云存储服务的SDK,formidab…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部