一起重新全面认识JWT-Json Web Token

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 一起重新全面认识JWT-Json Web Token

概述

最近学习了一下JWT,全名为Json Web Token,是一种自包含令牌。

在这里,我整理了一下网上资源。在文章最后,有一个使用Java实现JWT生成和验证的完整案例。

简单的说,就是基于JSON,在web环境下传输一个规定格式的字符串令牌。

广义上讲JWT,这是一个Web安全传输信息方式。狭义上来说,直接指传递的令牌字符串。

JWT官网地址:https://jwt.io/ ,在这里,你可以体验一下形成的JWT字符串。

image.png

应用场景

首先,我们需要知道,JWT无法用于数据加密。一般是用来身份提供者和服务者之间传递被认证的用户身份信息,以便于从资源服务器获取到资源。


也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。


所以,可以推断出,在以下场景中使用JWT是比较合适的。


  • 授权:这是最常见的使用场景,解决单点登录问题。因为JWT使用起来轻便,开销小,服务端不用记录用户状态信息(无状态),所以使用比较广泛;
  • 信息交换:JWT是在各个服务之间安全传输信息的好方法。因为JWT可以签名,例如,使用公钥/私钥对儿 - 可以确定请求方是合法的。此外,由于使用标头和有效负载计算签名,还可以验证内容是否未被篡改。

JWT认证过程

JWT官网有一张图描述了JWT的认证流程

image.png

流程说明:


1,浏览器发起请求登陆,携带用户名和密码;

2,服务端验证身份,根据算法,将用户标识符打包生成 token,

3,服务器返回JWT信息给浏览器,JWT不包含敏感信息;

4,浏览器发起请求获取用户资料,把刚刚拿到的 token一起发送给服务器;

5,服务器发现数据中有 token,验明正身;

6,服务器返回该用户的用户资料;

JWT的数据结构

JWT字符串的格式:

header.payload.signature

JWT通常由三部分组成,按照顺序: 头信息(header), 有效载荷(payload)和签名(signature)。

header

header是一串描述JWT元数据的JSON字符串,例如:

{"alg":"HS256","typ":"JWT"}


HS256 表示使用了 HMAC-SHA256 来生成签名。

最后使用Base64URL算法将上述JSON对象转换为字符串保存。

其他还有一些签名算法,可以去官网查看。

payload

Payload 部分也是一个 JSON 对象,用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选用。

 iss (issuer):签发人
 exp (expiration time):过期时间(jwt的过期时间,这个过期时间必须要大于签发时间)
 sub (subject):主题
 aud (audience):受众
 nbf (Not Before):生效时间(定义在什么时间之前,该jwt都是不可用的.)
 iat (Issued At):签发时间
 jti (JWT ID):编号(jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。)

当然,除了前面的字符串,这里也就是我们传输数据的地方。可以自定义字段传输。例如:

{
 "微信公众号": "程序编程之旅",
 "姓名": "谙忆"
 }


当然,我这里就是推广下公众号,前面的key用了中文名,你别这么玩就行。

注意哦,这部分的数据默认是不加密的。所以,如果有敏感信息,注意再使用加密算法把数据加密后传输即可。

这个JSON对象传输时,也要使用Base64URL算法转成字符串。

signature

签名哈希部分是对上面两部分数据签名,通过指定的算法生成哈希,以确保数据不会被篡改。


首先,需要指定一个密码(secret)。该密码保存在服务器中,并且不能向用户公开。然后,使用标头中指定的签名算法(默认情况下为HMAC SHA256)根据以下公式生成签名。


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

token看起来像这样:


eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI

JWT的用法

客户端接收服务器返回的JWT,将其存储在Cookie或localStorage中。


此后,客户端将在与服务器交互中都会带JWT。如果将它存储在Cookie中,就可以自动发送,但是不会跨域,因此一般是将它放入HTTP请求的Header Authorization字段中。


当跨域时,也可以将JWT放置于POST请求的数据主体中。


JWT的优缺点

1、JWT默认不加密,所以可能导致数据泄露,但可以加密。生成原始令牌后,可以使用该令牌再次对其进行加密。


2、当JWT未加密时,一些私密数据无法通过JWT传输。


3、JWT不仅可用于认证,还可用于信息交换。善用JWT有助于减少服务器请求数据库的次数。


4、JWT的最大缺点是服务器不保存会话状态,所以在使用期间不可能取消令牌或更改令牌的权限。也就是说,一旦JWT签发,在有效期内将会一直有效。


