JWT基础

参考:JWT——概念、认证流程、结构、使用JWT_Guizy-CSDN博客

一、什么是JWT

JWT简称JSON Web Token,也就是通过JSON形式作为Web应用中的令牌,用于在各方之间安全地将信息作为JSON对象传输。在数据传输过程中还可以完成数据加密签名等相关处理。

二、JWT能做什么?

1、授权
这是使用JWT的最常见方案。一旦用户登录,每个后续请求将包括JWT,从而允许用户访问该令牌允许的路由,服务和资源。单点登录是当今广泛使用JWT的一项功能,因为它的开销很小并且可以在不同的域中轻松使用。
2、信息交换
JSON Web Token是在各方之间安全地传输信息的好方法。因为可以对JWT进行签名(例如,使用公钥/私钥对),所以您可以确保发件人是他们所说的人。此外,由于签名是使用标头和有效负载计算的,因此您还可以验证内容是否遭到篡改。


三、JWT工作流程

四、JWT结构

JWT令牌 = Header.Payload.Signature

JWT令牌组成 :

  • 1.Header
  • 2.Payload
  • 3.Signature

因此,JWT通常如下所示:xxxxx.yyyyy.zzzzz

1、Header

  • 标头通常由两部分组成:令牌的类型(即JWT)和所使用的签名算法,例如HMAC SHA256或RSA。它会使用 Base64编码组成 JWT 结构的第一部分`。

  • 注意:Base64是一种编码,也就是说,它是可以被翻译回原来的样子来的。它并不是一种加密过程。

如下面是一串token,我们解析一下:

eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJsUnpNWXVwemNZUm9iTnMyZnpqdEtMX3BNZGhSS0JIdnJfTDRHMWpuR3hnIn0
.eyJqdGkiOiJjNTdjOTkwYS01ZDY1LTRhNmItODUyMS1lZjc5NDViNmQ3OTkiLCJleHAiOjE2MzQxNDU5NjcsIm5iZiI6MCwiaWF0IjoxNjM0MTEwMTcwLCJpc3MiOiJodHRwOi8vaWFtYXV0aC5pYW10ZXN0LnByZC51aW1wY2xvdWQuY29tL2F1dGgvcmVhbG1zL2J1c2luZXNzIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6ImIyNTkwYzQ0LWM1MWItNDRkOS04NTQ3LTcwZDI2NTEwYzIxOSIsInR5cCI6IkJlYXJlciIsImF6cCI6InVpbXBjbG91ZC1mcm9udGVuZCIsIm5vbmNlIjoiNjVhODNkNzYtZTNiMy00NzhmLWFhMDktOTFmMTU5MzlkODNlIiwiYXV0aF90aW1lIjoxNjM0MTA5OTY3LCJzZXNzaW9uX3N0YXRlIjoiM2U1ZjRkNTUtMmY3Ni00NmMzLWJkNDEtNDhlNzljOWMwZGU2IiwiYWNyIjoiMCIsImFsbG93ZWQtb3JpZ2lucyI6WyIqIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgcHJvZmlsZSBlbWFpbCIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwibmFtZSI6IueuoeeQhuWRmCDnrqEiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJhZG1pbiIsImdpdmVuX25hbWUiOiLnrqHnkIblkZgiLCJsb2NhbGUiOiJ6aC1DTiIsImZhbWlseV9uYW1lIjoi566hIn0
.aIKWuiP9_ENFi_cQBKsMxhuQkU6kkE49xLwYQuFucsctiUaDOnVh45NJ9mFKUlqMIuEzGwihTQoyI2Te8VnmWsCvTzODZHufUQDSYDvnwCXm1R9XBLL4b8x63z_c9_G6In6xspyhzVse5N8BTlzm4Vro0t_5pUltbW5O0_rBKeZ_7aC6nPLR6CQpibR1FFQfoSJO_qavwNudZKKycX4PrIWDRobfeJAWUY-AA3YtNjqlm8s46bcVairHQc98CInvEgSohe7Hz-pkBqXmDKsrQmv-VwQ7G5-LE-IpIr3UAugdUoKeL3J0Z0O2pf4856QsIwYe2dInh22HyNJSBfp9Rw

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9,就是header,我们用base64解析一下,得到:

 

{
	"alg": "RS256",
	"typ": "JWT",
	"kid": "lRzMYupzcYRobNs2fzjtKL_pMdhRKBHvr_L4G1jnGxg"
}

2、Payload

  • 令牌的第二部分是有效负载,其中包含声明。声明是有关实体(通常是用户)和其他数据的声明(存放用户信息的)。同样的,它会使用 Base64 编码组成 JWT 结构的第二部分
{
	"jti": "c57c990a-5d65-4a6b-8521-ef7945b6d799",
	"exp": 1634145967,
	"nbf": 0,
	"iat": 1634110170,
	"iss": "http://iamauth.iamtest.prd.uimpcloud.com/auth/realms/business",
	"aud": "account",
	"sub": "b2590c44-c51b-44d9-8547-70d26510c219",
	"typ": "Bearer",
	"azp": "uimpcloud-frontend",
	"nonce": "65a83d76-e3b3-478f-aa09-91f15939d83e",
	"auth_time": 1634109967,
	"session_state": "3e5f4d55-2f76-46c3-bd41-48e79c9c0de6",
	"acr": "0",
	"allowed-origins": ["*"],
	"realm_access": {
		"roles": ["offline_access", "uma_authorization"]
	},
	"resource_access": {
		"account": {
			"roles": ["manage-account", "manage-account-links", "view-profile"]
		}
	},
	"scope": "openid profile email",
	"email_verified": false,
	"name": "管理员 管",
	"preferred_username": "admin",
	"given_name": "管理员",
	"locale": "zh-CN",
	"family_name": "管"
}

3、Signature
前面两部分都是使用 Base64 进行编码的,即前端可以解开知道里面的信息。Signature 需要使用编码后的 header 和 payload 以及我们提供的一个密钥,然后使用 header 中指定的签名算法(HS256)进行签名。签名的作用是保证 JWT 没有被篡改过
base64(header) . base64(payload) . "#**$s@8ss"(秘钥) -----> 组成 Signature
 

WT令牌 = base64(header) . base64(payload) . Signature

eg :

假如我们的JWT令牌返回给客户端了, 结构为base64(header).base64(payload).aaaaa, aaaaa是签名, 由base64(header) . base64(payload) . 密钥生成的, 客户端此时拿到了这个Token;

jwt会先验签, 客户端拿到token去请求数据, 首先服务端会先将该token的Signature和aaaaa作比对, 如果确实相同, 则该令牌是正确的;

这种做法就是为了防止篡改数据, 如果修改了header, payload, 生成的Signature都和服务端的对不上, 就会验证该令牌是非法的;
 

签名目的


最后一步签名的过程,实际上是对头部以及负载内容进行签名,防止内容被窜改。如果有人对头部以及负载的内容解码之后进行修改,再进行编码,最后加上之前的签名组合形成新的JWT的话,那么服务器端会判断出新的头部和负载形成的签名和JWT附带上的签名是不一样的。如果要对新的头部和负载进行签名,在不知道服务器加密时用的密钥的话,得出来的签名也是不一样的。
信息安全问题
在这里大家一定会问一个问题:Base64是一种编码,是可逆的,那么我的信息不就被暴露了吗?

是的。所以,在JWT中,不应该在负载里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第 三方通过Base64解码就能很快地知道你的密码了。因此JWT适合用于向Web应用传递一些非敏感信息。JWT还经常用于设计用户认证和授权系统,甚至实现Web应用的单点登录。
 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一彡十

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值