了解 JSON Web 令牌 (JWT)

一. 介绍

在现代 Web 开发领域,确保客户端和服务器之间的通信安全至关重要。JSON Web Tokens (JWT) 已成为确保安全高效数据交换的流行解决方案。本文将深入探讨 JWT 是什么、它们的工作原理以及它们为何对于 Web 应用程序中的安全身份验证和授权至关重要。

二. 什么是 JSON Web Token (JWT)?

JSON Web Token (JWT) 是一种紧凑且 URL 安全的表示双方之间传输声明的方式。JWT 中的声明被编码为 JSON 对象,该对象使用 JSON Web 签名 (JWS) 进行数字签名,并可选择使用 JSON Web 加密 (JWE) 进行加密。

三. JWT 的结构

JWT 由三部分组成,以点(.)分隔:Header、Payload 和 Signature。

  1. 标头:包含有关令牌的元数据,包括令牌的类型(JWT)和使用的签名算法(例如,HMAC SHA256)。
{"alg": "HS256","typ": "JWT"
}
  1. 有效负载:包含声明。声明是关于实体(通常是用户)和其他数据的声明。声明有三种类型:注册声明、公开声明和私有声明。
{"sub": "1234567890","name": "John Doe","admin": true
}
  1. 签名:用于验证令牌的真实性。它是通过使用 Base64Url 编码对标头和有效负载进行编码并将它们与密钥或私钥连接起来而创建的。
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),secret
)

四. JWT 如何工作?

JWT 通常用于用户需要验证身份并授权访问资源的场景。以下是典型流程。

  1. 用户登录:用户使用其凭证登录。
    令牌生成:服务器验证凭证并生成 JWT,并使用密钥对其进行签名。

  2. Token 存储: JWT 被发送到客户端并存储,通常在本地存储或 cookie 中。
    经过身份验证的请求:对于后续请求,客户端将 JWT 包含在授权标头(Bearer 令牌)中。

  3. Token验证:服务端使用密钥对JWT进行验证,确保其有效性和真实性。
    访问授权:如果令牌有效,服务器将处理请求并发送响应。

五. JWT 的优点

  • 无状态: JWT 是自包含的,不需要服务器端会话,因此具有可扩展性。
  • 紧凑: JWT 的紧凑特性使其非常适合在 URL、HTTP 标头和 cookie 中使用。因为JWT只包含必要的信息,所以它们通常比传统的session cookie要紧凑。这意味着它们在传输时占用更少的带宽。
  • 多功能: JWT 既可以用于身份验证,也可以用于信息交换。
  • 可互操作: JWT 与语言无关,可以在不同的平台和编程语言中使用。

六. 在应用程序中实现 JWT

1. 生成 JWT

要生成 JWT,您需要创建标头、有效负载和签名。

using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using Microsoft.IdentityModel.Tokens;
using System.Text;public class JwtTokenService
{private const string SecretKey = "your-256-bit-secret";private readonly SymmetricSecurityKey _signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(SecretKey));public string GenerateToken(string userId){var claims = new[]{new Claim(JwtRegisteredClaimNames.Sub, userId),new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())};var token = new JwtSecurityToken(issuer: "yourdomain.com",audience: "yourdomain.com",claims: claims,expires: DateTime.UtcNow.AddDays(7),signingCredentials: new SigningCredentials(_signingKey, SecurityAlgorithms.HmacSha256));return new JwtSecurityTokenHandler().WriteToken(token);}
}

2. 验证 JWT

要验证 JWT,您需要验证其签名并确保声明有效。

using Microsoft.IdentityModel.Tokens;
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Text;public class JwtTokenValidator
{private const string SecretKey = "your-256-bit-secret";private readonly SymmetricSecurityKey _signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(SecretKey));public ClaimsPrincipal ValidateToken(string token){var tokenHandler = new JwtSecurityTokenHandler();var validationParameters = new TokenValidationParameters{ValidateIssuer = true,ValidateAudience = true,ValidateIssuerSigningKey = true,ValidIssuer = "yourdomain.com",ValidAudience = "yourdomain.com",IssuerSigningKey = _signingKey};try{var principal = tokenHandler.ValidateToken(token, validationParameters, out var securityToken);return principal;}catch (Exception){return null;}}
}