5、JWT本身包含认证信息,因此一旦信息泄露,任何人都可以获得令牌的所有权限。为了减少盗用,JWT的有效期不宜设置太长。对于某些重要操作,用户在使用时应该每次都进行身份验证。


6、为了减少盗用和窃取,JWT不建议使用HTTP协议来传输代码,而是使用加密的HTTPS协议进行传输,防止服务器返回给用户的JWT被拦截。


看着上面6点,我的建议是,无论有没有敏感数据,对于用户认证信息数据做一层加密。最大程度上避免数据泄露造成问题。


最后,强调一点:JWT不是用来加密的,只是用来验证用户的真实性以及请求来源的真实性。


最后


希望大家能动动手指,关注公众号:程序编程之旅


目录
相关文章
|
2月前
|
存储 JSON 安全
如何使用 JSON Web Tokens 进行身份验证?
总的来说,JWT 是一种强大而灵活的身份验证方式,通过正确使用和管理,可以为应用提供可靠的身份验证机制,同时提高系统的可扩展性和安全性。在实际应用中,需要根据具体的需求和场景,合理设计和实施 JWT 身份验证方案。
120 63
|
2月前
|
JSON 安全 Go
Go语言中使用JWT鉴权、Token刷新完整示例,拿去直接用!
本文介绍了如何在 Go 语言中使用 Gin 框架实现 JWT 用户认证和安全保护。JWT(JSON Web Token)是一种轻量、高效的认证与授权解决方案,特别适合微服务架构。文章详细讲解了 JWT 的基本概念、结构以及如何在 Gin 中生成、解析和刷新 JWT。通过示例代码,展示了如何在实际项目中应用 JWT,确保用户身份验证和数据安全。完整代码可在 GitHub 仓库中查看。
266 1
|
4月前
|
存储 中间件 API
ThinkPHP 集成 jwt 技术 token 验证
本文介绍了在ThinkPHP框架中集成JWT技术进行token验证的流程,包括安装JWT扩展、创建Token服务类、编写中间件进行Token校验、配置路由中间件以及测试Token验证的步骤和代码示例。
ThinkPHP 集成 jwt 技术 token 验证
|
4月前
|
JSON 安全 数据安全/隐私保护
从0到1搭建权限管理系统系列三 .net8 JWT创建Token并使用
【9月更文挑战第22天】在.NET 8中,从零开始搭建权限管理系统并使用JWT(JSON Web Tokens)创建Token是关键步骤。JWT是一种开放标准(RFC 7519),用于安全传输信息,由头部、载荷和签名三部分组成。首先需安装`Microsoft.AspNetCore.Authentication.JwtBearer`包,并在`Program.cs`中配置JWT服务。接着,创建一个静态方法`GenerateToken`生成包含用户名和角色的Token。最后,在控制器中使用`[Authorize]`属性验证和解析Token,从而实现身份验证和授权功能。
284 3
|
3月前
|
存储 JSON 前端开发
JSON与现代Web开发:数据交互的最佳选择
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也便于机器解析和生成。它以文本格式存储数据,常用于Web应用中的数据传输,尤其是在客户端和服务器之间。
102 0
|
5月前
|
JSON Java API
解码Spring Boot与JSON的完美融合:提升你的Web开发效率,实战技巧大公开!
【8月更文挑战第29天】Spring Boot作为Java开发的轻量级框架,通过`jackson`库提供了强大的JSON处理功能,简化了Web服务和数据交互的实现。本文通过代码示例介绍如何在Spring Boot中进行JSON序列化和反序列化操作,并展示了处理复杂JSON数据及创建RESTful API的方法,帮助开发者提高效率和应用性能。
214 0
|
5月前
|
API
【Azure Developer】记录一段验证AAD JWT Token时需要设置代理获取openid-configuration内容
【Azure Developer】记录一段验证AAD JWT Token时需要设置代理获取openid-configuration内容
|
5月前
|
JSON Java API
【Azure Developer】如何验证 Azure AD的JWT Token (JSON Web 令牌)?
【Azure Developer】如何验证 Azure AD的JWT Token (JSON Web 令牌)?
116 0
|
5月前
|
JSON 算法 API
【Azure API 管理】APIM 配置Validate-JWT策略,验证RS256非对称(公钥/私钥)加密的Token
【Azure API 管理】APIM 配置Validate-JWT策略,验证RS256非对称(公钥/私钥)加密的Token
|
5月前
|
前端开发 JavaScript
【Azure 环境】前端Web通过Azure AD获取Token时发生跨域问题(CORS Error)
【Azure 环境】前端Web通过Azure AD获取Token时发生跨域问题(CORS Error)