1

JWT

什么是JWT

官网里可以看到,JWT是一个开放协议,它以一个可靠的,独立的方式方便在各方之间以Json的方式传输数据。Jwt可以使用秘钥(HMAC算法)或者公钥/私钥(RSA or ECDSA)的方式进行签名

应用场景

授权

常用如登录,登录成功后返回JWT,后续请求都会带上这个JWT,比如SSO

信息交换

使用公钥/私钥对签名时,可以在不同对象间传输信息

JWT结构

一个典型的JWT格式如下:

xxx.yyy.zzz

可以看到JWT由三部分组成,不同部分用.结合起来

  • Header
  • Payload
  • Signature

Header

Header格式如下:

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

alg表示所使用的算法,如HMAC,SHA256, RSA
typ表示token类型,也就是 JWT
Header经过base64编码后会成为JWT的第一部分

Payload

Payload包含了一些Claims,Claims里又包含了实体和额外信息,有三种类型的Claims

  • registered
  • public
  • private

一个典型的Payload如下:

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

registered Claim是预定义的声明,不强制但建议使用,在RFC7519里可以看到,预定义的声明有以下几种

  • iss ((Issuer) Claim)
  • sub ((Subject) Claim)
  • aud ((Audience) Claim)
  • exp ((Expiration Time) Claim)
  • nbf ((Not Before) Claim)
  • iat ((Issued At) Claim)
  • jti ((JWT ID) Claim)
public Claim

public Claim是用户可以自定义的,但是为了避免使用冲突,应该遵循IANA JSON Web Token Registry 规范,

private Claim

private Claim就是用来存贮交换信息的部分

Payload经过base64编码后就成为了JWT的第二部分

Signature

将编码后的Header和Payload组合在一起,再加上secret,经过指定的算法加密就形成了JWT的第三部分

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

最后用.号串联起来,最终就生成了一个JWT token

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.b21wYW55X2lkIjoiZWQ5OGE4YTMtMWMyNi00OTM5LTg0MDQtMjU0OGUyMjgzOWVmIn0sImV4cCI6MTU2NzEzNzg0NywianRpVtIn0.sAlzke31nRGU_Gh_Ux8uh9uKmCnSYgQTk02GYzE97sU

使用方法

Authorization: Bearer <token>

优点

  • 跨域
  • 比XML结构简单,小巧
  • 跨平台
  • 相比Session,无需落地存储

英文版在这儿,这里是我理解翻译过来的
原地址


say_leo
43 声望0 粉丝

下一篇 »
Auth2.0协议

引用和评论

0 条评论