JWT介绍
JWT的全称为Json web token,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。
JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
基本构成
JWT的本质就是token,它主要有三部分组成,分别是头部(header)、荷载(payload)主题部、以及签证(signature)。
前两部分都是由base64进行编码(可反接的加密),后一部分是不可反解的加密,由前两部分base64的结果加密(hash256)后组成。
各部分之间用.进行分割,如下所示:
eyJ0eXBlIjogIkpXVCIsICJhbGciOiAiSEFTSDI1NiJ9.7B226964223A202231303031222C20226E616D65223A202279756E7961222C2022616765223A20223138227D.3495bb47139c954ba17c3081262c55d2b436346e0d58990202cc668b7bca54ac
header
header
header中一般都具有两种信息:
声明类型,这里是jwt
声明加密的算法 通常直接使用 HMAC SHA256
当然你也可以添加上其他信息,如公司名称等。这都是允许的
下面进行自定义头部,JSON格式:
{
"type":"JWT",
"alg":"HASH256"
}
然后使用base64对其进行编码,得到JWT中的header部分:
eyJ0eXBlIjogIkpXVCIsICJhbGciOiAiSEFTSDI1NiJ9
payload
荷载部作为JWT三部分中的第二部分,都是存放有效信息。它可以存放三种类型的有效信息:
标准中注册的声明
公共的声明
私有的声明
标准中注册的声明(建议但不强制使用):
荷载部位的key 描述
iss JWT签发者(服务端)
sub JWT所面向的用户
aud 接收JWT的一方
exp JWT的过期时间,该时间必须大于签发时间
nbf 再某一时间段之前,该JWT不可用
jti JWT的唯一身份标识,主要用作一次性token,回避时序攻击
公共的声明:
公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息,但不建议添加敏感信息,因为该部分在客户端可解密。
私有的声明:
私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。
如下,定义一个payload:
{
"id":"1001",
"name":"yunya",
"age":"12",
}
然后将其进行base64加密,得到JWT的第二部分。
7B226964223A202231303031222C20226E616D65223A202279756E7961222C2022616765223A20223138227D
signature这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了JWT的第三部分。
signature = hashlib.sha256()
signature.update(header_payload_result)
signature.update("salt".encode("utf-8")) # 加盐
signature_result = signature.hexdigest
