JWT 的结构详解

JWT(JSON Web Token)是一种用于身份验证和授权的开放标准。它由头部、负载和签名三部分组成,常用于用户登录后生成并传递给客户端,用以在后续请求中携带,实现无状态的用户认证。

jwt:JSON Web Token 的缩写

由三部分组成:Header(头部)、Payload(负载)、Signature(签名)。

因此,JWT通常如下所示:

xxxxx.yyyyy.zzzzz

1 Header(头部)

由令牌的类型(即JWT)和正在使用过的签名算法组成。如:

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

那么,这个JSON是Base64Url编码成JWT的第一部分。

2 Payload(负载)

Payload是令牌jwt的第二部分。包含的是请求体和其它一些数据。

载荷的属性有三类:

预定义(Registered) 公有(public) 私有(private)

2.1 预定义的载荷

{

    "sub": "1",

    "iss": "http://localhost:8000/auth/login",

    "iat": 1451888119,

    "exp": 1454516119,

    "nbf": 1451888119,

    "jti": "37c107e4609ddbcc9c096ea5ee76c667",

    "aud": "dev"

}

这里面的前 7 个字段都是由官方所定义的,也就是预定义(Registered claims)的,并不都是必需的。

iss (issuer):签发人

sub (subject):主题

aud (audience):受众

exp (expiration time):过期时间

nbf (Not Before):生效时间,在此之前是无效的

iat (Issued At):签发时间

jti (JWT ID):编号

2.2 公有的载荷

在使用 JWT 时可以额外定义的载荷。为了避免冲突,应该使用 IANA JSON Web Token Registry 中定义好的,或者给额外载荷加上类似命名空间的唯一标识。

2.3 私有载荷

在信息交互的双方之间约定好的,既不是预定义载荷也不是公有载荷的一类载荷。这一类载荷可能会发生冲突,所以应该谨慎使用。

3 Signature(签名)

签名属于jwt的第三部分。主要是把头部的base64UrlEncode与负载的base64UrlEncode拼接起来,再进行HMACSHA256加密,加密结果再进行base64url加密,最终得到的结果作为签名部分。

加密过程如下:

base64url(     
    HMACSHA256(       
        base64UrlEncode(header) + "." + base64UrlEncode(payload),       
        your-256-bit-secret (秘钥加盐)     
    ) 
)

如果一个客户端带着jwt请求服务端,服务端要确保这个请求是合法并且没有被篡改的请求,那么服务端是需要一个规则来进行验证的。所以上述签名的加密过程就是服务端的使用的规则,加密结果再和jwt的第三部分进行匹配,确定是否相同,如果相同则为合法请求。如果不相等,则为非法请求。

非法者非法请求的时候,可以通过同样的规则来伪造一个jwt,但是客户端一般是不知道服务端的密钥的(盐),所以非法者几乎不能伪造出合法的请求。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荆茗Scaler

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值