.NET修仙传
修炼秘籍
.net 修炼路线图
书籍大全
C#入门后该如何进阶?如何提升自己?
读写 Excel 四种方案
书籍大全
dotnet命令大全
C# 程序集加载方法
linux 下部署.net环境
.NET WebAPI中FromRoute、FromQuery、FromBody的关键角色与用法
C# 新用法
盘点C#最有价值的10个语法糖
C#基础语法与数据类型
序列化
C# 7.0
模式匹配Pattern Matching
优秀实用的类库推荐
2024年C#优秀实用的类库推荐
依赖注入与中间件
依赖注入
查询所有已注入的服务
WebApi实现批量注入
原生依赖注入
自动依赖注入框架
优秀中间件
依赖注入
Autofac
生命周期
文档操作
PDF操作
PDF合并及生成书签目录
Excel操作
几个Excel文件合并去重分类
Excel文件之COM组件方式
操作Excel文件之NPOI
INI文件
面试宝典
WebService、WCF、WebAPI、一般处理程序
C# 线程和进程的区别
asp.net core 服务生命周期
asp.net core 的中间件都有哪些
操作系统编程
获取搜狗输入法中英文
com组件集成
执行系统命令
通过句柄嵌入exe窗体程序
windows-开机自启动
程序调用cmd命令生成WCF服务的客户端调用文件
获取电脑信息
键盘记录器
键盘改键功能
监听鼠标操作
框架揭秘
01编程初体验
中间件 Middleware
路由
配置管理
配置系统
配置管理
日志管理
Log4Net
NLog
.net core原始日志记录
日志管理
Serilog
LINQ
LINQ概讲
LINQ编程
常用方法
ORM
EF Core初始化
EF Core的实体类配置
执行原生SQL语句
EF Core
操作sqlite
操作Mysql数据库
操作LiteDB
AutoMapper高效实现对象映射
AutoMapper
AutoMapper 10个常用方法总结
缓存
Redis支持哪几种数据类型?
什么是Redis?简述它的优缺点?
Redis相比memcached有哪些优势?
认证
什么是 JWT?它是如何工作的?
.net framework jwt
.net core Jwt操作
认证管理
.Net WebApi校验Token/参数的几种方式
鉴权授权
Authorization的几种方式
基础语法
集合
1、C#中常用集合类型
yield return 简化迭代并提高代码质量
AOP
.net core AOP
操作筛选器
网络编程
TCP 连接的前世今生
HttpRequest,WebRequest,HttpWebRequest,WebClient,HttpClient 之间的区别
网络编程
WebApi获取客户信息
通信
HTTP通信
公共类-HttpHelper
多线程编程
十种线程方式分析
Task-筑基期
parallel-筑基
消息队列
Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点?
构建高性能 API 的高级技术
优秀教程网站
每日学习地址
全套教程汇总
理解ASP.NET Core
定时任务
定时器的三种使用方式
定时任务之windows任务计划程序
创建任务到Windows任务计划程序
定时任务之Quartz.Net
IHostedService启动时运行定时任务
JSON序列化反序列化工具
前辈
发布部署
应用部署
GRPC
使用GRPC多个proto文件
本文档使用 MrDoc 发布
-
+
首页
什么是 JWT?它是如何工作的?
在 Web 开发中,JWT 已成为一种流行且安全的方法,用于身份验证和信息交换,在这篇文中,我们将深入探讨JWT 是什么、它是如何工作的、使用 JWT 需要注意什么。 # 什么是JWT? JWT,全称 JSON Web Token,它是一种基于 JSON的开放标准(RFC 7519),用于在各方之间作为 JSON 对象安全地传输信息。由于其数字签名的特性,JWT通常用于身份验证和信息交换。 JWT由三部分组成: - Header(头部) - Payload(负载) - Signature(签名) 这三部分通过点(.)分隔,比如下面为一个JWT值: >eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ. SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c ## Header Header 标头通常由两部分组成:JWT类型和正在使用的签名算法,例如 HMAC SHA256 或 RSA。比如: ```js { "alg": "HS256", "typ": "JWT" } ``` Payload Payload 包含声明,这些声明是关于用户或其他数据的陈述。声明可以分为三种类型:注册声明、公共声明和私人声明。比如: ```javascript { "sub": "1234567890", "name": "John Doe", "iat": 1516239022 } ``` ## Signature Signature 用于验证消息在传输过程中未被篡改,签名是通过对 Header 和 Payload 进行编码后,再加上一个密钥并使用指定的算法生成的。比如: ```javascript HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), your-256-bit-secret ) ```   # JWT 工作流 关于 JWT的工作流,可以使用下面的示例进行说明: 1. 当用户登录或尝试访问受保护的资源时,服务器会在身份验证成功后生成 JWT(JWT需要设置失效时间) 并返回给客户端; 2. 客户端存储此令牌,通常存储在本地存储或 cookie 中; 3. 对于后面每个需要身份验证的后续请求,客户端都会在请求 header中发送 JWT; 4. 服务器通过检查 JWT验证合法性,以确保用户的真实性和授权性; 5. 如果 JWT有效,服务器执行后续业务操作,如果 JWT无效,服务器可以抛 401无效权限错误; 6. 客户端可以定时向服务器发送更新 JWT的请求。 整个流程可以表示为下面的流程图:  # JWT的优势 - **无状态**:由于 JWT 本身包含所有必要的信息,因此服务器不需要维护会话信息。这使得 JWT 是无状态的,从而减少了服务器负载并简化了可伸缩性。 - **紧凑高效**:由于其紧凑的尺寸,JWT 适合通过网络传输,并且易于被客户端解析。 - **安全性**:JWT 经过数字签名,可确保数据完整性并防止篡改。使用加密算法可以进一步增强安全性。 - **跨域通信**:JWT 可以跨不同的域或微服务使用,因为它们不依赖于 cookie 或服务器端会话。 # JWT 的使用场景 - **安全存储**:将 JWT 存储在仅限 HTTP 的 Cookie 中,以防止来自 JavaScript 的访问,从而降低 XSS 攻击的风险。 - **令牌过期**:在 JWT 上设置合理的过期时间,以限制可能滥用的时间窗口。 - **令牌吊销**:具有撤销或将受损令牌列入黑名单的机制,以增强安全性。 - **使用HTTPS**:确保客户端和服务器之间的所有通信都使用 HTTPS,以防止窃听和中间人攻击。 - **不存储敏感数据**:避免在 JWT 有效负载中存储敏感数据,因为一旦 base64 解码,有效负载就很容易读取。 # JWT的注意事项 **安全性** - 不要在JWT中存储敏感信息,尽管它们是经过签名的,但它们是可解码的。 - 使用强大的加密算法和足够长的密钥。 **过期时间** - 使用exp声明设置JWT的过期时间,确保令牌不会无限期地有效。 **验证** - 接收方必须验证JWT的签名和声明(如过期时间、受众等),确保其合法性和有效性。 **跨域问题** - 如果在跨域环境中使用JWT,确保正确处理CORS(跨域资源共享)配置。 # 安全争议 有人说 JWT是不安全,因为 JWT 一旦生成,服务端没办法失效它,除非等到它自身过期,所以如果 JWT被别人拿到,一直可以使用到 JWT失效 。 首先,JWT 可以进行签名(HMAC、RSA、ECDSA 等),以确保数据的完整性和认证。它还可以进行加密(JWE),以确保数据的机密性,所以 JWT 是安全的。 至于说 JWT被别人拿到了,那属于信息泄漏的问题,即便再安全签名,如果信息被泄漏了也存在安全风险,说所以通过这点来说 JWT 不安全是不成立的。 如果真的有必要,可以实现一个黑名单机制,以便在需要时撤销特定的 JWT。 # 总结 JWT 是一种强大而灵活的工具,用于各方之间的安全身份验证和数据交换。它们的简单性、安全性和无状态性使它们成为现代 Web 应用程序的理想选择。通过了解结构和最佳实践,开发人员可以有效地实施 JWT,以构建安全可靠的身份验证系统。但是,与任何安全机制一样,JWT 应与其他安全实践结合使用,以确保应用程序的可靠性和弹性。 https://mp.weixin.qq.com/s/Ff4cDQzyWrobHfvZHjns8w
孙端己
2024年7月29日 15:08
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码