#什么是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 Storage | Cookie |
---|---|
利用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等 |