jwt是什么?
JWTs是JSON对象的编码表示。JSON对象由零或多个名称/值对组成,其中名称为字符串,值为任意JSON值。JWT有助于在clear(例如在URL中)发送这样的信息,可以被信任为不可读(即加密的)、不可修改的(即签名)和URL-safe(即Base64编码的)。
jwt的组成
Header:标题包含了令牌的元数据,并且在最小包含签名和/或加密算法的类型Claims:Claims包含您想要签署的任何信息JSONWebSignature(JWS):在header中指定的使用该算法的数字签名和声明
例如:
Header:{"alg":"HS","typ":"JWT"}Claims:{"sub":"","name":"","admin":true}Signature:base64UrlEncode(Header)+"."+base64UrlEncode(Claims),
加密生成的token:
如何保证JWT安全
有很多库可以帮助您创建和验证JWT,但是当使用JWT时,仍然可以做一些事情来限制您的安全风险。在您信任JWT中的任何信息之前,请始终验证签名。这应该是给定的。
换句话说,如果您正在传递一个秘密签名密钥到验证签名的方法,并且签名算法被设置为“none”,那么它应该失败验证。
确保签名的秘密签名,用于计算和验证签名。秘密签名密钥只能由发行者和消费者访问,不能在这两方之外访问。
不要在JWT中包含任何敏感数据。这些令牌通常是用来防止操作(未加密)的,因此索赔中的数据可以很容易地解码和读取。
如果您担心重播攻击,包括一个nonce(jti索赔)、过期时间(exp索赔)和创建时间(iat索赔)。这些在JWT规范中定义得很好。
jwt的框架:JJWT
JJWT是一个提供端到端的JWT创建和验证的Java库。永远免费和开源(ApacheLicense,版本2.0),JJWT很容易使用和理解。它被设计成一个以建筑为中心的流畅界面,隐藏了它的大部分复杂性。
JJWT的目标是最容易使用和理解用于在JVM上创建和验证JSONWeb令牌(JWTs)的库。JJWT是基于JWT、JWS、JWE、JWK和JWARFC规范的Java实现。JJWT还添加了一些不属于规范的便利扩展,比如JWT压缩和索赔强制。
规范兼容:
创建和解析明文压缩JWTs创建、解析和验证所有标准JWS算法的数字签名紧凑JWTs(又称JWSs):HS:HMACusingSHA-HS:HMACusingSHA-HS:HMACusingSHA-RS:RSASSA-PKCS-v1_5usingSHA-RS:RSASSA-PKCS-v1_5usingSHA-RS:RSASSA-PKCS-v1_5usingSHA-PS:RSASSA-PSSusingSHA-andMGF1withSHA-PS:RSASSA-PSSusingSHA-andMGF1withSHA-PS:RSASSA-PSSusingSHA-andMGF1withSHA-ES:ECDSAusingP-andSHA-ES:ECDSAusingP-andSHA-ES:ECDSAusingP-andSHA-
这里以github上的demo演示,理解原理,集成到自己项目中即可。
应用采用springboot+angular+jwt
结构图
Maven引进:pom.xml
groupId