code学习

JWT的一些概念

jwt使用评价

​​http://www.andaily.com/blog/?s=nimbus-jose-jwt​​

从易用性, 扩展性, 完整性等来看, 使用首先推荐 jose4j, 其次是 Nimbus-jose-jwt.

概述以及官方文档

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

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

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

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

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

数据信息交换:JWT是一种非常方便的多方传递数据的载体,因为其可以使用数据签名来保证数据的有效性和安全性。

​​https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-25#section-4.1.1​​

使用场景

Authorization (授权) : 这是使用JWT的最常见场景。一旦用户登录,后续每个请求都将包含JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是现在广泛使用的JWT的一个特性,因为它的开销很小,并且可以轻松地跨域使用。

Information Exchange (信息交换) : 对于安全的在各方之间传输信息而言,JSON Web Tokens无疑是一种很好的方式。因为JWTs可以被签名,例如,用公钥/私钥对,你可以确定发送人就是它们所说的那个人。另外,由于签名是使用头和有效负载计算的,您还可以验证内容没有被篡改。

用户提供用户名和密码,我们去数据库查询一下是否匹配,如果匹配了我们就签发token,用户得到token以后可以找一个地方存起来,比如存储浏览器cookie等等,下回用户请求接口时候需要提供token, 后台代码验证token对不对,看看是不是自己签发的,token里面包含的数据可以确定用户是谁,包含了什么权限等等,然后再确定给用户提供对应的权限的资源响应数据等等,token的格式,生成验证的方法可以使用jwt等等

身份认证在这种场景下,一旦用户完成了登陆,在接下来的每个请求中包含JWT,可以用来验证用户身份以及对路由,服务和资源的访问权限进行验证。由于它的开销非常小,可以轻松的在不同域名的系统中传递,所有目前在单点登录(SSO)中比较广泛的使用了该技术。 信息交换在通信的双方之间使用JWT对数据进行编码是一种非常安全的方式,由于它的信息是经过签名的,可以确保发送者发送的信息是没有经过伪造的。

它是如何做身份验证的?

首先,JWT 的 Token 相当是明文,是可以解密的,任何存在 payload 的东西,都没有秘密可言,所以隐私数据不能签发 token。

而服务端,拿到 token 后解密,即可知道用户信息

优点

JWT相比于Session的优点:

我们就来对比,传统的 session 和 JWT 的区别

我们以一个用户,获取用户资料的例子

传统的 session 流程

1.浏览器发起请求登陆

2.服务端验证身份,生成身份验证信息,存储在服务端,并且告诉浏览器写入 Cookie

3.浏览器发起请求获取用户资料,此时 Cookie 内容也跟随这发送到服务器

4.服务器发现 Cookie 中有身份信息,验明正身

5.服务器返回该用户的用户资料

JWT 流程

1.浏览器发起请求登陆

2.服务端验证身份,根据算法,将用户标识符打包生成 token, 并且返回给浏览器

3.浏览器发起请求获取用户资料,把刚刚拿到的 token 一起发送给服务器

4.服务器发现数据中有 token,验明正身

5.服务器返回该用户的用户资料

但实际上区别大了去了

不占用服务器内存开销:session需要保存在服务器,因此会占用服务器内存开销(尽管JWT会让服务器有一些计算压力,比如token的签名和验证).

可扩展性强: 比如有3台机器(A、B、C)组成服务器集群,若session存在机器A上,session只能保存在其中一台服务器,此时你便不能访问机器B、C,因为B、C上没有存放该Session,而使用token就能够验证用户请求合法性,并且我再加几台机器也没事,所以可拓展性好就是这个意思。

前后端分离,支持跨域访问

登录成功之后jwt生成的token每次都是新的加密后的字符串.

缺点

继续阅读