详解JWT与Token的应用与原理

yizhihongxing

详解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 app 打包工具pkg的具体使用

    当使用Node.js开发应用程序时,我们通常会使用一些打包工具来将我们的代码打包成一个可执行文件,以便于在不安装Node.js的环境中运行应用。 其中,pkg是一款常用的打包工具。它可以将我们的代码打包成可执行文件,而且可以支持不同平台的打包。本攻略将会具体介绍pkg的使用方法。 安装pkg 在使用pkg之前,我们首先需要安装它。使用npm即可完成: npm…

    node js 2023年6月8日
    00
  • Nodejs极简入门教程(一):模块机制

    Nodejs极简入门教程(一):模块机制 Node.js的模块机制是指Node.js通过特定的方式将代码封装成独立的模块,并提供模块之间的互相调用和复用的能力。 1. Node.js中的模块是什么? 在Node.js中,模块可以理解为一个独立的JavaScript文件,该文件中包含了一个或多个函数或者全局变量,同时对外提供了一些接口,以供其他模块调用和使用。…

    node js 2023年6月8日
    00
  • jquery下jstree简单应用 – v1.0

    下面是jQuery下jstree简单应用的完整攻略: 一、jstree是什么? jstree是一个非常优秀、强大的jQuery插件,可以用来创建树形图结构。它支持多种数据源(包括 JSON 和 XML),提供了丰富的配置和事件处理机制,可以灵活、方便的展现数据结构。 二、如何使用jstree? 1. 引入js和css资源文件 <link rel=&qu…

    node js 2023年6月8日
    00
  • 跟我学Nodejs(一)— Node.js简介及安装开发环境

    跟我学Node.js(一)— Node.js简介及安装开发环境 什么是Node.js Node.js是一个基于Chrome V8 JavaScript引擎的JavaScript后端开发框架,它使得JavaScript可以在服务端运行,同时也可以用于编写命令行工具。 Node.js的特点 单线程,事件驱动的非阻塞I/O模型,适合处理高并发场景。 基于事件回…

    node js 2023年6月8日
    00
  • Express.JS使用详解

    Express.js使用详解 Express.js 是一款基于 Node.js 平台的开源,极简,灵活的web应用开发框架。本文将详细介绍如何在 Node.js 中使用 Express.js。 安装和初始化项目 在使用 Express.js 前,需要在本地环境中安装 Node.js 和 npm。安装完毕后,可以使用以下命令全局安装 Express.js: n…

    node js 2023年6月8日
    00
  • 用Node写一条配置环境的指令

    以下是用Node写一条配置环境的指令的攻略: 一、什么是配置环境? 在开发过程中,我们可能使用了许多不同的工具和框架,每个工具和框架都有自己的配置环境。配置环境的主要目的是为了在不同的设备和不同的开发环境中,能够保证应用程序可以正常运行。因此,配置环境是非常重要的一步,它直接关系到应用程序的运行结果。在这里,我们主要讲解如何使用Node写一条配置环境的指令。…

    node js 2023年6月8日
    00
  • React和Node.js快速上传进度条功能实现

    React和Node.js快速上传进度条功能实现 上传文件的进度条功能是现代Web应用程序中的常见需求。本文将介绍如何使用React和Node.js创建一个快速上传进度条。 前置条件 在学习具体的实现前,你需要掌握以下技能和知识: 掌握React基础知识和操作; 掌握Node.js和Express框架的基础知识; 掌握使用axios发送http请求; 掌握使…

    node js 2023年6月8日
    00
  • nodejs图片处理工具gm用法小结

    Node.js图片处理工具gm用法小结 简介 GraphicsMagick (GM) 是一个命令行图象处理程序,所以需要在终端下运行,较为麻烦。而 gm 模块就是对 GraphicsMagick 程序进行封装,使其可以通过 Node.js 调用,在 Node.js 中操作图片变得异常方便。 安装 首先,需要在本地安装 GraphicsMagick 或者 Im…

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