JWT、JWE、JWS 、JWK 都是什么鬼?还傻傻分不清?
共 9305字,需浏览 19分钟
·
2021-11-15 05:03
点击关注公众号,Java干货及时送达
作者:NinthDevilHunster
来源:www.freebuf.com/articles/web/180874.html
JWT 相信很多小伙伴都知道,JSON Web Token,如果在项目中通过 jjwt 来支持 JWT 的话,可能只需要了解 JWT 一个概念即可,但是现在很多时候我们可能不是使用 jjwt,而是选择 nimbus-jose-jwt 库,此时就有可能接触到一些新的概念,如 JWE、JWS。那么 JWE、JWS 以及 JWT 之间是什么关系呢?
最近看到一篇不错的文章讲这个,我们一起来看下,以下是正文。
JWT
> eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">什么是 JWT
> eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" data-linktype="2">eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.
TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
> eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">JWT 解决什么问题?
> eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">认证 Authentication; > eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">授权 Authorization // 注意这两个单词的区别; > eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">联合识别; > eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">客户端会话(无状态的会话); > eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">客户端机密。
> eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">JWT 的一些名词解释
> eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">JWS:Signed JWT签名过的jwt > eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">JWE:Encrypted JWT部分payload经过加密的jwt;目前加密payload的操作不是很普及; > eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">JWK:JWT的密钥,也就是我们常说的 scret; > eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">JWKset:JWT key set在非对称加密中,需要的是密钥对而非单独的密钥,在后文中会阐释; > eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">JWA:当前JWT所用到的密码学算法; > eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">nonsecure JWT:当头部的签名算法被设定为none的时候,该JWT是不安全的;因为签名的部分空缺,所有人都可以修改。
> eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">JWT的组成
> eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">header:主要声明了JWT的签名算法; > eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">payload:主要承载了各种声明并传递明文数据; > eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">signture:拥有该部分的JWT被称为JWS,也就是签了名的JWS;没有该部分的JWT被称为nonsecure JWT 也就是不安全的JWT,此时header中声明的签名算法为none。
> eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" data-linktype="2">JWT header
> eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" data-linktype="2">{
"typ": "JWT",
"alg": "none",
"jti": "4f1g23a12aa"
}
> eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" data-linktype="2">base64UrlEncode(header)
>> eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQ
> eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" data-linktype="2">{
"iss": "http://shaobaobaoer.cn",
"aud": "http://shaobaobaoer.cn/webtest/jwt_auth/",
"jti": "4f1g23a12aa",
"iat": 1534070547,
"nbf": 1534070607,
"exp": 1534074147,
"uid": 1,
"data": {
"uname": "shaobao",
"uEmail": "shaobaobaoer@126.com",
"uID": "0xA0",
"uGroup": "guest"
}
}
> eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">iss 【issuer】发布者的url地址 > eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段 > eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">aud 【audience】接受者的url地址 > eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">exp 【expiration】 该jwt销毁的时间;unix时间戳 > eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳 > eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">iat 【issued at】 该jwt的发布时间;unix 时间戳 > eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">jti 【JWT ID】 该jwt的唯一ID编号
Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。最新面试题整理好了,点击Java面试库小程序在线刷题。
> eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQJWT payload{ "iss": "http://shaobaobaoer.cn", "aud": "http://shaobaobaoer.cn/webtest/jwt_auth/", "jti": "4f1g23a12aa", "iat": 1534070547, "nbf": 1534070607, "exp": 1534074147, "uid": 1, "data": { "uname": "shaobao", "uEmail": "shaobaobaoer@126.com", "uID": "0xA0", "uGroup": "guest" }}jwt payload的组成payload通常由三个部分组成,分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明,都有各自的字段。Registered Claimsiss 【issuer】发布者的url地址sub 【subject】该JWT所面向的用户,用于处理特定应用,不是常用的字段aud 【audience】接受者的url地址exp 【expiration】 该jwt销毁的时间;unix时间戳nbf 【not before】 该jwt的使用时间不能早于该时间;unix时间戳iat 【issued at】 该jwt的发布时间;unix 时间戳jti 【JWT ID】 该jwt的唯一ID编号Public Claims 这些可以由使用JWT的那些标准化组织根据需要定义,应当参考文档IANA JSON Web Token Registry。Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。jwt payload 的加密算法加密的方式如下:base64UrlEncode(payload)>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19暴露的信息所以,在JWT中,不应该在载荷里面加入任何敏感的数据。在上面的例子中,我们传输的是用户的User ID,邮箱等。这个值实际上不是什么敏感内容,一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中,那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。当然,这也是有解决方案的,那就是加密payload。在之后会说到." data-itemshowtype="0" tab="innerlink" data-linktype="2">base64UrlEncode(payload)
>>eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19
JWS
>GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ>># 上面这个是用 HMAC SHA256生成的到目前为止,jwt的签名算法有三种。对称加密HMAC【哈希消息验证码】:HS256/HS384/HS512非对称加密RSASSA【RSA签名算法】(RS256/RS384/RS512)ECDSA【椭圆曲线数据签名算法】(ES256/ES384/ES512)最后将签名与之前的两段内容用.连接,就可以得到经过签名的JWT,也就是JWS。eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19.GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ当验证签名的时候,利用公钥或者密钥来解密Sign,和 base64UrlEncode(header) + "." + base64UrlEncode(payload) 的内容完全一样的时候,表示验证通过。JWS 的额外头部声明如果对于CA有些概念的话,这些内容会比较好理解一些。为了确保服务器的密钥对可靠有效,同时也方便第三方CA机构来签署JWT而非本机服务器签署JWT,对于JWS的头部,可以有额外的声明,以下声明是可选的,具体取决于JWS的使用方式。如下所示:jku: 发送JWK的地址;最好用HTTPS来传输jwk: 就是之前说的JWKkid: jwk的ID编号x5u: 指向一组X509公共证书的URLx5c: X509证书链x5t:X509证书的SHA-1指纹x5t#S256: X509证书的SHA-256指纹typ: 在原本未加密的JWT的基础上增加了 JOSE 和 JOSE+ JSON。JOSE序列化后文会说及。适用于JOSE标头的对象与此JWT混合的情况。crit: 字符串数组,包含声明的名称,用作实现定义的扩展,必须由 this->JWT的解析器处理。不常见。多重验证与JWS序列化当需要多重签名或者JOSE表头的对象与JWS混合的时候,往往需要用到JWS的序列化。JWS的序列化结构如下所示:" data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">JWS 的概念
>GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ>># 上面这个是用 HMAC SHA256生成的到目前为止,jwt的签名算法有三种。对称加密HMAC【哈希消息验证码】:HS256/HS384/HS512非对称加密RSASSA【RSA签名算法】(RS256/RS384/RS512)ECDSA【椭圆曲线数据签名算法】(ES256/ES384/ES512)最后将签名与之前的两段内容用.连接,就可以得到经过签名的JWT,也就是JWS。eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19.GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ当验证签名的时候,利用公钥或者密钥来解密Sign,和 base64UrlEncode(header) + "." + base64UrlEncode(payload) 的内容完全一样的时候,表示验证通过。JWS 的额外头部声明如果对于CA有些概念的话,这些内容会比较好理解一些。为了确保服务器的密钥对可靠有效,同时也方便第三方CA机构来签署JWT而非本机服务器签署JWT,对于JWS的头部,可以有额外的声明,以下声明是可选的,具体取决于JWS的使用方式。如下所示:jku: 发送JWK的地址;最好用HTTPS来传输jwk: 就是之前说的JWKkid: jwk的ID编号x5u: 指向一组X509公共证书的URLx5c: X509证书链x5t:X509证书的SHA-1指纹x5t#S256: X509证书的SHA-256指纹typ: 在原本未加密的JWT的基础上增加了 JOSE 和 JOSE+ JSON。JOSE序列化后文会说及。适用于JOSE标头的对象与此JWT混合的情况。crit: 字符串数组,包含声明的名称,用作实现定义的扩展,必须由 this->JWT的解析器处理。不常见。多重验证与JWS序列化当需要多重签名或者JOSE表头的对象与JWS混合的时候,往往需要用到JWS的序列化。JWS的序列化结构如下所示:" data-itemshowtype="0" tab="innerlink" data-linktype="2">RSASSA || ECDSA || HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
>>GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ
>># 上面这个是用 HMAC SHA256生成的
>GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ>># 上面这个是用 HMAC SHA256生成的到目前为止,jwt的签名算法有三种。对称加密HMAC【哈希消息验证码】:HS256/HS384/HS512非对称加密RSASSA【RSA签名算法】(RS256/RS384/RS512)ECDSA【椭圆曲线数据签名算法】(ES256/ES384/ES512)最后将签名与之前的两段内容用.连接,就可以得到经过签名的JWT,也就是JWS。eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19.GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ当验证签名的时候,利用公钥或者密钥来解密Sign,和 base64UrlEncode(header) + "." + base64UrlEncode(payload) 的内容完全一样的时候,表示验证通过。JWS 的额外头部声明如果对于CA有些概念的话,这些内容会比较好理解一些。为了确保服务器的密钥对可靠有效,同时也方便第三方CA机构来签署JWT而非本机服务器签署JWT,对于JWS的头部,可以有额外的声明,以下声明是可选的,具体取决于JWS的使用方式。如下所示:jku: 发送JWK的地址;最好用HTTPS来传输jwk: 就是之前说的JWKkid: jwk的ID编号x5u: 指向一组X509公共证书的URLx5c: X509证书链x5t:X509证书的SHA-1指纹x5t#S256: X509证书的SHA-256指纹typ: 在原本未加密的JWT的基础上增加了 JOSE 和 JOSE+ JSON。JOSE序列化后文会说及。适用于JOSE标头的对象与此JWT混合的情况。crit: 字符串数组,包含声明的名称,用作实现定义的扩展,必须由 this->JWT的解析器处理。不常见。多重验证与JWS序列化当需要多重签名或者JOSE表头的对象与JWS混合的时候,往往需要用到JWS的序列化。JWS的序列化结构如下所示:" data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">对称加密HMAC【哈希消息验证码】:HS256/HS384/HS512 >GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ>># 上面这个是用 HMAC SHA256生成的到目前为止,jwt的签名算法有三种。对称加密HMAC【哈希消息验证码】:HS256/HS384/HS512非对称加密RSASSA【RSA签名算法】(RS256/RS384/RS512)ECDSA【椭圆曲线数据签名算法】(ES256/ES384/ES512)最后将签名与之前的两段内容用.连接,就可以得到经过签名的JWT,也就是JWS。eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19.GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ当验证签名的时候,利用公钥或者密钥来解密Sign,和 base64UrlEncode(header) + "." + base64UrlEncode(payload) 的内容完全一样的时候,表示验证通过。JWS 的额外头部声明如果对于CA有些概念的话,这些内容会比较好理解一些。为了确保服务器的密钥对可靠有效,同时也方便第三方CA机构来签署JWT而非本机服务器签署JWT,对于JWS的头部,可以有额外的声明,以下声明是可选的,具体取决于JWS的使用方式。如下所示:jku: 发送JWK的地址;最好用HTTPS来传输jwk: 就是之前说的JWKkid: jwk的ID编号x5u: 指向一组X509公共证书的URLx5c: X509证书链x5t:X509证书的SHA-1指纹x5t#S256: X509证书的SHA-256指纹typ: 在原本未加密的JWT的基础上增加了 JOSE 和 JOSE+ JSON。JOSE序列化后文会说及。适用于JOSE标头的对象与此JWT混合的情况。crit: 字符串数组,包含声明的名称,用作实现定义的扩展,必须由 this->JWT的解析器处理。不常见。多重验证与JWS序列化当需要多重签名或者JOSE表头的对象与JWS混合的时候,往往需要用到JWS的序列化。JWS的序列化结构如下所示:" data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">非对称加密RSASSA【RSA签名算法】(RS256/RS384/RS512) >GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ>># 上面这个是用 HMAC SHA256生成的到目前为止,jwt的签名算法有三种。对称加密HMAC【哈希消息验证码】:HS256/HS384/HS512非对称加密RSASSA【RSA签名算法】(RS256/RS384/RS512)ECDSA【椭圆曲线数据签名算法】(ES256/ES384/ES512)最后将签名与之前的两段内容用.连接,就可以得到经过签名的JWT,也就是JWS。eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19.GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ当验证签名的时候,利用公钥或者密钥来解密Sign,和 base64UrlEncode(header) + "." + base64UrlEncode(payload) 的内容完全一样的时候,表示验证通过。JWS 的额外头部声明如果对于CA有些概念的话,这些内容会比较好理解一些。为了确保服务器的密钥对可靠有效,同时也方便第三方CA机构来签署JWT而非本机服务器签署JWT,对于JWS的头部,可以有额外的声明,以下声明是可选的,具体取决于JWS的使用方式。如下所示:jku: 发送JWK的地址;最好用HTTPS来传输jwk: 就是之前说的JWKkid: jwk的ID编号x5u: 指向一组X509公共证书的URLx5c: X509证书链x5t:X509证书的SHA-1指纹x5t#S256: X509证书的SHA-256指纹typ: 在原本未加密的JWT的基础上增加了 JOSE 和 JOSE+ JSON。JOSE序列化后文会说及。适用于JOSE标头的对象与此JWT混合的情况。crit: 字符串数组,包含声明的名称,用作实现定义的扩展,必须由 this->JWT的解析器处理。不常见。多重验证与JWS序列化当需要多重签名或者JOSE表头的对象与JWS混合的时候,往往需要用到JWS的序列化。JWS的序列化结构如下所示:" data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">ECDSA【椭圆曲线数据签名算法】(ES256/ES384/ES512)
>GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ>># 上面这个是用 HMAC SHA256生成的到目前为止,jwt的签名算法有三种。对称加密HMAC【哈希消息验证码】:HS256/HS384/HS512非对称加密RSASSA【RSA签名算法】(RS256/RS384/RS512)ECDSA【椭圆曲线数据签名算法】(ES256/ES384/ES512)最后将签名与之前的两段内容用.连接,就可以得到经过签名的JWT,也就是JWS。eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19.GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ当验证签名的时候,利用公钥或者密钥来解密Sign,和 base64UrlEncode(header) + "." + base64UrlEncode(payload) 的内容完全一样的时候,表示验证通过。JWS 的额外头部声明如果对于CA有些概念的话,这些内容会比较好理解一些。为了确保服务器的密钥对可靠有效,同时也方便第三方CA机构来签署JWT而非本机服务器签署JWT,对于JWS的头部,可以有额外的声明,以下声明是可选的,具体取决于JWS的使用方式。如下所示:jku: 发送JWK的地址;最好用HTTPS来传输jwk: 就是之前说的JWKkid: jwk的ID编号x5u: 指向一组X509公共证书的URLx5c: X509证书链x5t:X509证书的SHA-1指纹x5t#S256: X509证书的SHA-256指纹typ: 在原本未加密的JWT的基础上增加了 JOSE 和 JOSE+ JSON。JOSE序列化后文会说及。适用于JOSE标头的对象与此JWT混合的情况。crit: 字符串数组,包含声明的名称,用作实现定义的扩展,必须由 this->JWT的解析器处理。不常见。多重验证与JWS序列化当需要多重签名或者JOSE表头的对象与JWS混合的时候,往往需要用到JWS的序列化。JWS的序列化结构如下所示:" data-itemshowtype="0" tab="innerlink" data-linktype="2">eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19.GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ
>GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ>># 上面这个是用 HMAC SHA256生成的到目前为止,jwt的签名算法有三种。对称加密HMAC【哈希消息验证码】:HS256/HS384/HS512非对称加密RSASSA【RSA签名算法】(RS256/RS384/RS512)ECDSA【椭圆曲线数据签名算法】(ES256/ES384/ES512)最后将签名与之前的两段内容用.连接,就可以得到经过签名的JWT,也就是JWS。eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19.GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ当验证签名的时候,利用公钥或者密钥来解密Sign,和 base64UrlEncode(header) + "." + base64UrlEncode(payload) 的内容完全一样的时候,表示验证通过。JWS 的额外头部声明如果对于CA有些概念的话,这些内容会比较好理解一些。为了确保服务器的密钥对可靠有效,同时也方便第三方CA机构来签署JWT而非本机服务器签署JWT,对于JWS的头部,可以有额外的声明,以下声明是可选的,具体取决于JWS的使用方式。如下所示:jku: 发送JWK的地址;最好用HTTPS来传输jwk: 就是之前说的JWKkid: jwk的ID编号x5u: 指向一组X509公共证书的URLx5c: X509证书链x5t:X509证书的SHA-1指纹x5t#S256: X509证书的SHA-256指纹typ: 在原本未加密的JWT的基础上增加了 JOSE 和 JOSE+ JSON。JOSE序列化后文会说及。适用于JOSE标头的对象与此JWT混合的情况。crit: 字符串数组,包含声明的名称,用作实现定义的扩展,必须由 this->JWT的解析器处理。不常见。多重验证与JWS序列化当需要多重签名或者JOSE表头的对象与JWS混合的时候,往往需要用到JWS的序列化。JWS的序列化结构如下所示:" data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">JWS 的额外头部声明
>GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ>># 上面这个是用 HMAC SHA256生成的到目前为止,jwt的签名算法有三种。对称加密HMAC【哈希消息验证码】:HS256/HS384/HS512非对称加密RSASSA【RSA签名算法】(RS256/RS384/RS512)ECDSA【椭圆曲线数据签名算法】(ES256/ES384/ES512)最后将签名与之前的两段内容用.连接,就可以得到经过签名的JWT,也就是JWS。eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19.GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ当验证签名的时候,利用公钥或者密钥来解密Sign,和 base64UrlEncode(header) + "." + base64UrlEncode(payload) 的内容完全一样的时候,表示验证通过。JWS 的额外头部声明如果对于CA有些概念的话,这些内容会比较好理解一些。为了确保服务器的密钥对可靠有效,同时也方便第三方CA机构来签署JWT而非本机服务器签署JWT,对于JWS的头部,可以有额外的声明,以下声明是可选的,具体取决于JWS的使用方式。如下所示:jku: 发送JWK的地址;最好用HTTPS来传输jwk: 就是之前说的JWKkid: jwk的ID编号x5u: 指向一组X509公共证书的URLx5c: X509证书链x5t:X509证书的SHA-1指纹x5t#S256: X509证书的SHA-256指纹typ: 在原本未加密的JWT的基础上增加了 JOSE 和 JOSE+ JSON。JOSE序列化后文会说及。适用于JOSE标头的对象与此JWT混合的情况。crit: 字符串数组,包含声明的名称,用作实现定义的扩展,必须由 this->JWT的解析器处理。不常见。多重验证与JWS序列化当需要多重签名或者JOSE表头的对象与JWS混合的时候,往往需要用到JWS的序列化。JWS的序列化结构如下所示:" data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">jku: 发送JWK的地址;最好用HTTPS来传输 >GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ>># 上面这个是用 HMAC SHA256生成的到目前为止,jwt的签名算法有三种。对称加密HMAC【哈希消息验证码】:HS256/HS384/HS512非对称加密RSASSA【RSA签名算法】(RS256/RS384/RS512)ECDSA【椭圆曲线数据签名算法】(ES256/ES384/ES512)最后将签名与之前的两段内容用.连接,就可以得到经过签名的JWT,也就是JWS。eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19.GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ当验证签名的时候,利用公钥或者密钥来解密Sign,和 base64UrlEncode(header) + "." + base64UrlEncode(payload) 的内容完全一样的时候,表示验证通过。JWS 的额外头部声明如果对于CA有些概念的话,这些内容会比较好理解一些。为了确保服务器的密钥对可靠有效,同时也方便第三方CA机构来签署JWT而非本机服务器签署JWT,对于JWS的头部,可以有额外的声明,以下声明是可选的,具体取决于JWS的使用方式。如下所示:jku: 发送JWK的地址;最好用HTTPS来传输jwk: 就是之前说的JWKkid: jwk的ID编号x5u: 指向一组X509公共证书的URLx5c: X509证书链x5t:X509证书的SHA-1指纹x5t#S256: X509证书的SHA-256指纹typ: 在原本未加密的JWT的基础上增加了 JOSE 和 JOSE+ JSON。JOSE序列化后文会说及。适用于JOSE标头的对象与此JWT混合的情况。crit: 字符串数组,包含声明的名称,用作实现定义的扩展,必须由 this->JWT的解析器处理。不常见。多重验证与JWS序列化当需要多重签名或者JOSE表头的对象与JWS混合的时候,往往需要用到JWS的序列化。JWS的序列化结构如下所示:" data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">jwk: 就是之前说的JWK >GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ>># 上面这个是用 HMAC SHA256生成的到目前为止,jwt的签名算法有三种。对称加密HMAC【哈希消息验证码】:HS256/HS384/HS512非对称加密RSASSA【RSA签名算法】(RS256/RS384/RS512)ECDSA【椭圆曲线数据签名算法】(ES256/ES384/ES512)最后将签名与之前的两段内容用.连接,就可以得到经过签名的JWT,也就是JWS。eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19.GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ当验证签名的时候,利用公钥或者密钥来解密Sign,和 base64UrlEncode(header) + "." + base64UrlEncode(payload) 的内容完全一样的时候,表示验证通过。JWS 的额外头部声明如果对于CA有些概念的话,这些内容会比较好理解一些。为了确保服务器的密钥对可靠有效,同时也方便第三方CA机构来签署JWT而非本机服务器签署JWT,对于JWS的头部,可以有额外的声明,以下声明是可选的,具体取决于JWS的使用方式。如下所示:jku: 发送JWK的地址;最好用HTTPS来传输jwk: 就是之前说的JWKkid: jwk的ID编号x5u: 指向一组X509公共证书的URLx5c: X509证书链x5t:X509证书的SHA-1指纹x5t#S256: X509证书的SHA-256指纹typ: 在原本未加密的JWT的基础上增加了 JOSE 和 JOSE+ JSON。JOSE序列化后文会说及。适用于JOSE标头的对象与此JWT混合的情况。crit: 字符串数组,包含声明的名称,用作实现定义的扩展,必须由 this->JWT的解析器处理。不常见。多重验证与JWS序列化当需要多重签名或者JOSE表头的对象与JWS混合的时候,往往需要用到JWS的序列化。JWS的序列化结构如下所示:" data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">kid: jwk的ID编号 >GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ>># 上面这个是用 HMAC SHA256生成的到目前为止,jwt的签名算法有三种。对称加密HMAC【哈希消息验证码】:HS256/HS384/HS512非对称加密RSASSA【RSA签名算法】(RS256/RS384/RS512)ECDSA【椭圆曲线数据签名算法】(ES256/ES384/ES512)最后将签名与之前的两段内容用.连接,就可以得到经过签名的JWT,也就是JWS。eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19.GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ当验证签名的时候,利用公钥或者密钥来解密Sign,和 base64UrlEncode(header) + "." + base64UrlEncode(payload) 的内容完全一样的时候,表示验证通过。JWS 的额外头部声明如果对于CA有些概念的话,这些内容会比较好理解一些。为了确保服务器的密钥对可靠有效,同时也方便第三方CA机构来签署JWT而非本机服务器签署JWT,对于JWS的头部,可以有额外的声明,以下声明是可选的,具体取决于JWS的使用方式。如下所示:jku: 发送JWK的地址;最好用HTTPS来传输jwk: 就是之前说的JWKkid: jwk的ID编号x5u: 指向一组X509公共证书的URLx5c: X509证书链x5t:X509证书的SHA-1指纹x5t#S256: X509证书的SHA-256指纹typ: 在原本未加密的JWT的基础上增加了 JOSE 和 JOSE+ JSON。JOSE序列化后文会说及。适用于JOSE标头的对象与此JWT混合的情况。crit: 字符串数组,包含声明的名称,用作实现定义的扩展,必须由 this->JWT的解析器处理。不常见。多重验证与JWS序列化当需要多重签名或者JOSE表头的对象与JWS混合的时候,往往需要用到JWS的序列化。JWS的序列化结构如下所示:" data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">x5u: 指向一组X509公共证书的URL >GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ>># 上面这个是用 HMAC SHA256生成的到目前为止,jwt的签名算法有三种。对称加密HMAC【哈希消息验证码】:HS256/HS384/HS512非对称加密RSASSA【RSA签名算法】(RS256/RS384/RS512)ECDSA【椭圆曲线数据签名算法】(ES256/ES384/ES512)最后将签名与之前的两段内容用.连接,就可以得到经过签名的JWT,也就是JWS。eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19.GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ当验证签名的时候,利用公钥或者密钥来解密Sign,和 base64UrlEncode(header) + "." + base64UrlEncode(payload) 的内容完全一样的时候,表示验证通过。JWS 的额外头部声明如果对于CA有些概念的话,这些内容会比较好理解一些。为了确保服务器的密钥对可靠有效,同时也方便第三方CA机构来签署JWT而非本机服务器签署JWT,对于JWS的头部,可以有额外的声明,以下声明是可选的,具体取决于JWS的使用方式。如下所示:jku: 发送JWK的地址;最好用HTTPS来传输jwk: 就是之前说的JWKkid: jwk的ID编号x5u: 指向一组X509公共证书的URLx5c: X509证书链x5t:X509证书的SHA-1指纹x5t#S256: X509证书的SHA-256指纹typ: 在原本未加密的JWT的基础上增加了 JOSE 和 JOSE+ JSON。JOSE序列化后文会说及。适用于JOSE标头的对象与此JWT混合的情况。crit: 字符串数组,包含声明的名称,用作实现定义的扩展,必须由 this->JWT的解析器处理。不常见。多重验证与JWS序列化当需要多重签名或者JOSE表头的对象与JWS混合的时候,往往需要用到JWS的序列化。JWS的序列化结构如下所示:" data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">x5c: X509证书链 >GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ>># 上面这个是用 HMAC SHA256生成的到目前为止,jwt的签名算法有三种。对称加密HMAC【哈希消息验证码】:HS256/HS384/HS512非对称加密RSASSA【RSA签名算法】(RS256/RS384/RS512)ECDSA【椭圆曲线数据签名算法】(ES256/ES384/ES512)最后将签名与之前的两段内容用.连接,就可以得到经过签名的JWT,也就是JWS。eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19.GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ当验证签名的时候,利用公钥或者密钥来解密Sign,和 base64UrlEncode(header) + "." + base64UrlEncode(payload) 的内容完全一样的时候,表示验证通过。JWS 的额外头部声明如果对于CA有些概念的话,这些内容会比较好理解一些。为了确保服务器的密钥对可靠有效,同时也方便第三方CA机构来签署JWT而非本机服务器签署JWT,对于JWS的头部,可以有额外的声明,以下声明是可选的,具体取决于JWS的使用方式。如下所示:jku: 发送JWK的地址;最好用HTTPS来传输jwk: 就是之前说的JWKkid: jwk的ID编号x5u: 指向一组X509公共证书的URLx5c: X509证书链x5t:X509证书的SHA-1指纹x5t#S256: X509证书的SHA-256指纹typ: 在原本未加密的JWT的基础上增加了 JOSE 和 JOSE+ JSON。JOSE序列化后文会说及。适用于JOSE标头的对象与此JWT混合的情况。crit: 字符串数组,包含声明的名称,用作实现定义的扩展,必须由 this->JWT的解析器处理。不常见。多重验证与JWS序列化当需要多重签名或者JOSE表头的对象与JWS混合的时候,往往需要用到JWS的序列化。JWS的序列化结构如下所示:" data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">x5t:X509证书的SHA-1指纹 >GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ>># 上面这个是用 HMAC SHA256生成的到目前为止,jwt的签名算法有三种。对称加密HMAC【哈希消息验证码】:HS256/HS384/HS512非对称加密RSASSA【RSA签名算法】(RS256/RS384/RS512)ECDSA【椭圆曲线数据签名算法】(ES256/ES384/ES512)最后将签名与之前的两段内容用.连接,就可以得到经过签名的JWT,也就是JWS。eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19.GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ当验证签名的时候,利用公钥或者密钥来解密Sign,和 base64UrlEncode(header) + "." + base64UrlEncode(payload) 的内容完全一样的时候,表示验证通过。JWS 的额外头部声明如果对于CA有些概念的话,这些内容会比较好理解一些。为了确保服务器的密钥对可靠有效,同时也方便第三方CA机构来签署JWT而非本机服务器签署JWT,对于JWS的头部,可以有额外的声明,以下声明是可选的,具体取决于JWS的使用方式。如下所示:jku: 发送JWK的地址;最好用HTTPS来传输jwk: 就是之前说的JWKkid: jwk的ID编号x5u: 指向一组X509公共证书的URLx5c: X509证书链x5t:X509证书的SHA-1指纹x5t#S256: X509证书的SHA-256指纹typ: 在原本未加密的JWT的基础上增加了 JOSE 和 JOSE+ JSON。JOSE序列化后文会说及。适用于JOSE标头的对象与此JWT混合的情况。crit: 字符串数组,包含声明的名称,用作实现定义的扩展,必须由 this->JWT的解析器处理。不常见。多重验证与JWS序列化当需要多重签名或者JOSE表头的对象与JWS混合的时候,往往需要用到JWS的序列化。JWS的序列化结构如下所示:" data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">x5t#S256: X509证书的SHA-256指纹 >GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ>># 上面这个是用 HMAC SHA256生成的到目前为止,jwt的签名算法有三种。对称加密HMAC【哈希消息验证码】:HS256/HS384/HS512非对称加密RSASSA【RSA签名算法】(RS256/RS384/RS512)ECDSA【椭圆曲线数据签名算法】(ES256/ES384/ES512)最后将签名与之前的两段内容用.连接,就可以得到经过签名的JWT,也就是JWS。eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19.GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ当验证签名的时候,利用公钥或者密钥来解密Sign,和 base64UrlEncode(header) + "." + base64UrlEncode(payload) 的内容完全一样的时候,表示验证通过。JWS 的额外头部声明如果对于CA有些概念的话,这些内容会比较好理解一些。为了确保服务器的密钥对可靠有效,同时也方便第三方CA机构来签署JWT而非本机服务器签署JWT,对于JWS的头部,可以有额外的声明,以下声明是可选的,具体取决于JWS的使用方式。如下所示:jku: 发送JWK的地址;最好用HTTPS来传输jwk: 就是之前说的JWKkid: jwk的ID编号x5u: 指向一组X509公共证书的URLx5c: X509证书链x5t:X509证书的SHA-1指纹x5t#S256: X509证书的SHA-256指纹typ: 在原本未加密的JWT的基础上增加了 JOSE 和 JOSE+ JSON。JOSE序列化后文会说及。适用于JOSE标头的对象与此JWT混合的情况。crit: 字符串数组,包含声明的名称,用作实现定义的扩展,必须由 this->JWT的解析器处理。不常见。多重验证与JWS序列化当需要多重签名或者JOSE表头的对象与JWS混合的时候,往往需要用到JWS的序列化。JWS的序列化结构如下所示:" data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">typ: 在原本未加密的JWT的基础上增加了 JOSE 和 JOSE+ JSON。JOSE序列化后文会说及。适用于JOSE标头的对象与此JWT混合的情况。 >GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ>># 上面这个是用 HMAC SHA256生成的到目前为止,jwt的签名算法有三种。对称加密HMAC【哈希消息验证码】:HS256/HS384/HS512非对称加密RSASSA【RSA签名算法】(RS256/RS384/RS512)ECDSA【椭圆曲线数据签名算法】(ES256/ES384/ES512)最后将签名与之前的两段内容用.连接,就可以得到经过签名的JWT,也就是JWS。eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19.GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ当验证签名的时候,利用公钥或者密钥来解密Sign,和 base64UrlEncode(header) + "." + base64UrlEncode(payload) 的内容完全一样的时候,表示验证通过。JWS 的额外头部声明如果对于CA有些概念的话,这些内容会比较好理解一些。为了确保服务器的密钥对可靠有效,同时也方便第三方CA机构来签署JWT而非本机服务器签署JWT,对于JWS的头部,可以有额外的声明,以下声明是可选的,具体取决于JWS的使用方式。如下所示:jku: 发送JWK的地址;最好用HTTPS来传输jwk: 就是之前说的JWKkid: jwk的ID编号x5u: 指向一组X509公共证书的URLx5c: X509证书链x5t:X509证书的SHA-1指纹x5t#S256: X509证书的SHA-256指纹typ: 在原本未加密的JWT的基础上增加了 JOSE 和 JOSE+ JSON。JOSE序列化后文会说及。适用于JOSE标头的对象与此JWT混合的情况。crit: 字符串数组,包含声明的名称,用作实现定义的扩展,必须由 this->JWT的解析器处理。不常见。多重验证与JWS序列化当需要多重签名或者JOSE表头的对象与JWS混合的时候,往往需要用到JWS的序列化。JWS的序列化结构如下所示:" data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">crit: 字符串数组,包含声明的名称,用作实现定义的扩展,必须由 this->JWT的解析器处理。不常见。
>GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ>># 上面这个是用 HMAC SHA256生成的到目前为止,jwt的签名算法有三种。对称加密HMAC【哈希消息验证码】:HS256/HS384/HS512非对称加密RSASSA【RSA签名算法】(RS256/RS384/RS512)ECDSA【椭圆曲线数据签名算法】(ES256/ES384/ES512)最后将签名与之前的两段内容用.连接,就可以得到经过签名的JWT,也就是JWS。eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19.GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ当验证签名的时候,利用公钥或者密钥来解密Sign,和 base64UrlEncode(header) + "." + base64UrlEncode(payload) 的内容完全一样的时候,表示验证通过。JWS 的额外头部声明如果对于CA有些概念的话,这些内容会比较好理解一些。为了确保服务器的密钥对可靠有效,同时也方便第三方CA机构来签署JWT而非本机服务器签署JWT,对于JWS的头部,可以有额外的声明,以下声明是可选的,具体取决于JWS的使用方式。如下所示:jku: 发送JWK的地址;最好用HTTPS来传输jwk: 就是之前说的JWKkid: jwk的ID编号x5u: 指向一组X509公共证书的URLx5c: X509证书链x5t:X509证书的SHA-1指纹x5t#S256: X509证书的SHA-256指纹typ: 在原本未加密的JWT的基础上增加了 JOSE 和 JOSE+ JSON。JOSE序列化后文会说及。适用于JOSE标头的对象与此JWT混合的情况。crit: 字符串数组,包含声明的名称,用作实现定义的扩展,必须由 this->JWT的解析器处理。不常见。多重验证与JWS序列化当需要多重签名或者JOSE表头的对象与JWS混合的时候,往往需要用到JWS的序列化。JWS的序列化结构如下所示:" data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">多重验证与JWS序列化
{
"payload": "eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ",
"signatures":
[
{
"protected": "eyJhbGciOiJSUzI1NiJ9",
"header": { "kid": "2010-12-29" },
"signature":"signature1"
},
{
"protected": "eyJhbGciOiJSUzI1NiJ9",
"header": { "kid": "e9bc097a-ce51-4036-9562-d2ade882db0d" },
"signature":"signature2"
},
...
]
}
结构很容易理解。首先是payload字段,这个不用多讲,之后是signatures字段,这是一个数组,代表着多个签名。
点击关注公众号,Java干货及时送达
每个签名的结构如下:
protected:之前的头部声明,利用b64uri加密; header:JWS的额外声明,这段内容不会放在签名之中,无需验证; signature:也就是对当前header+payload的签名。
JWE
JWE 相关概念
JWE是一个很新的概念,总之,除了jwt的官方手册外,很少有网站或者博客会介绍这个东西。也并非所有的库都支持JWE。这里记录一下自己看官方手册后理解下来的东西。
JWS是去验证数据的,而JWE(JSON Web Encryption)是保护数据不被第三方的人看到的。通过JWE,JWT变得更加安全。
JWE和JWS的公钥私钥方案不相同,JWS中,私钥持有者加密令牌,公钥持有者验证令牌。而JWE中,私钥一方应该是唯一可以解密令牌的一方。
在JWE中,公钥持有可以将新的数据放入JWT中,但是JWS中,公钥持有者只能验证数据,不能引入新的数据。因此,对于公钥/私钥的方案而言,JWS和JWE是互补的。
JWE 的构成
一个JWE,应该是如下形式的:
eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.
UGhIOguC7IuEvf_NPVaXsGMoLOmwvc1GyqlIKOK1nN94nHPoltGRhWhw7Zx0-kFm1NJn8LE9XShH59_
i8J0PH5ZZyNfGy2xGdULU7sHNF6Gp2vPLgNZ__deLKxGHZ7PcHALUzoOegEI-8E66jX2E4zyJKxYxzZIItRzC5hlRirb6Y5Cl_p-ko3YvkkysZIFNPccxRU7qve1WYPxqbb2Yw8kZqa2rMWI5ng8Otv
zlV7elprCbuPhcCdZ6XDP0_F8rkXds2vE4X-ncOIM8hAYHHi29NX0mcKiRaD0-D-ljQTPcFPgwCp6X-nZZd9OHBv-B3oWh2TbqmScqXMR4gp_A.
AxY8DCtDaGlsbGljb3RoZQ.
KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY.
9hH0vgRfYgPnAHOd8stkvw
如你所见JWE一共有五个部分,分别是:
The protected header,类似于JWS的头部; The encrypted key,用于加密密文和其他加密数据的对称密钥; The initialization vector,初始IV值,有些加密方式需要额外的或者随机的数据; The encrypted data (cipher text),密文数据; The authentication tag,由算法产生的附加数据,来防止密文被篡改。
JWE 密钥加密算法
一般来说,JWE需要对密钥进行加密,这就意味着同一个JWT中至少有两种加密算法在起作用。但是并非将密钥拿来就能用,我们需要对密钥进行加密后,利用JWK密钥管理模式来导出这些密钥。JWK的管理模式有以下五种,分别是:
Key Encryption Key Wrapping Direct Key Agreement Key Agreement with Key Wrapping Direct Encryption
并不是所有的JWA都能够支持这五种密钥管理管理模式,也并非每种密钥管理模式之间都可以相互转换。可以参考Spomky-Labs/jose中给出的表格:
https://github.com/Spomky-Labs/jose/blob/master/doc/operation/Encrypt.md
至于各个密钥管理模式的细节,还请看JWT的官方手册,解释起来较为复杂。另外,Java系列面试题和答案全部整理好了,微信搜索Java技术栈,在后台发送:面试,可以在线阅读。
JWE Header
就好像是JWS的头部一样。JWE的头部也有着自己规定的额外声明字段,如下所示:
type:一般是 jwt alg:算法名称,和JWS相同,该算法用于加密稍后用于加密内容的实际密钥 enc:算法名称,用上一步生成的密钥加密内容的算法。 zip:加密前压缩数据的算法。该参数可选,如果不存在则不执行压缩,通常的值为 DEF,也就是deflate算法 jku/jkw/kid/x5u/x5c/x5t/x5t#S256/typ/cty/crit:和JWS额额外声明一样。
JWE 的加密过程
步骤2和步骤3,更具不同的密钥管理模式,应该有不同的处理方式。在此只罗列一些通常情况。
推荐一个 Spring Boot 基础教程及实战示例:https://github.com/javastacks/spring-boot-best-practice
之前谈及,JWE一共有五个部分。现在来详细说一下加密的过程:
根据头部alg的声明,生成一定大小的随机数; 根据密钥管理模式确定加密密钥; 根据密钥管理模式确定JWE加密密钥,得到CEK; 计算初始IV,如果不需要,跳过此步骤; 如果ZIP头申明了,则压缩明文; 使用CEK,IV和附加认证数据,通过enc头声明的算法来加密内容,结果为加密数据和认证标记; 压缩内容,返回token。
base64(header) + '.' +base64(encryptedKey) + '.' + // Steps 2 and 3base64(initializationVector) + '.' + // Step 4base64(ciphertext) + '.' + // Step 6base64(authenticationTag) // Step 6
多重验证与JWE序列化
和JWS类似,JWE也定义了紧凑的序列化格式,用来完成多种形式的加密。大致格式如下所示:
{
"protected": "eyJlbmMiOiJBMTI4Q0JDLUhTMjU2In0",
"unprotected": { "jku":"https://server.example.com/keys.jwks" },
"recipients":[
{
"header": { "alg":"RSA1_5","kid":"2011-04-29" },
"encrypted_key":
"UGhIOguC7Iu...cqXMR4gp_A"
},
{
"header": { "alg":"A128KW","kid":"7" },
"encrypted_key": "6KB707dM9YTIgH...9locizkDTHzBC2IlrT1oOQ"
}
],
"iv": "AxY8DCtDaGlsbGljb3RoZQ",
"ciphertext": "KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY",
"tag": "Mz-VPPyU4RlcuYv1IwIvzw"
}
结构很容易理解,如下所示:
protected:之前的头部声明,利用b64uri加密; unprotected:一般放JWS的额外声明,这段内容不会被b64加密; iv:64加密后的iv参数; add:额外认证数据; ciphertext:b64加密后的加密数据; recipients:b64加密后的认证标志-加密链,这是一个数组,每个数组中包含了两个信息; header:主要是声明当前密钥的算法; encrypted_key:JWE加密密钥。
JWT 的工作原理
这里通过juice shop来说下jwt是如何工作的。在身份验证中,当用户使用其凭据成功登录时,将返回JSON Web令牌。如下所示:往此时,返回了jwt的令牌。
每当用户想要访问受保护的路由或资源时,用户将使用承载【bearer】模式发送JWT,通常在Authorization标头中。标题的内容应如下所示:
Authorization: Bearer
随后,服务器会取出token中的内容,来返回对应的内容。须知,这个token不一定会储存在cookie中,如果存在cookie中的话,需要设置为http-only,防止XSS。另外,还可以放在别的地方,比如localStorage、sessionStorage。如果使用vue的话,还可以存在vuex里面。
另外,如果在如Authorization: Bearer中发送令牌,则跨域资源共享(CORS)将不会成为问题,因为它不使用cookie。
此时,去访问认证页面,请求头如下所示,如预期所见,是利用Authorization:Bearer的请求头去访问的。
ECDSA|RSASSA or HMAC ?应该选用哪个?
之前看JWT的时候看到论坛里的一个话题,觉得很有意思,用自己的理解来说一下:
https://stackoverflow.com/questions/38588319/understanding-rsa-signing-for-jwt。
首先,我们必须明确一点,无论用的是 HMAC,RSASSA,ECDSA;密钥,公钥,私钥都不会发送给客户端,仅仅会保留在服务端上。
对称的算法HMAC适用于单点登录,一对一的场景中。速度很快。
但是面对一对多的情况,比如一个APP中的不同服务模块,需要JWT登录的时候,主服务端【APP】拥有一个私钥来完成签名即可,而用户带着JWT在访问不同服务模块【副服务端】的时候,副服务端只要用公钥来验证签名就可以了。从一定程度上也减少了主服务端的压力。
当然,还有一种情况就是不同成员进行开发的时候,大家可以用统一的私钥来完成签名,然后用各自的公钥去完成对JWT的认证,也是一种非常好的开发手段。
因此,构建一个没有多个小型“微服务应用程序”的应用程序,并且开发人员只有一组的,选择HMAC来签名即可。其他情况下,尽量选择RSA。
关注Java技术栈看更多干货