JSON Web Token(JWT)是一个开放的行业标准(RFC 7519),它定义了一种简介的、自包含的协议格式,用于
在通信双方传递json对象,传递的信息经过数字签名可以被验证和信任。JWT可以使用HMAC算法或使用RSA的公
钥/私钥对来签名,防止被篡改。

                                                                                                                  目前jwt是最流行的跨域身份验证解决的方案

JWT数据结构

该对象是一个很长的字符串,字符之间通过.分割,jwt令牌分为三段数据,分别为  header

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

头部包括令牌的类型(即JWT)及使用的哈希算法(如HMAC SHA256或RSA)编码过后得到的就是  jwt令牌 第一部分字符串

Payload挂载

第二部分是挂载部分,内容也是一个json对象,它是存放有效信息的地方,它可以存放jwt提供的现成字段,比如:iss(签发者),exp(过期时间戳), sub(面向的用户)等,也可自定义字段。

{"sub": "1234567890","name": "456","admin": true
}

使用Base64Url编码,得到一个字符串就是JWT令牌的第二部分。

JWT指定七个默认字段供选择。

iss:发行人

exp:到期时间

sub:主题

aud:用户

nbf:在此之前不可用

iat:发布时间

jti:JWT ID用于标识该JWT

Signature 签名

该部分是为了防止用户盗取签名,此部分用于防止jwt内容被篡改。

jwt 令牌结构如下图所释

为什么要选择jwt令牌?

下面是网上找的俩张使用jwt前后对比图

缺点: 虽然系统看上去没有问题,但是每次请求都需要资源服务器请求认证令牌是否合法,存在速度缓慢的问题....

使用jwt令牌后的流程图如下

使用了jwt令牌后,资源服务器拥有了  效验token 的能力,并且可以从jwt 字符串中获取用户相关信息,

JWT令牌的优点:
1、jwt基于json,非常方便解析。
2、可以在令牌中自定义丰富的内容,易扩展。
3、通过非对称加密算法及数字签名技术,JWT防止篡改,安全性高。
4、资源服务使用JWT可不依赖认证服务即可完成授权

缺点

占用内存大,消耗了更多资源,

JWT 用法

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

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

Authorization: Bearer

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

生成私钥和公钥

JWT令牌生成采用非对称加密算法

下边命令生成密钥证书,采用RSA 算法每个证书包含公钥和私钥

keytool -genkeypair -alias testkey -keyalg RSA -keypass testtest -keystore test.keystore -storepass testkeystore

Keytool 是一个java提供的证书管理工具
-alias:密钥的别名
-keyalg:使用的hash算法
-keypass:密钥的访问密码
-keystore:密钥库文件名,test.keystore保存了生成的证书
-storepass:密钥库的访问密码

查询证书信息:

keytool -list -keystore test.keystore

密钥口令      testkeystore

导出密钥

openssl是一个加解密工具包,这里使用openssl来导出公钥信息。

下载地址  http://slproweb.com/products/Win32OpenSSL.html

下载完成后,配置环境变量

配置openssl的path环境变量,xxx\OpenSSL-Win64\bin

cmd进入test.keystore文件所在目录执行如下命令:

输入

keytool -list -rfc --keystore test.keystore | openssl x509 -inform pem -pubkey

把公钥私钥拷贝到text的文本中,并清空换行符