七. 使用 JWT 的最佳实践

  1. 保护密钥:确保密钥安全无虞。切勿在客户端代码中暴露密钥。

  2. 使用 HTTPS:始终使用 HTTPS 加密客户端和服务器之间传输的数据。

  3. 设置过期时间:为 JWT 定义合理的过期时间,以降低 token 被盗的风险。

  4. 实现令牌刷新:使用刷新令牌来延长用户会话而不影响安全性。

  5. 验证令牌声明:确保在服务器端正确验证令牌声明。

八. 结论

JSON Web Tokens 提供了一种强大而灵活的方式来处理现代 Web 应用程序中的身份验证和授权。它们的无状态特性、易用性和广泛的互操作性使其成为开发人员的绝佳选择。通过遵循最佳实践并安全地实施 JWT,您可以增强应用程序身份验证系统的安全性和效率。

对于任何想要构建安全且可扩展的 Web 应用程序的开发人员来说,理解和掌握 JWT 都是一项宝贵的技能。无论您是在开发小型项目还是大型系统,JWT 都可以帮助您实现强大而高效的身份验证和授权。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/48460.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AWS全服务历史年表:发布日期、GA和服务概述一览(二)

我一直在尝试从各种角度撰写关于Amazon Web Services(AWS)的信息和魅力。由于我喜欢技术历史,这次我总结了AWS服务发布的历史年表。 虽然AWS官方也通过“Whats New”发布了官方公告,但我一直希望能有一篇文章将公告日期、GA日期&…

javac详解 idea maven内部编译原理 自制编译器

