JWT在项目中实践小结

  JWT即JSON WEB TOKEN的缩写,轻量级的令牌认证(相比于oauth),可用于数据交换间的安全传输,同时可以使用公钥/私钥的非对称算法对信息进行数字签名,如RS256算法。javascript

  它由3部分组成:php

  • Header  头信息
  • Payload  荷载信息,实际数据;一个token的第二个部分是荷载信息,它包含一些声明Claim(实体的描述,一般是一个User信息,还包括一些其余的元数据)
  • Signature  由头信息+荷载信息+密钥 组合以后进行加密获得,使用header中指定的算法将编码后的header、编码后的payload、一个secret进行加密

  3部分的所包含的内容及详细组成网上已不少,这里再也不啰嗦,咱们只对jwt实际使用过程的注意事项及坑作下分享,但愿后来者能够更好的使用jwt。   html

  【一】项目实践中须要注意一下几点:  前端

  一、因为palyload部分的实际数据可很容易被解出,因此在实际应用中,切记不可在其中传输敏感数据,如密码、秘钥等信息,jwt能作到的主要是防止数据被篡改。java

  二、非对称算法,如RS256皆是服务于签名,即Signature部分,目的就是为了让服务器能够很明确的知道收到的数据是否合法,所以在客户端去作此jwt生成过程是不明智的,容易将密钥公之于众,这样也就失去了jwt防篡改功能。(有一点想不明白的是,若是使用非对称算法,那么公钥理论能够公开,这时候如何保证数据的合法性??咱们目前使用的是HS256算法,只有一个密钥且不可公开)node

  三、jwt涉及base64及加密处理,因此会使传输的数据会比裸传数据大不少,这个须要根据实际状况评估并作好平衡git

 【二】 可能的使用场景:github

  一、单点登陆,此场景也是使用最广的一种,流程原理很简单:算法

  用户登陆成功-》生成token返回前端并保存(cookie或localstorage)-》以后每次请求在header或body中带此token-》服务器验证此token以保证数据合法性segmentfault

  如下引用jwt官网的一张图,可大概说明以上jwt过程:

    此场景应用相比于cookie直接保存登陆信息,可有效防止CSRF攻击(原理可见:https://segmentfault.com/a/1190000003716037),

  CSRF (Cross Site Request Forgery),它讲的是你在一个浏览器中打开了两个标签页,其中一个页面经过窃取另外一个页面的 cookie 来发送伪造的请求,由于 cookie 是随着请求自动发送到服务端的。

    二、与第三方接口的数据传输,在处理对外接口时(特别是公司以外业务)可很方便的做为一个约定,可很好的减小因为数据安全性问题所要作的沟通工做。

  但因为jwt涉及base64及加密处理,因此会使传输的数据会比裸传数据大不少,这方面你们能够根据实际状况作平衡取舍。对于公司内部的项目及对传输数据量有极高要求的更要慎重考虑用jwt方式;对于这种状况,咱们目前的处理方式是模仿jwt,但使用内部约定的签名方式对数据进行数字签名,以达到目的。

【三】JWT、JWS、JWE区别(网上摘录)

  一开始很迷茫于这几个缩写的区别,应该不少人跟我有一样迷茫,特地查了下,

  一、3个的全拼:JWT(JSON Web Tokens)、JWS(JSON Web Signature)、JWE(JSON Web Encryption)

  二、关于JWT,可参考RFC7519(https://tools.ietf.org/html/rfc7519)的描述:

  JSON Web Token (JWT) 是一个间接地、URL安全的,表现为一组声明,能够在双方之间进行传输。一个JWT的声明,是指通过编码后的一个JSON对象,这个JSON对象能够是一个JSON Web     Signature(JWS)结构的荷载(payload),或者是一个JSON Web Encryption(JWE)结构的明文。容许使用声明进行数字签名,或者经过一个Message Authentication Code(MAC)进行完整性保护可选择是否加密。

  即,一组JWT声明(JSON格式的Claims)被经过JWS结构或JWE结构发送。JWS和JWE其实是一个荷载,JWT则是一种基于荷载的实际实现。

  三、JWS,对内容进行数字化签名

  四、JWE,对内容进行加密,而不是签名,JWT声明会被加密码,所以带来了内容的保密性。JWE能够被签名并附在JWS里。这样的话就能够同时加密和签名。

  五、对于客户端,分辨JWS或JWE

  JWS的Header与JWE的Header是不一样的,能够经过检查“alg”Header参数的值来区分。若是这个值表现为一个数字签名或者MAC的算法,或者是”none“,则它是一个JWS。

  若是它表现为一个 Key Encryption, Key Wrapping, Direct Key Agreement, Key Agreement with Key Wrapping, or Direct Encryption algorithm。则它是一个JWE。

  还能够经过Header里的“enc”(encryption algorithm)是否存在来判断,若是"enc"这个成员存在的话说明是JWE,不然的话就是JWS.

附,如下我整理了下开发过程用到的jwt包:

在线debuger及各类语言lib包:https://jwt.io/ 

php包:https://github.com/psecio/jwt

javascript/nodejs包:https://kjur.github.com/jsrsasign

相关文章
相关标签/搜索