-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlirGVWAEmo2hjQY5LYDrc/8UvIHKIZG4mXWmbJvesDEKNsNAJ5N3pPNpqcded3OkCNOuU1kqSNVsi+8HzMLk6ID5KHTDyLSCDRAVTRMBgIOneDC/uU2hGld+lHr9C8cZgIY2+JXaAvmrp+IOLAD0J0jisnT3zi+FK8/9rZB2r8YSJk15Qg0tYIPcPNRZAq/D5W6B0X9HyAMI4k40XElhQkCNKwOuTbAq/cPin4FKGhAQrhBeQuvo/FBKYMzbujPysWbZhjum6ni5CyD6vwToI+lzoXIi2Y+O4tM24A3SuX4VPtnwWCUqu2Ovfe77/yW4AkV7+JcxtuEoIZ451BuiLwIDAQAB-----END PUBLIC KEY-----
-----BEGIN CERTIFICATE-----MIIDRzCCAi+gAwIBAgIEJJziijANBgkqhkiG9w0BAQsFADBUMQswCQYDVQQGEwJjbjELMAkGA1UECBMCc3oxCzAJBgNVBAcTAmdkMQ0wCwYDVQQKEwR0ZXN0MQ0wCwYDVQQLEwR0ZXN0MQ0wCwYDVQQDEwR4aWFvMB4XDTE5MDMwODAwNTgyOVoXDTE5MDYwNjAwNTgyOVowVDELMAkGA1UEBhMCY24xCzAJBgNVBAgTAnN6MQswCQYDVQQHEwJnZDENMAsGA1UEChMEdGVzdDENMAsGA1UECxMEdGVzdDENMAsGA1UEAxMEeGlhbzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJYqxlVgBJqNoY0GOS2A63P/FLyByiGRuJl1pmyb3rAxCjbDQCeTd6TzaanHXndzpAjTrlNZKkjVbIvvB8zC5OiA+Sh0w8i0gg0QFU0TAYCDp3gwv7lNoRpXfpR6/QvHGYCGNviV2gL5q6fiDiwA9CdI4rJ0984vhSvP/a2Qdq/GEiZNeUINLWCD3DzUWQKvw+VugdF/R8gDCOJONFxJYUJAjSsDrk2wKv3D4p+BShoQEK4QXkLr6PxQSmDM27oz8rFm2YY7pup4uQsg+r8E6CPpc6FyItmPjuLTNuAN0rl+FT7Z8FglKrtjr33u+/8luAJFe/iXMbbhKCGeOdQboi8CAwEAAaMhMB8wHQYDVR0OBBYEFEdMFgpDW/uLMsibvtI1v5KgPOZNMA0GCSqGSIb3DQEBCwUAA4IBAQBFpWlFlDVhb+foS2hufE6chsyUTeVCqJzMS3vDBnxbAdI3JeWiGu24IYmuCNxt7U7PJnbxR0w7S9KdtswwEDtqxUWYbhHUghekcKzZZVD/nugZaYrxlu4Kj/KQRuiBXhY+U9AuJepxz2MN7CS4fbyWXmfAlfYcGmNA/6PieprFCbG+NPCLvR7dHJPKzMdgMSUbhtsmXn5vy78F923kUbXdc7U24RRHT5tdvw+5RU+Pf+YQMzzoH0OfjBKjtD047QIDaPf7ljzLwW44lhTGPyCQ79Ap3tJCwKuQdJ9f3sDBnQdKjTgPD4luLCq6pti4jdpF7HSMUtZzDSgU/TqaHH0F-----END CERTIFICATE-----

生成 JWT令牌 

把 test.keystore 拷贝到 Resource 目录中

