jwt单点登录_JWT的学习介绍

什么是JWT

JWT(JSON Web Token)是一种紧凑自包含的,用于在多方传递JSON对象的技术。传递的数据可以使用数字签名增加其安全性。可以使用HMAC加密算法或RSA公钥/私钥加密方式。

紧凑:数据小,可以通过URL,POST参数,请求头发送。且数据小代表传输速度快。

自包含:使用payload数据块记录用户必要且不隐私的数据,可以有效的减少数据库访问次数,提高代码性能。

JWT用处

JWT一般用于处理用户身份验证数据信息交换

用户身份验证:一旦用户登录,每个后续请求都将包含JWT,允许用户访问该令牌允许的路由,服务和资源。单点登录是当今广泛使用JWT的一项功能,因为它的开销很小,并且能够轻松地跨不同域使用。

数据信息交换:可以对JWT进行签名,例如:使用公钥/私钥对。可以验证传输的内容是否遭到篡改。

官网地址:https://jwt.io/

什么是跨域和单点登陆?

什么是域:在应用模型,一个完整的,有独立访问路径的功能集合称为一个域。如:百度称为一个应用或系统。百度下有若干的域,如:搜索引擎(www.baidu.com),百度贴吧(tie.baidu.com),百度知道(zhidao.baidu.com),百度地图(map.baidu.com)等。域信息,有时也称为多级域名。域的划分: 以IP,端口,域名,主机名为标准,实现划分。

什么跨域: 客户端请求的时候,请求的服务器,不是同一个IP,端口,域名,主机名的时候,都称为跨域。

http://www.123.com/index.html 调用 http://www.123.com/server.PHP (非跨域)

http://www.123.com/index.html 调用 http://www.456.com/server.php (主域名不同:123/456,跨域)

http://abc.123.com/index.html 调用 http://def.123.com/server.php (子域名不同:abc/def,跨域)

http://www.123.com:8080/index.html 调用 http://www.123.com:8081/server.php (端口不同:8080/8081,跨域)

http://www.123.com/index.html 调用 https://www.123.com/server.php (协议不同:http/https,跨域)

请注意:localhost和127.0.0.1虽然都指向本机,但也属于跨域

单点登陆:多系统,单一位置登录,实现多系统同时登录的一种技术。常出现在互联网应用和企业级平台中。如:京东。单点登录一般是用于互相授信的系统,实现单一位置登录,全系统有效的。

JWT数据结构

JSON Web令牌以紧凑的形式由三部分组成,这些部分由点.分隔,分别是:
Header:标头
Payload:有效载荷
Signature:签名

因此,JWT通常所示: xxxxx.yyyyy.zzzzzHeader

Header通常由两部分组成:令牌的类型(即JWT)和所使用的签名算法,例如HMAC SHA256或RSA。

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

然后,此JSON被Base64Url编码以形成JWT的第一部分。

如前所述,Base64URL编码,该算法和常见Base64算法类似,稍有差别。

作为令牌的JWT可以放在URL中(例如api.example/?token=xxx)。 Base64中用的三个字符是"+","/"和"=",由于在URL中有特殊含义,因此Base64URL中对他们做了替换:"="去掉,"+"用"-"替换,"/"用"_"替换。

Payload

令牌的第二部分是有效载荷,其中包含声明。 声明是有关实体(通常是用户)和其他数据的声明。 共有三种类型的claims:registered, public, and private claims。

Registered claims:这些是一组非强制性的但建议使用的预定义声明,以提供一组有用的,可互操作的声明。 其中一些是:iss(发行者),exp(到期时间),sub(主题),aud(受众)等。

Public claims:这些可以由使用JWT的人员随意定义。

claims其他的定义,可以参看:https://www.iana.org/assignments/jwt/jwt.xhtml。

避免和已注册信息冲突。

Private claims:这些是自定义声明,旨在在同意使用它们的各方之间共享信息,既不是注册声明也不是公共声明。

{  "sub": "1234567890",  "name": "John Doe",  "admin": true}

然后,对有效负载进行Base64Url编码,以形成JSON Web令牌的第二部分。

注意:即使JWT有签名加密机制,但是payload内容都是明文记录,除非记录的是加密数据,否则不排除泄露隐私数据的可能。不推荐在payload中记录任何敏感数据。

Signature

是服务器验证的传递的数据是否有效安全的标准。在生成JWT最终数据的之前。先使用header中定义的加密算法,将header和payload进行加密,并使用点进行连接。如:加密后的head.加密后的payload。再使用相同的加密算法,对加密后的数据和签名信息进行加密。得到最终结果。
例如,如果要使用HMAC SHA256算法,则将通过以下方式创建签名:

HMACSHA256(  base64UrlEncode(header) + "." +  base64UrlEncode(payload),  secret)

签名用于验证消息在此过程中没有更改,并且对于使用私钥进行签名的令牌,它还可以验证JWT的发送者的真实身份。

输出是三个由点分隔的Base64-URL字符串,可以在HTML和HTTP环境中轻松传递这些字符串,与基于XML的标准(例如SAML)相比,它更紧凑。

下面显示了一个JWT,它已对先前的标头和有效负载进行了编码,并用一个加密算法进行签名。

644ab2df6577e32671288778f3cec3be.png

JWT使用

在身份验证中,当用户使用其凭据成功登录时,将返回JSON Web Token。 由于Token是凭据,因此必须格外小心以防止安全问题。 通常,Token的保存时间不应超过要求的时间。

由于缺乏安全性,您也不应该将敏感的会话数据存储在浏览器中。

客户端访问受保护的路由或资源时,将发送的JWT放在请求的header中。

Authorization: Bearer 

服务器将在Authorization标头中检查有效的JWT,如果存在,则将允许用户访问受保护的资源。

如果令牌是在header中发送的,则跨域资源共享(CORS)不会成为问题,因为它不使用cookie。

CORS(跨域资源共享):当我们需要让数据跨多台移动设备上使用时,跨域资源的共享会是一个让人头疼的问题。在使用Ajax抓取另一个域的资源,就可以会出现禁止请求的情况。

使用JWT技术生成的token,客户端在保存的时候可以考虑cookie或localStorage。cookie保存方式,可以实现跨域传递数据。localStorage是域私有的本地存储,无法实现跨域。

localStorage是webstorage的一种客户端存储数据方式。

webstorage可保存的数据容量为5M。且只能存储字符串数据

webstorage分为localStorage和sessionStorage。

localStorage的生命周期是永久的,关闭页面或浏览器之后localStorage中的数据也不会消失。localStorage除非主动删除数据,否则数据永远不会消失。

sessionStorage是会话相关的本地存储单元,生命周期是在仅在当前会话下有效。sessionStorage引入了一个“浏览器窗口”的概念,sessionStorage是在同源的窗口中始终存在的数据。只要这个浏览器窗口没有关闭,即使刷新页面或者进入同源另一个页面,数据依然存在。但是sessionStorage在关闭了浏览器窗口后就会被销毁。同时独立的打开同一个窗口同一个页面,sessionStorage也是不一样的。

JWT执行流程

83021f74539e8b42e3077c0b7fa713ad.png
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值