JWTs是json web tokens的缩写。

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

JWT.IO allows you to decode, verify and generate JWT.

先上一个例子:

qq20161119-0

左边的接口编码后的token,右边是解码出来的内容。从HEADER看出typ是jwt,算法是HS256,payload是承载的负荷信息,最后一部分我们用secret的私钥验证数字签名。

payload里面我们可以包含:标准中注册的声明、公共的声明、私有的声明。

seq可以用来做单点登录计数器;admin可以代表用户是否是管理员。

传统的session认证流程图:

 

toptal-blog-image-1426676413694

基于服务认证的缺点:

扩展很难:服务端需要给每一个用户创建一个session并且让他持久化存在服务器的某个位置,也可以存在内存或数据库里面。如果是分布式系统,我们必须确保我们使用一个分布式的session存储,不耦合到应用服务器上。

跨域共享: 当使用ajax从另一个域名获取资源,该请求是被禁止的,因为默认的http请求不包含跨域的cookie

web框架耦合性强: session数据共享给其他语言写的框架很困难。

jwt的认证流程图:

 

toptal-blog-image-1426676428399

基于token身份认证的优点:

无状态,容易水平扩张:token中包含了所有用于认证用户的信息,排除了session需要的状态。如果我们使用一个负载均衡,我们的用户可以访问任意的服务器,而不是登录后一直定位到相同的服务器上。

可重用性:我们可以有很多独立的服务器,运行着多平台和多域名,复用相同的token来认证用户。这个非常方便在应用间共享权限。

安全:自从我们不实用cookies,我们就不需要对抗cross-site request forgery(CSRF)攻击了。我们可以使用JWE加密我们在token中私密的信息,在https上进行我们的token传输来阻止中间人攻击。

性能:服务器端不需每次请求都要查到和解析序列化session。仅需要通过HMAC SHA-256 算法验证token和解析其内容。