@Testpublic void testCreateJwt(){//        证书文件String key_location = "test.keystore";//密钥库密码String keystore_password = "testkeystore";//访问证书路径ClassPathResource resource = new ClassPathResource(key_location);//        密钥工厂KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(resource, keystore_password.toCharArray());//密钥的密码,此密码和别名要匹配String key_password = "testtest";//        密钥别名String alias  = "testkey";//        密钥对   公私密钥KeyPair keyPair = keyStoreKeyFactory.getKeyPair(alias, key_password.toCharArray());//获取私钥RSAPrivateKey aPrivate = (RSAPrivateKey)keyPair.getPrivate();//定义payload信息Map<String, Object> tokenMap = new HashMap<>();tokenMap.put("id", "123");tokenMap.put("name", "mrt");tokenMap.put("ext", "1");//生成jwt令牌Jwt jwt = JwtHelper.encode(JSON.toJSONString(tokenMap), new RsaSigner( aPrivate));String token = jwt.getEncoded();System.out.println(token);}

打印结果如下

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9
.eyJleHQiOiIxIiwibmFtZSI6Im1ydCIsImlkIjoiMTIzIn0
.TEvGV_eQc3_tI-0lQnSnTc1UUYdLEq_J_AbmkfFe3b_uUdIdR6LZEm6nKT5doRq8f9YyGg1JUk0-eaGSiA_jokEoVQTk5ucpLgqU46MYVpjgmoFyd0StrOHDu-GbYXASc-dml0EK3FdEPG2XVZa-ty3y8P2KeTE97DngHZQWnY4ef5Ndr3glFmKEyMzC0_VHaPkZ9ZvzQuukYQrG2acBTWX2kM9RYhRwazIOvDfCafvW7IHD7T6T3fWI0epZ8dO1nQajOLTPWiz4udTjnm3mOfAogdkCxq3Tbt-r8m1mRMQNBrCigew-JjdiJM16qPlkHaeSYH50Jw_BB3R8vtrEWA

JWT解析

@Testpublic void testVerify(){//        公钥String publickey =  "-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlirGVWAEmo2hjQY5LYDrc/8UvIHKIZG4mXWmbJvesDEKNsNAJ5N3pPNpqcded3OkCNOuU1kqSNVsi+8HzMLk6ID5KHTDyLSCDRAVTRMBgIOneDC/uU2hGld+lHr9C8cZgIY2+JXaAvmrp+IOLAD0J0jisnT3zi+FK8/9rZB2r8YSJk15Qg0tYIPcPNRZAq/D5W6B0X9HyAMI4k40XElhQkCNKwOuTbAq/cPin4FKGhAQrhBeQuvo/FBKYMzbujPysWbZhjum6ni5CyD6vwToI+lzoXIi2Y+O4tM24A3SuX4VPtnwWCUqu2Ovfe77/yW4AkV7+JcxtuEoIZ451BuiLwIDAQAB-----END PUBLIC KEY-----";
//       JWT令牌String jwtStr = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHQiOiIxIiwibmFtZSI6Im1ydCIsImlkIjoiMTIzIn0.TEvGV_eQc3_tI-0lQnSnTc1UUYdLEq_J_AbmkfFe3b_uUdIdR6LZEm6nKT5doRq8f9YyGg1JUk0-eaGSiA_jokEoVQTk5ucpLgqU46MYVpjgmoFyd0StrOHDu-GbYXASc-dml0EK3FdEPG2XVZa-ty3y8P2KeTE97DngHZQWnY4ef5Ndr3glFmKEyMzC0_VHaPkZ9ZvzQuukYQrG2acBTWX2kM9RYhRwazIOvDfCafvW7IHD7T6T3fWI0epZ8dO1nQajOLTPWiz4udTjnm3mOfAogdkCxq3Tbt-r8m1mRMQNBrCigew-JjdiJM16qPlkHaeSYH50Jw_BB3R8vtrEWA";//效验令牌                       无效令牌会抛出异常Jwt jwt = JwtHelper.decodeAndVerify(jwtStr, new RsaVerifier(publickey));String encoded = jwt.getEncoded();System.out.println(encoded);}

JSON WEB TOKEN令牌快速入门学习 (jwt)相关推荐

  1. sau交流学习社区-songEagle开发系列:Vue + Vuex + Koa 中使用JWT(JSON Web Token)认证

    一.前言 JWT(JSON Web Token),是为了在网络环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519). JWT不是一个新鲜的东西,网上相关的介绍已经非常多了.不是很了解的 ...

  2. 登录令牌JWT — JSON WEB TOKEN

    登录令牌JWT - JSON WEB TOKEN 关于作者 作者介绍

  3. 理解JWT(JSON Web Token)认证及python实践

    最近想做个小程序,需要用到授权认证流程.以前项目都是用的 OAuth2 认证,但是Sanic 使用OAuth2 不太方便,就想试一下 JWT 的认证方式. 这一篇主要内容是 JWT 的认证原理,以及p ...

  4. python token认证_理解JWT(JSON Web Token)认证及python实践

    最近想做个小程序,需要用到授权认证流程.以前项目都是用的 OAuth2 认证,但是Sanic 使用OAuth2 不太方便,就想试一下 JWT 的认证方式. 这一篇主要内容是 JWT 的认证原理,以及p ...

  5. JSON Web Token(缩写 JWT) 目前最流行、最常见的跨域认证解决方案,前端后端都需要会使用的东西

    JSON Web Token(缩写 JWT)是目前最流行,也是最常见的跨域认证解决方案.无论是咱们后端小伙伴,还是前端小伙伴对都是需要了解. 本文介绍它的原理.使用场景.用法. 关于封面:这个冬天你过 ...

  6. jwt 私钥_什么是 JSON Web Token(JWT)

    有关本文档的快速链接,请参考页面提示. 什么是 JSON Web Token(JWT)? JSON Web Token (JWT) 作为一个开放的标准 (RFC 7519) 定义了一种简洁自包含的方法 ...

  7. (json web token)JWT攻击

    前记 最近国赛+校赛遇到两次json web token的题,发现自己做的并不算顺畅,于是有了这篇学习文章. 为什么要使用Json Web Token Json Web Token简称jwt 顾名思义 ...

  8. JSON Web Token 入门教程

    JSON Web Token 入门教程 转载http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html JSON Web T ...

  9. JWT(JSON Web Token)简介及实现

    JWT(JSON Web Token):是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为Json对象安全地传输信息.由于此信息是经过数字签名的,因此可以被验证和信 ...

  10. 在吗?认识一下JWT(JSON Web Token) ?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:是虎子呀  地址:my.oschina.net/u/4062 ...

最新文章

  1. 英飞凌AI电磁越野组浅析
  2. 带你一起学kivy第一天
  3. JAVA操作properties文件
  4. 12 信息2班 《基于Android的软件开发》课程成绩
  5. 【Selenium 小知识】获取 token 和 cookies
  6. 39页第7题 计算2的i次方之和
  7. (计算机组成原理)第五章中央处理器-第二节:指令执行过程(取指周期、间址周期、执行周期和中断周期)
  8. Java项目构建管理Maven的安装与配置
  9. 微软要放弃Edge了?传微软正在构建基于Chromium的浏览器
  10. 计算机重启恢复到推荐分辨率,为什么重启之后电脑界面分辨率会变
  11. php函数copy和rename的区别
  12. 小米笔记本linux指纹,小米笔记本Air13.3寸指纹版(128GB) u盘装系统win10步骤
  13. oracle中同义词作用,Oracle同义词创建及其作用
  14. discuz php单页,从PHP的模板引擎看Discuz!模板机制
  15. 树莓派编译安装完整版本ROS
  16. Python_day04
  17. 测试人员的KPI考核指标
  18. 全面理解Python迭代器和生成器
  19. WPM2026 P沟道增强型MOS场效应晶体管
  20. BACnet/IP网关如何采集楼宇集中控制系统数据

热门文章

  1. Revit 2019注册机
  2. 手机声音同步到另一部手机_教你一招,手机耳机音量一键同步!
  3. python计算ln与log,python计算以e为底的对数
  4. 微信公众号支付 java_微信支付之公众号支付(java实现)
  5. Gossip 协议简介
  6. 2020年中国不支持苹果_苹果2020年9月事件提示
  7. qlv格式转Mp4格式
  8. Excel学习日记:L4-资料排序
  9. HTML5 通过Vedio标签实现视频循环播放
  10. JAVA 实现汉字五行笔画查询