什么是JSON Web Token?
JSON Web Token(JWT)是一个开放式标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON对象安全传输信息。这些信息可以通过数字签名进行验证和信任。可以使用秘密(使用HMAC算法)或使用RSA的公钥/私钥对对JWT进行签名。
为什么使用JWT?
随着技术的发展,分布式web应用的普及,通过session管理用户登录状态成本越来越高,因此慢慢发展成为token的方式做登录身份校验,然后通过token去取redis中的缓存的用户信息,随着之后jwt的出现,校验方式更加简单便捷化,无需通过redis缓存,而是直接根据token取出保存的用户信息,以及对token可用性校验,单点登录更为简单。
JWT的优点:
- 体积小,因而传输速度更快
- 多样化的传输方式,可以通过URL传输、POST传输、请求头Header传输(常用)
- 简单方便,服务端拿到jwt后无需再次查询数据库校验token可用性,也无需进行redis缓存校验
- 在分布式系统中,很好地解决了单点登录问题
- 很方便的解决了跨域授权问题,因为跨域无法共享cookie
JWT的缺点:
- 因为JWT是无状态的,因此服务端无法控制已经生成的Token失效,是不可控的,这一点对于是否使用jwt是需要重点考量的
- 获取到jwt也就拥有了登录权限,因此jwt是不可泄露的,网站最好使用https,防止中间攻击偷取jwt
- 在退出登录 / 修改密码时怎样实现JWT Token失效 可以将jwt存入redis,并设置过期时间,jwt验证时,先判断redis中是否存在,如果redis中不存在,则说明是无效的jwt 对于JWT安全性:
JWT被确实存在被窃取的问题,但是如果能得到别人的token,其实也就相当于能窃取别人的密码,这其实已经不是JWT安全性的问题。网络是存在多种不安全性的,对于传统的session登录的方式,如果别人能窃取登录后的sessionID,也就能模拟登录状态,这和JWT是类似的。为了安全,https加密非常有必要,对于JWT有效时间最好设置短一点。
1.JWT即JSON Web Tokens,他可以用来安全的传递信息,因为这些信息是经过数字签名的
2.JWT可以使用一种加密算法比如HMAC 算法,也可以使用公钥/私钥的非对称算法
3.因为JWT签名后的信息够短,可以放在url里、request body里、http header里,传输够快。
4.荷载信息里包含所有你想要的,避免不止一次的去查询数据库
5.JWT的使用场景主要包括:
1) 认证,这是比较常见的使用场景,只要用户登录过一次系统,之后的请求都会包含签名出来的token,通过token也可以用来实现单点登录。
2)交换信息,通过使用密钥对来安全的传送信息,可以知道发送者是谁、放置消息被篡改。
6.JSON Web Tokens由三部分组成,用英文句点分割(.) ,一般看起来例如:xxxxx.yyyyy.zzzzz
分为:
- Header 头信息
- Payload 荷载信息,实际数据
- Signature 由头信息+荷载信息+密钥 组合之后进行加密得到
1) Header 头信息通常包含两部分,type:代表token的类型,这里使用的是JWT类型。 alg:使用的Hash算法,例如HMAC SHA256或RSA. 2) 2)Payload 一个token的第二个部分是荷载信息,它包含一些声明Claim(实体的描述,通常是一个User信息,还包括一些其他的元数据)
声明分三类:
1)Reserved Claims,这是一套预定义的声明,并不是必须的,这是一套易于使用、操作性强的声明。包括:iss(issuer)、exp(expiration time)、sub(subject)、aud(audience)等
2)Plubic Claims,
3)Private Claims,交换信息的双方自定义的声明 3) signature 使用header中指定的算法将编码后的header、编码后的payload、一个secret进行加密
例如使用的是HMAC SHA256算法,大致流程类似于: HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
这个signature字段被用来确认JWT信息的发送者是谁,并保证信息没有被修改
7.这个JSON Web Tokens包含了必要的用户信息,减少了对数据库进行多次查询的需要。
8.由于没有使用Cookies,Cross-Origin Resource Sharing (CORS) ,跨域的资源访问不会成为问题