【JWT】jwt 令牌研究
📫 作者简介:No8g 攻城狮,热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长,专注于研究 Java/Spring/SpringBoot/大数据/计算机底层原理/源码,就职于大型物联网公司后端高级工程师,擅长物联网领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。📫
🏆 CSDN 认证博客专家博主/后端领域优质创作者/内容合伙人、阿里云/华为云/签约博主、InfoQ/掘金社区/OSCHINA 签约作者,全网 7 万多粉丝支持! 🏆
🔥 如果此文还不错的话,还请👍点赞、关注、收藏三连支持👍一下博主~ 十分感谢,发布的博客会不定期送书的福利哈~ 🔥
一、JWT 介绍
在介绍 JWT 之前先看一下传统校验令牌的方法,如下图:
问题:
传统授权方法的问题是用户每次请求资源服务,资源服务都需要携带令牌访问认证服务去校验令牌的合法性,并根据令牌获取用户的相关信息,性能低下。为什么会说性能低下呢? 原因就是用户(客户端)请求资源服务,资源服务都需要携带令牌访问认证服务去校验令牌的合法性,要明确一来一回的请求和响应都是需要消耗时间的哦。
解决方法:
使用 JWT 的思路是,用户认证通过后 会得到一个 JWT 令牌,JWT 令牌中已经包括了用户相关的信息,客户端只需要携带 JWT 访问资源服务,资源服务根据事先约定的算法自行完成令牌校验(这就是比较厉害的哦),无需每次都请求认证服务完成授权(耗时短)。
JWT 令牌授权过程如下图:
说半天了,还不知道什么是 JWT 令牌吧,请听老夫细细道来:
1.1 JWT 概念
什么是 JWT?
JSON Web Token(JWT)是一个开放的行业标准(RFC 7519),它定义了一种简介的、自包含的协议格式,用于在通信双方传递 json 对象,传递的信息经过数字签名可以被验证和信任。JWT 可以使用 HMAC 算法或使用 RSA 的公钥/私钥对来签名,防止被篡改。
英语比较好的同学,可以去官网看看哦(前提你必须能看老外的网站)。
标准:https://tools.ietf.org/html/rfc7519
我给你贴个图,慢慢看吧
1.2 JWT 优缺点
JWT 令牌的优点:
jwt 基于 json,非常方便解析。
可以在令牌中自定义丰富的内容,易扩展。
通过非对称加密算法及数字签名技术,JWT 防止篡改,安全性高。
资源服务使用 JWT 可不依赖认证服务即可完成授权。
缺点:
JWT 令牌较长,占存储空间比较大。
二、令牌结构
通过学习 JWT 令牌结构为自定义 jwt 令牌打好基础。
JWT 令牌由三部分组成(Header,Payload,Signature),每部分中间使用点(.)分隔,比如:xxxxx.yyyyy.zzzzz
2.1 Header
第二部分是头部包括令牌的类型(即 JWT)及使用的哈希算法(如 HMAC SHA256 或 RSA)
一个例子如下:
下边是 Header 部分的内容
将上边的内容使用 Base64Url 编码,得到一个字符串就是 JWT 令牌的第一部分。
2.2 Payload
第二部分是负载,内容也是一个 json 对象,它是存放有效信息的地方,它可以存放 jwt 提供的现成字段,比如:iss(签发者),exp(过期时间戳), sub(面向的用户)等,也可自定义字段。
此部分不建议存放敏感信息,因为此部分可以解码还原原始内容。
最后将第二部分负载使用 Base64Url 编码,得到一个字符串就是 JWT 令牌的第二部分。
一个例子:
2.3 Signature
第三部分是签名,此部分用于防止 jwt 内容被篡改。
这个部分使用 base64url 将前两部分进行编码,编码后使用点(.)连接组成字符串,最后使用 header 中声明签名算法进行签名。
一个例子:
base64UrlEncode(header):jwt 令牌的第一部分。
base64UrlEncode(payload):jwt 令牌的第二部分。
secret:签名所使用的密钥。
三、JWT 入门
Spring Security 提供对 JWT 的支持,本文我们使用 Spring Security 提供的 JwtHelper 来创建 JWT 令牌,校验 JWT 令牌等操作。
生成私钥和公钥
JWT 令牌生成采用非对称加密算法
3.1 生成密钥证书
下边命令生成密钥证书,采用 RSA 算法每个证书包含公钥和私钥
keytool -genkeypair -alias jykey -keyalg RSA -keypass jiaoyu -keystore jy.keystore -storepass jiaoyukeystore
Keytool 是一个 java 提供的证书管理工具
-alias:密钥的别名
-keyalg:使用的 hash 算法
-keypass:密钥的访问密码
-keystore:密钥库文件名,jy.keystore 保存了生成的证书
-storepass:密钥库的访问密码
查询证书信息:
keytool -list -keystore jy.keystore
删除别名
keytool -delete -alias jykey -keystore jy.keystore
3.2 导出公钥
openssl 是一个加解密工具包,这里使用 openssl 来导出公钥信息。
安装 openssl:http://slproweb.com/products/Win32OpenSSL.html
我的安装资料为 Win64OpenSSL-1_1_0g.exe
配置 openssl 的 path 环境变量(可以参考哦),本教程配置在 D:\OpenSSL-Win64\bin
cmd 进入 jy.keystore 文件所在目录执行如下命令:
bash keytool -list -rfc --keystore jy.keystore | openssl x509 -inform pem -pubkey
输入密钥库密码:
下边这一段就是公钥内容:
-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAijyxMdq4S6L1Af1rtB8SjCZHNgsQG8JTfGy55eYvzG0B/E4AudR2prSRBvF7NYPL47scRCNPgLnvbQczBHbBug6uOr78qnWsYxHlW6Aa5dI5NsmOD4DLtSw8eX0hFyK5Fj6ScYOSFBz9cd1nNTvx2+oIv0lJDcpQdQhsfgsEr1ntvWterZt/8r7xNN83gHYuZ6TM5MYvjQNBc5qC7Krs9wM7UoQuL+s0X6RlOib7/mcLn/lFLsLDdYQAZkSDx/6+t+1oHdMarChIPYT1sx9Dwj2j2mvFNDTKKKKAq0cv14Vrhz67Vjmz2yMJePDqUi0JYS2r0iIo7n8vN7s83v5uOQIDAQAB-----END PUBLIC KEY-----
将上边的公钥拷贝到文本文件中,合并为一行。
四、生成 jwt 令牌
在认证工程创建测试类,测试 jwt 令牌的生成与验证。
五、验证 jwt 令牌
到这里本文就告一段落了,如果的新的内容将会随时更新的,尽请关注。
如果感觉写的好,确实帮助了你,那就麻烦帮忙点个赞,多谢!
本文首发于 CSDN,为博主原创文章,如果需要转载,请注明出处,谢谢!
完结!
版权声明: 本文为 InfoQ 作者【No8g攻城狮】的原创文章。
原文链接:【http://xie.infoq.cn/article/53c9d1bbf2b965cff83be92ad】。文章转载请联系作者。
评论