合肥学网站设计,seo网站建设价格,淘宝做网站给了钱,网站上的销售怎么做文章目录 1、base64编码2、Base64Url3、JWT的产生背景4、JWT介绍5、JWT组成5.1 Header5.2 Payload5.3 Signature 6、JWT的使用方式7、JWT的几个特点 1、base64编码
base64是一种编码方式#xff0c;不是加密方式。 所谓Base64#xff0c;就是说选出64个字符#xff1a;小写… 文章目录 1、base64编码2、Base64Url3、JWT的产生背景4、JWT介绍5、JWT组成5.1 Header5.2 Payload5.3 Signature 6、JWT的使用方式7、JWT的几个特点 1、base64编码
base64是一种编码方式不是加密方式。 所谓Base64就是说选出64个字符小写字母a-z、大写字母A-Z、数字0-9、符号“、”/“再加上作为垫字的”实际上是使用65个字符作为一个基本字符集。然后其他文件视频、文本、字符串…里的所有符号都转换成这个字符集中的字符。 所谓的垫字的号即base64三个字节一分最后不够分的时候拿等号占位一下也就是说等号只能出现在末尾且最多两个。缺三字节那就是前面刚好够分所以最多可能有两个
在Linux下编码为
echo -n Hello World | base64
SGVsbG8gV29ybGQ
解码为
echo -n SGVsbG8gV29ybGQ | base64 -d
Hello World
其中
echo 命令带换行
echo -n 即不换行输出 echo -n {alg:HS256,typ:JWT} | base64以上是通过管道将echo的结果传给后面的指令当然可以直接base64配合CtrlD结束输入。
也可以对文件进行base64编码和解码
#base64编码
# base64 待编码的文件名 编码后的文件名
base64 1.mp3 mymp3 #打开就是一堆64个字符组成的文件#base64 解码
#base64 -d 待解码的文件名 解码后的文件名
base64 -d mymp388.mp32、Base64Url Base64Url是一种在Base64的基础上编码形成新的编码方式为了编码能在网络中安全顺畅传输需要对Base64进行的编码特别是互联网中。 Base64Url编码的步骤是
明文使用BASE64进行编码在Base64编码的基础上进行以下的处理 1)去除尾部的2)把替换成-3)斜线/替换成下划线_
3、JWT的产生背景
互联网服务离不开用户认证基于session的流程是
用户向服务器发送用户名和密码服务器验证通过后在当前对话session里面保存相关数据比如用户角色、登录时间等等服务器并向用户返回一个session_id写入用户的cookie用户随后的每一次请求都会通过 Cookie将 session_id 传回服务器服务器收到 session_id找到服务端前期保存的数据由此得知用户的身份
这种模式的问题在于扩展性scaling不好。单机当然没有问题如果是服务器集群或者是跨域的服务导向架构就要求 session 数据共享每台服务器都能够读取 session。
举例来说A 网站和 B 网站是同一家公司的关联服务。现在要求用户只要在其中一个网站登录再访问另一个网站就会自动登录单点登录请问怎么实现 解决方案一服务端做session数据持久化 即服务端将写入数据库或别的持久层。各种服务收到请求后都向这个持久层请求数据。这种方案的优点是架构清晰缺点是工程量比较大。另外持久层万一挂了就会单点失败。 解决方案二服务端不再保存 session 数据了所有数据都保存在客户端 如JWT服务器不存数据客户端存服务器解析就行了解析出来JWT合法则允许访问系统。 以上是JWT实现登录的原理图即客户端认证通过后被下发一个令牌客户端发起请求时携带这个令牌服务端可以通过算法和密钥进行令牌合法性校验不再依赖数据库Memcached的等存储系统因此可以做到跨服务器验证只要密钥和算法相同不同服务器程序生成的Token可以互相验证通过。这就是JWT和session的区别用JWT时服务端啥也不用存就做个校验。
直白讲就是服务端用解析 token 的计算时间换取 session 的存储空间从而减轻服务器的压力减少频繁的查询数据库。
4、JWT介绍 JSON Web TokenJWT是一个开放标准RFC 7519它定义了一种紧凑且独立的方式用于在各方之间作为JSON对象安全地传输信息。 此信息可以通过数字签名进行验证和信任。JWT可以使用密钥使用HMAC算法或使用RSA或ECDSA的公钥/私钥对进行签名。 相关文档
官方网址https://jwt.io/调试页面https://jwt.io/学习文档https://jwt.io/introduction/
JWT的主要用途有
授权一次登录后后续请求携带token校验合法的token则允许访问系统的资源。JWT广泛应用于单点登录SSOSingle Sign On上因为其开销很小且可以在不同领域轻松使用信息交换JSON Web Token是一种在各方面之间安全信息传输的好的方式 因为JWT可以签名 - 例如使用公钥/私钥对 - 您可以确定发件人是他们所说的人。 此外由于使用标头和有效负载计算签名您还可以验证内容是否未被篡改。
5、JWT组成
一个JWT由三部分组成各部分以点分隔xxxxx.yyyyy.zzzzz格式Header(头部-----base64Url编码的Json字符串 Payload(载荷—base64url编码的Json字符串 Signature(签名)—使用指定算法通过Header和Playload加盐计算的字符串 举例
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c5.1 Header
头部由两部分组成
1token的类型目前只能是JWT2签名算法比如HMAC 、 SHA256 、 RSA
示例
{alg:HS256,typ:JWT
}
编码
echo -n {alg:HS256,typ:JWT} | base64得到的就是JWT的第一部分。
5.2 Payload
payload就像车厢里面拉了很多东西比如用户名。 payload有效负载其中包含claims声明。Claims是关于一个实体通常是用户和其他数据类型的声明。Claims又有三种类型
registeredpublicprivate
1 Registered已注册的声明这些是一组预定义声明不是强制性的但建议使用以提供一组有用的可互操作的声明。 其中一些是iss发行人exp到期时间sub主题aud观众and others。请注意声明名称只有三个字符因为JWT意味着紧凑。 2 Public(公开声明)这些可以由使用JWT的人随意定义。 但为避免冲突应在IANA JSON Web Token Registry中定义它们或者将其定义为包含防冲突命名空间的URI。
3 private (私人声明)这些声明是为了在同意使用它们的各方之间共享信息而创建的并且既不是注册声明也不是公开声明。
示例{sub: 1234567890,name: John Doe,admin: true
}
5.3 Signature
Signature是用来保证数据安全的是对前两部分head、payload的签名防止数据篡改。首先需要指定一个密钥secret。这个密钥只有服务器才知道不能泄露给用户。然后使用 Header 里面指定的签名算法默认是 HMAC SHA256按照下面的公式产生签名
HMACSHA256(base64UrlEncode(header) . base64UrlEncode(payload),secret)
算出Signature值后再把 Header、Payload、Signature 三个部分拼成一个字符串每个部分之间用点.分隔就可以返回给用户。这就是一个JWT值。
6、JWT的使用方式
客户端收到服务器返回的 JWT可以储存在 Cookie 里面也可以储存在 localStorage本地存储。此后客户端每次与服务器通信都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送但是这样不能跨域所以更好的做法是放在 HTTP 请求的头信息Authorization字段里面。即
Authorization: Bearer jwt
另一种做法是跨域的时候JWT 就放在 POST 请求的数据体里面。 当放本地存储localStorage的时候每次请求需要前端同事从localStorage里取出来放到请求头里再请求后端的controllercontroller中httpServletRequest.getHeader()从请求头里获取出来然后校验合法性合法则允许访问。
7、JWT的几个特点
JWT 默认是不加密但也是可以加密的。生成原始 Token 以后可以用密钥再加密一次。JWT 不加密的情况下不能将秘密数据写入 JWT。JWT 不仅可以用于认证也可以用于交换信息。有效使用 JWT可以降低服务器端查询数据库的次数。
JWT 的最大缺点是由于服务器不保存 session 状态因此无法在使用过程中废止某个 token或者更改 token 的权限。也就是说一旦 JWT 签发了在到期之前就会始终有效除非服务器部署额外的逻辑JWT的登出问题。后面再说redis就是因为服务端无状态了所以正常情况下 修改了密码后就会跳转到登录页面重新登录修改成功后清空浏览器保存的token了重新认证拿新的token服务端无状态改不了令牌。JWT 本身包含了认证信息一旦泄露任何人都可以获得该令牌的所有权限。为了减少盗用JWT 的有效期应该设置得比较短。对于一些比较重要的权限使用时应该再次对用户进行认证。为了减少盗用JWT 不应该使用 HTTP 80 协议明码传输要使用 HTTPS 443 协议传输。