Json Web Token

来源:互联网 发布:淘宝雪梨的质量 编辑:程序博客网 时间:2024/06/06 12:51

Json Web token简介

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

JWT官网

https://jwt.io/

应用场景

认证

这是使用jwt最常见的场景。用户登录后,每个后续请求将包括 jwt,用户就可以访问该jwt所允许的路由、服务和资源。目前,jwt可是实现单点登,它的开销很小,而且在不同的域中很容易使用。

信息交换

jwt是一种在各方之间传递信息的安全好方法。因为JWTs可以是被数字签名。例如,使用公共/私有密匙对——您可以确定发送者是他们说的是谁。此外,由于签名是使用jwt的头和jwt的有效负载进行计算的,您还可以验证内容没有被篡改过。

JWT的组成

  1. 头部
  2. 载荷
  3. 签名

所以,一般jwt的组成是这样的:xxxxx.yyyyy.zzzzz

头部(header)

头部通常由两个部分组成:令牌的类型,即JWT,以及正在使用的散列算法,例如HMAC SHA256或RSA。

{  "alg": "HS256",  "typ": "JWT"}

然后,这个JSON对象经过Base64Url编码,以形成JWT的第一部分。

载荷(payload)

  • payload是一组claim的值。claim包含claim name和claim value。前者是string类型,后者可以是任意的json对象。claims有三种类型。
  • 1、reserved claim:reserved claim是预先定义好的,不强制使用但推荐使用的一组claim,其用于说明一些有用的交互信息。
  • 2、public claim :public claim,是指由JTWs所定义的,但是为了防止和其他名字发生重名的claims。它们需要定义成IANA JSON web token registery 里面,或者定义成一个URI,这个URI包含一组固定的命名。
  • 3、private claim: 这些是定制的请求,用于在同意使用它们的各方之间共享信息。

比如说,一个reserved claim的组成

iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

签名(Signature)

  • 要创建签名部分,您必须使用经过base64编码过后的头部信息、base64编码过后的有效负载、还有一个秘钥,并且在头中指定的算法,并签署。

  • 该签名用于验证JWT的发送方是谁,它是谁,并确保消息在途中不会被更改。

标准的JWT组成实例

eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiJjZjU0NWQwMGY5YWE0YmVmYTVhNWQ5NThlYzA4MjljNSIsInN1YiI6ImVmODFlMWJjYTYwOTQ3YmFhMTQ2IiwiaWF0IjoxNTAxMzMyMzI3LCJpc3MiOiJodHRwOi8vdGZqeWJqLmNvbSIsImF1ZCI6IjEyMzQ1NiIsImV4cCI6MTUwMTMzNTkyN30.IHlIcZdruhquWc2s3rrhyKRwzguGVgYymgM8KQ_4JUQQX_HUCjgRhVbvJXQIKd3toMuU6cUPFIyphLKiXHUMzA

JWT认证流程

1、用户使用用户名密码来请求服务器
2、服务器进行验证用户的信息
3、服务器通过验证发送给用户一个token
4、客户端存储token,并在每次请求时附送上这个token值
5、服务端验证token值,并返回数据

这里写图片描述

小结

  • 优点:因为json的通用性,所以JWT是可以进行跨语言支持的,像JAVA,JavaScript,NodeJS,PHP等很多语言都可以使用。因为有了payload部分,所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息。便于传输,jwt的构成非常简单,字节占用很小,所以它是非常便于传输的。它不需要在服务端保存会话信息,所以它易于应用的扩展。
  • 安全相关:不应该在jwt的payload部分存放敏感信息,因为该部分是客户端可解密的部分。保护好secret私钥,该私钥非常重要。如果可以,请使用https协议。