JWT简介

#什么是JWT

JWT的全称是JSON Web Token, 它是一个开放的标准,定义了了一个紧凑和自包含(self-contained)的方法在端与端之间安全的传输JSON信息。传输的JSON信息因为经过了数字签名,因而可以被验证与信息。

**紧凑性: JWT的长度很小,因此可以通过URL、POST参数,HTTP消息头进行传输。 ** 自包含性: JWT的payload中包含了关于用户所需的信息, 避免了数据库查询。

#JWT的通途 授权信息交换

#JWT的结构 JWT有三个部分组成,并由点号(.)连接在一起。

  • Header
  • Payload
  • Signature 形如:

xxxxx.yyyyy.zzzzz

Header

Header本身是一个JSON字符串,它有两个值组成,第一个叫‘typ’,它标识token的类型,默认为“JWT”;第二个叫‘alg’,它标识JWT使用的哈希算法,例如,HMAC, SHA256, RSA等。

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

然后用Base64Url对JSON进行编码。

##Payload Payload部分包含了所有的声明(claim),声明是对某个实体或者或者附加的元数据的描述语句,

保留声明

JWT规范中包含了7个保留声明:

  • iss(issuer): token的签发方,通常为认证服务器,它的值可以是普通的字符串或者是URI。
  • sub(subject): 被认证方的信息,通常为登录用户的相关信息。
  • aud(audience): 用来表示JWT的接受方,它可以是一个字符串数组。
  • exp(expiration time): 时间戳,并且当前时间必须在exp时间之前,当当前时间超过exp时间之后,服务器不再接受该JWT。
  • nbf(Not Before): 时间戳,表示在该时间点之前,服务器不接受该Token。
  • iat(Issued At): 时间戳,Token的签发时间。
  • jti(JWT ID): 大小写敏感的字符串,用于唯一标识当前token。 其中,iss、sub和aud的值都是大小写敏感的。

公共声明

私有声明

Payload需要用Base64Url进行编码。

##Signature 签名是由以上两个部分由点号连接起来之后,有加密算法生成签名字符串。

最终将这三部分组合在一起,生成最终的JWT。

#JWT存储方式 JWT可以保存在HTML5 Web Storage中也可以保存在Cookie中,一下对比这两种方式的不同。

Web StorageCookie
利用JS代码,从响应中取出JWT,存入 Web Stroage中通过set-cookie 自动存入 cookie中
可自定义每次请求是否要添加JWT到报文头中每次请求都会携带JWT
由于同一个domain下的js脚本都可以读取 Web Stroage,所以容易受到Cross-site scripting (xss) 攻击。通过添加HttpOnly可以阻止js脚本从Cookie中读取JWT,防止xss攻击。但是该方法容易收到CSRF攻击,解决方法包括 检查 Head中的Referer/Origin字段,和添加检验token等

转载于:https://my.oschina.net/u/189332/blog/711509

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值