JWT - 基础知识解读

什么是JWT?

JWT即JSON Web Token,下面是官方文档对JWT的定义:

JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object.

JWT是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地将信息作为JSON对象传输。

This information can be verified and trusted because it is digitally signed.

由于此信息是经过数字签名的,因此可以被验证和信任。

JWTs can be signed using a secret (with the HMAC algorithm) or a public/private key pair using RSA or ECDSA.

可以使用密钥(通过HMAC算法)或RSAECDSA的公钥/私钥对,对JWT进行签名。

什么情况下使用JWT?

官方给出了两种场景:

Authorization: This is the most common scenario for using JWT. Once the user is logged in, each subsequent request will include the JWT, allowing the user to access routes, services, and resources that are permitted with that token. Single Sign On is a feature that widely uses JWT nowadays, because of its small overhead and its ability to be easily used across different domains.

授权: 这是使用JWT的最常见方案。用户登录后,每个后续请求都将包含JWT,从而允许用户访问该令牌允许的路由、服务和资源。单一登录是当今广泛使用JWT的一项功能,因为它的开销很小并且可以在不同的域中轻松使用。

Information Exchange: JSON Web Tokens are a good way of securely transmitting information between parties. Because JWTs can be signed—for example, using public/private key pairs—you can be sure the senders are who they say they are. Additionally, as the signature is calculated using the header and the payload, you can also verify that the content hasn’t been tampered with.

信息交换: JWT是在各方之间安全地传输信息的一种好方法。因为JWT可以被签名(例如,使用公钥/私钥对),所以您可以确保发送人是他们所说的人。此外,由于签名是使用header和payload计算的,因此您还可以验证内容是否未被篡改。

JWT的结构解析

JWT由三部分组成,这些部分由点(.)分隔,分别是:

  • header
  • payload
  • signature

因此,JWT通常如下所示:

xxxxx.yyyyy.zzzzz

解析每个部分的构成:

header(头部)
	通常由两部分组成:
    	- token的类型(即JWT- 所使用的签名算法,例如HMACSHA256RSA
    
		例如:
		{
		  "alg": "HS256",
		  "typ": "JWT"
		}	
		
		然后,经过base64编码转换,成为JWT的第一部分。
		
		// 转码后
		eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

payload(载荷)
	存放声明(contains the claims)的地方,声明即是有关实体(用户)和其他数据的信息。
	它有三种类型:
		已注册的声明 (Registered Claims)
		公开声明 (Public Claims)
		私有声明 (Private Claims)
	
	Registered Claims:
		这些是一组预定义的、有用的、可互操作的声明。
		比如:
			iss (发行者)
			exp (到期时间)
			sub (主题)
			aud (受众群体)
			...
		它们不是强制性的,而是推荐使用的。
		请注意,声明名称只能是三个字符,因为JWT的含义是紧凑的。
	
	Public Claims:
		使用JWT的人员可以随意定义这些声明。
		但是为避免冲突,它们应该在IANA JSON Web Token Registry中定义,
		或者定义为包含抗冲突名称空间(namespace)的URI。
		
	Private Claims:
		提供者和消费者所共同定义的声明。

	定义一个payload:
	{
	  "sub": "1234567890",
	  "name": "John Doe",
	  "iat": 1516239022
	}
	
	然后,经过base64编码转换,成为JWT的第二部分。
	
	// 转码后
	eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

	请注意,对于已签名的令牌,此信息尽管可以防止篡改,但任何人都可以读取。
	除非将其加密,否则请勿将机密信息放入JWT的payload或header中。

signature(签名)
	JWS的第三部分是一个签证信息,这个签证信息由三部分组成:
		- header (base64转码后)
		- payload (base64转码后)
		- secret (密钥,保存在服务端,用于加解密)

	例如,如果要使用HMAC SHA256算法,则将通过以下方式创建签名:
	secret = chuanbin.zhang
	signature = HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
	
	// 加密后的signature
	EK46mXLLXTFKZ2BYgkv2J8kDIud4PNAaMwp6IA0JWak
	
	签名用于验证消息在此过程中没有更改,
	并且对于使用私钥进行签名的token,它还可以验证JWT的发送者身份。

最终的JWT即是(请忽略为了美观而画蛇添足的换行符):
	eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
	eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
	EK46mXLLXTFKZ2BYgkv2J8kDIud4PNAaMwp6IA0JWak

下面是官网上使用Debugger生成JWT的截图:
JWT官方Debugger工具

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值