起因 不知道大家在开发中,有没有过下面这些疑问。有的话,今天就一次解答清楚。 如何使用javac命令编译一个项目?java或者javac的一些参数到底有什么用?idea或者maven是如何编译java项目的?(你可能猜测底层…

【一刷《剑指Offer》】面试题 47:不用加减乘除做加法

力扣对应题目链接:LCR 190. 加密运算 - 力扣(LeetCode) 牛客对应题目链接:不用加减乘除做加法_牛客题霸_牛客网 (nowcoder.com) 一、《剑指Offer》对应内容 二、分析题目 sumdataA⊕dataB 非进位和:异或运…

Unity UGUI 之 Graphic Raycaster

本文仅作学习笔记与交流,不作任何商业用途 本文包括但不限于unity官方手册,唐老狮,麦扣教程知识,引用会标记,如有不足还请斧正 首先手册连接如下: Unity - Manual: Graphic Raycaster 笔记来源于&#xff…

mqtt协议有哪些机制

MQTT协议提供了一些关键机制来确保消息传递的可靠性、效率和灵活性。这些机制使得MQTT非常适用于物联网(IoT)和其他需要高效、低带宽通信的应用。以下是MQTT协议的主要机制: 1. 发布/订阅(Pub/Sub)模型 发布/订阅模型…

无人车技术浪潮真的挡不住了~

正文 无人驾驶汽车其实也不算是新鲜玩意了,早在十年前大家都开始纷纷投入研发,在那时就已经蠢蠢欲动,像目前大部分智驾系统和辅助驾驶系统都是无人驾驶系统的一个中间过度版本,就像手机进入智能机时代的中间版本。 然而前段时间突…

SpringBoot 介绍和使用(详细)

使用SpringBoot之前,我们需要了解Maven,并配置国内源(为什么要配置这些,下面会详细介绍),下面我们将创建一个SpringBoot项目"输出Hello World"介绍. 1.环境准备 ⾃检Idea版本: 社区版: 2021.1 -2022.1.4 专业版: ⽆要求 如果个⼈电脑安装的idea不在这个范围, 需要…

LeetCode 热题 HOT 100 (001/100)【宇宙最简单版】

【链表】 No. 0160 相交链表 【简单】👉力扣对应题目指路 希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&#x…

搜维尔科技:【产品推荐】Euleria Health Riablo 运动功能训练与评估系统

Euleria Health Riablo 运动功能训练与评估系统 Riablo提供一种创新的康复解决方案,将康复和训练变得可激励、可衡量和可控制。Riablo通过激活本体感觉,并通过视听反馈促进神经肌肉的训练。 得益于其技术先进和易用性,Riablo是骨科、运动医…

centos软件安装

安装方式 一、二进制安装 --解压即用,只针对特殊平台 --jdk tomcat 二、RPM:按照一定规范安装软件,无法安装依赖的文件 --mysql 三、yum:远程安装基于RPM,把依赖的文件安装上去,需要联网 四、源码安装 jdk安…

jmeter部署

一、windows环境下部署 1、安装jdk并配置jdk的环境变量 (1) 安装jdk jdk下载完成后双击安装包:无限点击"下一步"直到完成,默认路径即可。 (2) jdk安装完成后配置jdk的环境变量 找到环境变量中的系统变量:此电脑 --> 右键属性 …

C语言:温度转换

1.题目:实现摄氏度(Celsius)和华氏度(Fahrenheit)之间的转换。 输入一个华氏温度,输出摄氏温度,结果保留两位小数。 2.思路:(这是固定公式,其中 F 是华氏度&a…

【C语言】详解结构体(下)(位段)

文章目录 前言1. 位段的含义2. 位段的声明3. 位段的内存分配(重点)3.1 存储方向的问题3.2 剩余空间利用的问题 4. 位段的跨平台问题5. 位段的应用6. 总结 前言 相信大部分的读者在学校或者在自学时结构体的知识时,可能很少会听到甚至就根本没…

STM32实战篇:按键(外部输入信号)触发中断

功能要求 将两个按键分别与引脚PA0、PA1相连接,通过按键按下,能够触发中断响应程序(不需明确功能)。 代码流程如下: 实现代码 #include "stm32f10x.h" // Device headerint main() {//开…

一种Android系统双屏异显的两路音频实现方法

技术领域 [0001] 本发明涉及一种Android系统双屏异显的两路音频实现方法。 背景技术 [0002] 关于Android系统的双屏异显两路音频的实现目前还没有通用的方法,Android系 统的双屏异显两路音频的需求是:主屏的声音从主屏对应的声卡输出、副屏的声音从…

Nougat - 学术文档PDF解析(LaTeX数学、表格)

文章目录 一、关于 Nougat二、安装三、获取PDF的预测1、CLI2、API 四、数据集生成数据集 五、训练六、评估七、其它1、常见问题解答2、引文3、致谢4、许可证 一、关于 Nougat Nougat (Neural Optical Understanding for Academic Documents) Nougat是理解LaTeX数学和表格的 学…

Dockerfile相关命令

Dockerfile Dockerfile 是一个用来构建Docker镜像的文本文件,包含了一系列构建镜像所需的指令和参数。 指令详解 Dockerfile 指令说明FROM指定基础镜像,用于后续的指令构建,必须为第一个命令MAINTAINER指定Dockerfile的作者/维护者。&…

CentOS软件安装与vim使用操作

目录 CentOS软件安装 软件生态的概念 CentOS软件安装 CentOS软件卸载 CentOS查看软件包 rz和sz命令 vim多模式文本编辑器 vim 的使用 命令模式 输入模式 底线命令模式 vim 按键说明 第一部分:一般模式可用的光标移动、复制粘贴、搜索替换等 光标移动 …

JUC并发编程01-基础概念

概念 进程 进程可以视为程序的一个实例,进程就是用来加载指令、管理内存、管理I0 线程 一个进程内可以有多个线程,一个线程就是一个指令流。 在Java中,线程作为最小调度单位,进程作为资源分配的最小单位,可以说进程…

Mysql数据库第二次作业

(1)显示所有职工的基本信息。 mysql> select * from t_worker; (2)查询所有职工所属部门的部门号,不显示重复的部门号。 mysql> select distinct department_id from t_worker; (3)求出所有职工的人数。 mysql> select count(1) from t_worker; (4)列…