JWT身份认证原理介绍
JSON Web Token (JWT) 是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为 JSON 对象安全地传输信息。这些信息可以被验证和信任,因为它是数字签名的。
JWT主要是用来替代取代传统的身份认证机制。
传统的身份认证特点
状态性(Stateful):服务器需要在其内存或数据库中存储每个用户的会话信息(Session)。
扩展性差:在分布式或微服务架构中,用户请求可能被负载均衡到不同的服务器上。这就要求所有服务器必须能访问一个共享的会话存储中心(如 Redis 集群),增加了复杂性。
跨域问题:让 Cookie 在多个不同的域下正常工作需要额外配置。
JWT的身份认证特点
无状态性(Stateless):服务器不存储任何用户会话信息。用户的登录状态和信息直接编码在 JWT 令牌本身中。
自包含(Self-contained):令牌本身包含了所有需要的用户信息(如用户ID、角色等),服务器只需验证令牌的有效性即可信任其中的内容。
易于跨域和传输:JWT 可以放在 HTTP 请求头(Authorization Header)、POST 参数或甚至 URL 中。由于它只是一个字符串,可以轻松地在不同域和服务之间传递。
JWT的结构解析
JWT可以看成是一串多个JSON信息串拼接成的Token。
JWT的结构:
一个 JWT 看起来就是一串很长的、由点(.)分隔的字符串,例如:
xxxxx.yyyyy.zzzzz

