什么是 JWT -- JSON WEB TOKEN

1.什么是JWT?

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC
7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

2.JWT的由来

要说JWT,我们就应该先来讨论基于token的认证和传统的session认证的区别。

3.传统的session流程

1.浏览器发起请求登陆
 2.服务端验证身份,生成身份验证信息,存储在服务端,并且告诉浏览器写入 Cookie
 3.浏览器发起请求获取用户资料,此时 Cookie 内容也跟随这发送到服务器
 4.服务器发现 Cookie 中有身份信息,验明真身
 5.服务器返回该用户的用户资料

4.基于session认证所暴露出来的问题

Session: 每个用户经过我们的应用认证之后,我们的应用都要在服务端做一次记录,以方便用户下次请求的鉴别,通常而言session都是保存在内存中,而随着认证用户的增多,服务端的开销会明显增大。

扩展性: 用户认证之后,服务端做认证记录,如果认证的记录被保存在内存中的话,这意味着用户下次请求还必须要请求在这台服务器上,这样才能拿到授权的资源,这样在分布式的应用上,相应的限制了负载均衡器的能力。这也意味着限制了应用的扩展能力。

CSRF: 因为是基于cookie来进行用户识别的, cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。

CORS (跨域资源共享): 当我们扩展应用程序,让数据能够从不同设备上访问时,跨域资源的共享会是一个让人头疼的问题。在使用 Ajax 抓取另一个域的资源时(移动端访问我们的 API 服务器),可能会出现禁止请求的情况。

5.基于Token的验证原理

基于 Token 的身份验证是无状态的,我们不用将用户信息存在服务器或 Session 中。这种概念解决了在服务端存储信息时的许多问题。没有
session 信息意味着你的程序可以根据需要去增减机器,而不用去担心用户是否登录和已经登录到了哪里。

虽然基于Token的身份验证实现的方式很多,但大致过程如下:

1.用户通过用户名和密码发送请求。
2.程序验证。
3.程序返回一个签名的 token 给客户端。
4.客户端储存 token, 并且每次请求都会附带它。
5.服务端验证 token 并返回数据。
6. 每一次请求都需要Token。Token 应该在 HTTP的头部发送从而保证了 Http 请求无状态。我们也需要设置服务器属性

Access-Control-Allow-Origin: * 

来让服务器能接受到来自所有域的请求。需要注意的是,在ACAO头部指定 * 时,不得带有像HTTP认证,客户端SSL证书和cookies的证书。

6.JWT的实现原理

JWT包包含三部分数据Header + Payload + Signature:
①Header:头部,通常头部有两部分信息:申明类型,这里是JWT,会对头部进行base64编码,得到第一部分数据。
②Payload: 载荷,就是有效数据,一般包含下面信息:a.用户身份信息(注意,因为这里采用的是base64编码,可解码,所以不要存放敏感信息);b.注册申明:比如token的签发时间,过期时间,签发人等;这一部分也是base64编码,得到第二部分数据。
③Signature: 签名,是整个数据的认证信息,一般根据前两部的数据,再加上服务的秘钥(secret)(最好是周期性的更换),通过加密算法生成,用于验证整个数据的完整性和可靠性。
生成的数据格式:token=个人证件,jwt=个人身份证
在这里插入图片描述

7.交互流程

在这里插入图片描述
流程解析:
1. 浏览器发起请求登陆
 2. 服务端验证身份,根据算法,将用户标识符打包生成 token, 并且返回给浏览器
 3. 浏览器发起请求获取用户资料,把刚刚拿到的 token 一起发送给服务器
 4. 服务器发现数据中有 token,验明正身
 5. 服务器返回该用户的用户资料
因为JWT签发的token中已经包含了用户的身份信息,并且每次都会携带,这样服务就无须保存用户信息,甚至无需去数据库查询,完全符和Rest的无状态规范。

8.传统的session和jwt的区别

  1. session 存储在服务端占用服务器资源,而 JWT 存储在客户端
     2. session 存储在 Cookie 中,存在伪造跨站请求伪造攻击的风险
     3. session 只存在一台服务器上,那么下次请求就必须请求这台服务器,不利于分布式应用
     4. 存储在客户端的 JWT 比存储在服务端的 session 更具有扩展性

9.优点

1.因为json的通用性,所以JWT是可以进行跨语言支持的,像JAVA,JavaScript,NodeJS,PHP等很多语言都可以使用。
2.因为有了payload部分,所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息。
3.便于传输,jwt的构成非常简单,字节占用很小,所以它是非常便于传输的。
4.它不需要在服务端保存会话信息, 所以它易于应用的扩展

10.安全

不应该在jwt的payload部分存放敏感信息,因为该部分是客户端可解密的部分。
保护好secret私钥,该私钥非常重要。
如果可以,请使用https协议

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值