json web token是用来做什么的?

jwt是和oauth相互不同的两种验证方式么?
关注者
165
被浏览
60,110

9 个回答

JSON web Token,简称JWT,本质是一个token,是一种紧凑的URL安全方法,用于在网络通信的双方之间传递。一般放在HTTP的headers 参数里面的authorization里面,值的前面加Bearer关键字和空格。除此之外,也可以在url和request body中传递。

JWT有三部分依顺序用点号(".")链接而成:1.header,2.payload,3.signature。

header里面说明类型和使用的算法,比如:

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

说明是JWT(JSON web token)类型,使用了HMAC SHA 算法。这个值在链接之前需要用base64UrlEncoding加密。

payload是一组claim的值。claim包含claim name和claim value。前者是string类型,后者可以是任意的json对象。claims有三种类型:reserved claim,public claim 和 private claim。reserved claim是预先定义好的,不强制使用但推荐使用的一组claim,比如 iss(issuer 发布者), exp(expiration time 失效时间),sub(subject 主题),aud(audience 听众) 等。用于说明一些有用的交互信息。

public claim,是指由JTWs所定义的,但是为了防止和其他名字发生重名的claims。它们需要定义成IANA JSON web token registery 里面 或者定义成一个URI,这个URI包含一组固定的命名。

private claim 是客户自己创建的用于彼此分享信息。

举个例子:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

signature 就是用点号将header和payload联系起来,然后用header里面指定的加密方法进行加密后的字符串。

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

应用场景:

1.浏览器将用户名和密码以post请求的方式发送给服务器。

2.服务器接受后验证通过,用一个密钥生成一个JWT。

3.服务器将这个生成的JWT返回给浏览器。

4.浏览器将JWT包含在authorization header里面,然后发送请求给服务器。

5.服务器可以在JWT中提取用户相关信息。进行验证。

6.服务器验证完成后,发送响应结果给浏览器。

OAuth2.0 是一个RFC协议,可以参考RFC6749,它定义了一个安全认证框架。

简单的说包含authentication 和authorization。 而openID connect 是基于这个框架上

的认证实现。上面说的JWT,也就是JSON web token, 在里面得到了应用,可以解决

跨域的问题,详细的资料,需要自己专研了。

JWT是cookie/session based authentication的替代品。oauth是一种授权协议,两者没有多少可比性,不过两者都可以用在一些应用场景中,比如用来实现SSO