它实际上由三部分组成,对应着三个点作分隔符:
Header(头部)
作用:描述令牌的基本信息,如类型(即 JWT)和所使用的签名算法(如 HMAC SHA256 或 RSA)。
内容:一个 JSON 对象,例如 {"alg": "HS256", "typ": "JWT"}
存储方式:这个 JSON 对象会经过 Base64Url 编码,形成 JWT 的第一部分(xxxxx)。
Payload(负载)
作用:携带你想要传递的“声明”(Claims)。声明就是关于实体(通常是用户)和其他数据的语句。
内容:一个 JSON 对象,包含三种类型的声明:
注册声明(Registered claims):预定义的一些标准字段,非强制但推荐使用。例如:
- iss (issuer):签发者
- exp (expiration time):过期时间
- sub (subject):主题
- aud (audience):接收方
- iat (issued at time):JWT 签发时间
- exp (expiration time):JWT 的过期时间
- ......
存储方式:这个 JSON 对象也会经过 Base64Url 编码,形成 JWT 的第二部分(yyyyy)。
️ 重要提示:Header 和 Payload 只是经过编码(Base64Url),并没有加密! 任何人都可以解码它们并看到原始内容。因此,绝对不能在 Payload 中放置密码等敏感信息。这里也是一个安全检测项。
Signature(签名)
作用:这是 JWT 最核心的部分,用于防止令牌被篡改,确保我们信任其内容。
生成方式:将编码后的 Header、编码后的 Payload、以及一个密钥(Secret) 通过 Header 中指定的签名算法(如 HS256)进行签名。
伪代码:Signature = HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
验证方式:服务器收到 JWT 后,会用同样的密钥和算法对前两部分重新生成一个签名。如果新生成的签名与 JWT 中附带的第三部分签名完全一致,则证明令牌未被篡改(因为攻击者没有密钥,无法生成有效签名)。同时,也证明了发送者拥有密钥(通常是签发令牌的服务器)。
最终,将这三个 Base64Url 字符串用点连接起来,就构成了一个完整的 JWT。
xxxxx.yyyyy.zzzzz
JWT 的工作流程
这个流程展示了 JWT 如何实现无状态的身份验证,客户端只需在每次请求中携带 token,服务器通过验证签名和声明来判断请求的合法性,无需有一台中央服务器来维护用户会话状态。
用户登录:用户向认证服务器发送用户名和密码。
验证凭据:认证服务器验证用户名和密码是否正确。
创建 JWT:验证成功后,服务器生成 JWT。其中:
- Header 指定算法。
- Payload 包含用户ID、角色、过期时间等信息。
- Signature 使用一个只有服务器知道的密钥(Secret),根据 Header 和 Payload 生成。
返回 JWT:服务器将生成的 JWT 返回给客户端(通常是放在 HTTP 响应的 Authorization 头或 Body 中)。
客户端存储:客户端(通常是浏览器)收到后,将其存储起来(常用 localStorage 或 sessionStorage)。
携带 JWT 发起请求:此后,客户端向受保护的 API 发起的任何请求,都必须在 HTTP 请求头中带上 JWT(通常使用 Authorization: Bearer <token> 格式)。
服务器验证 JWT:API 服务器收到请求:
- 检查签名:使用相同的密钥对 JWT 的前两部分重新计算签名,并与第三部分对比,验证令牌是否有效且未被篡改。
- 检查有效期:检查 Payload 中的 exp 字段,确保令牌没有过期。
- 检查签发者(可选):检查 iss 字段是否可信。
返回响应:验证通过后,服务器认为请求来自一个已认证的用户,并根据 Payload 中的信息(如用户角色)处理请求并返回结果。
安全注意事项
密钥保护: 服务器密钥必须保密,且足够复杂;
HTTPS: 所有通信应通过 HTTPS 进行,防止 token 被窃取;
合理过期时间: 设置适当的过期时间,平衡安全性和用户体验;
敏感信息: 不要在 payload 中存放敏感信息(如密码);
注销处理: JWT 无法在有效期内主动失效,需结合黑名单或短期有效期策略;
JWT身份认证原理介绍的更多相关文章
- ASP.NET Core系列:JWT身份认证
1. JWT概述 JSON Web Token(JWT)是目前流行的跨域身份验证解决方案. JWT的官网地址:https://jwt.io JWT的实现方式是将用户信息存储在客户端,服务端不进行保存. ...
- JWT 身份认证优缺点分析以及常见问题解决方案
本文转载自:JWT 身份认证优缺点分析以及常见问题解决方案 Token 认证的优势 相比于 Session 认证的方式来说,使用 token 进行身份认证主要有下面三个优势: 1.无状态 token ...
- 【译】使用Jwt身份认证保护 Asp.Net Core Web Api
原文出自Rui Figueiredo的博客,原文链接<Secure a Web Api in ASP.NET Core> 摘要:这边文章阐述了如何使用 Json Web Token (Jw ...
- SSL身份认证原理 - 目标: 搞清楚数字证书和数字签名的关系
1 概述 1.1 产生背景 基于万维网的电子商务和网上银行等新兴应用,极大地方便了人们的日常生活,受到人们的青睐.由于这些应用都需要在网络上进行在线交易,它们对网络通信的安全性提出了更高的要求.传 ...
- .net core 2.0 jwt身份认证系统
经历了很久,.net core 2.0 终于发布了! 之前一直用的core 1.1,升级了2.0后发现认证的机制(Auth)发生了比较大的变化,在1.1中认证配置是在Configure中完成,而在2. ...
- 开源DDD设计模式框架YMNNetCoreFrameWork第三篇-增加ASp.net core Identity身份认证,JWT身份认证
1.框架增加Identity注册功能 2.框架增加identity登录以后获取JWTtoken 3.请求接口通过token请求,增加验证特性 源代码地址:https://github.com/topg ...
- jwt身份认证
项目地址:https://github.com/cuongle/WebApi.Jwt
- .NetCore采取JWT方式进行身份认证
验证与授权 Authentication(身份认证) 认证是系统对请求的用户进行身份识别的过程. Authorization (授权) 授权是对认证通过后的用户进行权限分配的过程.授权简单理解就是:识 ...
- 构建具有用户身份认证的 React + Flux 应用程序
原文:Build a React + Flux App with User Authentication 译者:nzbin 译者的话:这是一篇内容详实的 React + Flux 教程,文章主要介绍了 ...
- asp.net form身份认证不定时认证失败的问题 排查
1.网站出现form认证不定时认证失败.登陆过后 每隔一会儿就需要重新登陆.首先检查的是form身份认证票据设置的时间(正常) 然后检查加密后的身份认证信息写入的cookie的失效时间(正常) 2.这 ...
随机推荐
- HTTP请求使用http、socks代理demo,包含有认证和无认证
package cn.daenx.myadmin.email.utils; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpU ...
- Fiddler抓包工具安装HTTPS证书
安装好之后,打开Fiddler根目录,打开CMD 执行以下内容 makecert.exe -r -ss my -n "CN=DO_NOT_TRUST_FiddlerRoot, O=DO_NO ...
- [CRCI2008-2009] CVJETICI
[CRCI2008-2009] CVJETICI 观察图片及样例一: 注:下文中的被占领,指的是在这一个区间内,才有交叉开花的可能. 第一张小图发现 $2 \sim 3$ 被占领. 第二张小图发现 $ ...
- 数据分析必备:GPS轨迹、软件签到、手机信令数据获取方式合集
本文对目前主要的出租车.公交车.行人GPS轨迹.社交软件签到.手机信令等数据产品的获取网站加以整理与介绍. 目录 6 GPS轨迹与签到数据 6.1 个人GPS轨迹数据 6.1.1 GeoLife ...
- js格式化货币方法
闲来无事自己基于原生js方法封装了一个可用于常见货币格式化的方法,具体方法封装如下: /** * 格式化人民币金额 * @param number num 数字金额 * @param string s ...
- LLaMA (以LLaMA2为例,文末附加对比1 2 3 三个版本的变化)
补充背景: 关于Transformer和Llama架构的演进 一.背景 LLaMA 2 和 LLaMA2-Chat 参数规模:70亿.130亿和700亿 数据和训练规模: 上下文长度 训练资源 性能表 ...
- PVE折腾笔记 (2) 挂载之前在QNAP里使用的硬盘
前言 在上一篇文章中,我们已经完成了 PVE 系统的安装 接下来做的就是在 PVE 里读取之前 QNAP 使用的硬盘里的数据 去除 RAID 标记(可选) 我没有启用 QNAP 的 RAID 功能,是 ...
- 浅谈ElasticSearch索引
概述 官方文档:https://www.elastic.co/docs/manage-data/data-store/index-basics 索引是Elasticsearch中的基本存储单元,类似于 ...
- 利用DNSLOG测试Fastjson远程命令执行漏洞
由于内容比较简单,我直接贴图,怕我自己忘了. 测试Fastjson版本号:1.2.15 直接发送用burpsuite发送payload,将dataSourceName改成dnslog获取到的域名. p ...
- springBoot使用阿里云的证书
证书申请 这一步骤简单,不多赘述 证书下载 springBoot项目用到的证书是tomcat类型的,即如下 springBoot中配置证书 在application.yml配置文件增加ssl证书配置项 ...