欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JWT学习小结

程序员文章站 2022-05-11 12:47:12
JWT全称JSON-Web-Tokens,是一套应对Http其无状态且明文传递请求的特性的规范,保证请求的安全性。我们一般用它来在服务端和客户端之间传递用户的身份信息,实现状态保持。 1,相较于常见的session+cookie的实现方式,它有哪些优势呢? Session: 每次用户登录认证通过后, ......

jwt全称json-web-tokens,是一套应对http其无状态且明文传递请求的特性的规范,保证请求的安全性。我们一般用它来在服务端和客户端之间传递用户的身份信息,实现状态保持。

1,相较于常见的session+cookie的实现方式,它有哪些优势呢?

  session: 每次用户登录认证通过后,我们的应用都要在服务端(通常为redis服务器中)存储用户的登录信息,并在响应中设置cookies中设置session的key值进行返回。这在服务器实现负载均衡时,增加负载均衡服务器的性能负担。而面对csrf攻击时, 因为是基于cookie+session的方式来进行用户识别的, cookie一旦被截获,用户就会很容易受到跨站请求伪造的攻击。

  jwt: 

2,jwt的组成:

  jwt是一串加密后的字符串,共由三部分组成,分别为:头部,载荷和签名信息。

  头部(header)

{
    "alg": "hs256",  # 使用的签名算法
    "typ": "jwt",  # 令牌的类型
            }

  载荷(payloader),用于存放有效信息。

{
    "id": user.id,  # 接口中定义的需要返回的信息
    "mobile": user.mobile  # 同上
}

  签名(signature),第三部分是将header和payload用base64进行转码后的字符串拼接的结果用header中指明的算法进行加密再用base64转码。

def encode(payload, signer=none, encrypter=none):
    if signer and encrypter:
        raise signandencrypterror()
 
    headers = {'typ': 'jwt', 'alg': 'none'}
    if signer:
        #更新你所选用的算法,一般都是hs256
        headers.update(signer.headers)
    if encrypter:
        headers.update(encrypter.headers)
 
    #头部序列化
    headers_json = json.dumps(headers, separators=(',', ':'))
 
    #消息主体序列化
    payload_json = json.dumps(payload, separators=(',', ':'))
 
    #使用base64来编码
    header_b64 = b64encode(headers_json)
    payload_b64 = b64encode(payload_json)
 
    first_part = header_b64
    second_part = payload_b64
    third_part = ''
 
    if signer:
        #jwt 签名的生成方式. 他会把header playload的base64url编码加密后再次base64编码.
        third_part = b64encode(signer.sign(first_part + '.' +
                                                second_part))
    if encrypter:
        pass  # todo
    
    #返回可用的jwt
    return first_part + '.' + second_part + '.' + third_part
 
 
def b64encode(data):
    return base64.urlsafe_b64encode(data).rstrip('=')
 
 
#使用hmac来加密
 
class hmacsha(jwsbase):
    def sign(self, signing_input, key=none):
        if not key:
            key = self.key
        if not key:
            raise keyrequiredexception()
        return hmac.new(key, signing_input, self.digestmod).digest()

3、jwt的防篡改

  加密后的token在下次请求时, 服务端通过加密生成的私钥,重新与前2部分组合再次加密,与第三部分进行对比,如果校验成功,则数据没有被修改。

上一篇: CSS居中方法

下一篇: 找戏票呀