返回顶部
首页 > 资讯 > 后端开发 > Python >JWT学习小结
  • 832
分享到

JWT学习小结

小结JWT 2023-01-30 22:01:43 832人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

Jwt全称JSON-WEB-Tokens,是一套应对Http其无状态且明文传递请求的特性的规范,保证请求的安全性。我们一般用它来在服务端和客户端之间传递用户的身份信息,实现状态保持。 1,相较于常见的session+cookie的实现方式

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部分组合再次加密,与第三部分进行对比,如果校验成功,则数据没有被修改。

4、JWT防止CSRF攻击

  客户端使用 auth授权头认证,token存储在 cookie中,需要防止xss攻击。可以防止 csrf攻击,因为 csrf只能在请求中携带 cookie,而这里必须从 cookie中拿出相应的值并放到 authorization 头中。实际上cookie不能跨站(同源政策)被取出,因此可以避免 csrf 攻击。(适用于 ajax请求或者 api请求,可以方便的设置 auth头)。
  也可以将token存储在 localstorage里面,需要防止xss攻击。实现方式可以在一个统一的地方复写请求头,让每次请求都在header中带上这个token, 当token失效的时候,后端肯定会返回401,这个时候在你可以在前端代码中操作返回登陆页面,清除localstorage中的token。(适用于 ajax请求或者 api请求,可以方便的存入 localstorage)。

--结束END--

本文标题: JWT学习小结

本文链接: https://lsjlt.com/news/179905.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JWT学习小结
    JWT全称JSON-Web-Tokens,是一套应对Http其无状态且明文传递请求的特性的规范,保证请求的安全性。我们一般用它来在服务端和客户端之间传递用户的身份信息,实现状态保持。 1,相较于常见的session+cookie的实现方式...
    99+
    2023-01-30
    小结 JWT
  • BASH 学习笔记小结
    1. Linux 脚本编写基础 1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例...
    99+
    2022-06-04
    小结 学习笔记 BASH
  • 我的NodeJs学习小结(一)
    这第一篇就谈谈NodeJs的一些编程细节吧。 1、遍历数组 for (var i=0, l=arr.length; i<l; i++) 这样写的一个好处就是让每次循环少一步获取数...
    99+
    2022-06-04
    小结 NodeJs
  • node.js操作mongodb学习小结
    一、准备工作 1、在mongodb创建将要读取的表 创建数据库mongotest use mongotest; 向user表中插入数据 db.user.insert({ name:'flyoung'...
    99+
    2022-06-04
    小结 操作 node
  • Bash Shell脚本学习小结
    1.字符截断:如果是一般路径的字符截断可以用basename和dirname这两个工具:basename可以从一个文件路径中截一个文件名 例如: $ basename /home/file.tarfile...
    99+
    2022-06-04
    小结 脚本 Bash
  • Go语言学习之golang-jwt/jwt的教程分享
    目录一、介绍二、代码实现 -对称加密 hsa(hash加密)2.1 加密生成token2.2 解密token得到原始数据三、代码实现 -非对称加密 rsa(我们这里使用rsa256)...
    99+
    2023-01-14
    Go语言 golang-jwt/jwt使用 Go语言  golang-jwt/jwt golang-jwt/jwt使用
  • Python Pytorch深度学习之核心小结
    目录一、Numpy实现网络二、Pytorch:Tensor三、自动求导1、PyTorch:Tensor和auto_grad总结Pytorch的核心是两个主要特征: 1.一个n维ten...
    99+
    2024-04-02
  • python 进阶学习之python装饰器小结
    装饰器总结 什么是装饰器?处理函数的函数,加一个功能,但是不影响原来函数的内部结构生活中的例子:给手机加一个外壳,外壳保护了手机 装饰器有什么用?增强函数的功能 装饰器使用场景增加被...
    99+
    2024-04-02
  • Rust个人学习小结之Rust的循环
    目录今天主要了解了Rust语言的3种循环方法: loop、while、for。 首先聊聊loop,loop的主要作用是循环某段代码段,使用方法如下 fn main() { l...
    99+
    2023-01-09
    Rust的循环 Rust循环
  • Mongodb学习总结
    Mongodb相关操作总结 2020/4/2 Mongodb使用的是类似与json字符串的形式存储数据 [ { key:value }, { key:value }, ] Mongodb使用了不存在的对...
    99+
    2019-08-19
    Mongodb学习总结
  • mysqlimport学习总结
    原文链接: https://www.modb.pro/db/23208xy 摘要:mysqlimport是MySQL数据库提供的一个命令行程序,可用于数据导入。...
    99+
    2024-04-02
  • WorkFlow学习总结
     最近在工作中要实现一种“流程审批”的功能,查阅资料得知,workFlow技术可以满足我的需求,于是就开始沉下心来好好学习一下这门技术。总结的学习资料也拿出来和大家共享一下。  什么是工作流: 工作流...
    99+
    2023-06-05
  • mysql学习总结(一)
        作为一名小白,今天开始上传自己的学习总结。 ...
    99+
    2016-11-21
    mysql学习总结(一)
  • python 学习总结4
    数字类型及操作 一、整数类型   (1)python中的整数与数学中的概念是一致的,可以正也可以负,没有取值范围。        pow(x,y)函数是计算x的y次幂,想计算多大就多大。   (2)在整数类型中有四种进制形式      十...
    99+
    2023-01-30
    python
  • python 学习总结5
    字符串类型及操作 一、字符串类型的表示   (1)字符串:由0个或多个字符组成的有序字符序列     例如:“请输入带有符号的温度值” 或者‘c’都是字符串   (2)字符串是字符的有序序列,可以对其中的字符进行索引     例如:“请”...
    99+
    2023-01-30
    python
  • python 学习总结1
    计算机与程序设计 一、计算机的概念   1.计算机是根据指令操作数据的设备。   2.计算机主要包括两个功能性一个是功能性另一个是计算性   功能性是对数据的操作,表现为数据计算,输入输出处理和结果存储   可编程性是根据一系列指令自动的...
    99+
    2023-01-30
    python
  • python 学习总结3
    Python蟒蛇绘制 一、实现程序如下 1 import turtle 2 turtle.setup (650, 350, 200, 200)#turtle的绘图窗体turtle.setup(width, height, start...
    99+
    2023-01-30
    python
  • python 学习总结2
    温度转换问题 一、温度转换   目前有两种表示温度的方法一种是摄氏度另一种是华氏度,摄氏度的结冰点为0度,沸点为100度将温度等分刻画,华氏度的结冰点为32度,沸点为212度将温度进行等刻度划分。   现需要将按格式输入的摄氏度转换为华氏...
    99+
    2023-01-30
    python
  • Python学习总结__Day1
    一、Python是一门什么类型语言 1、解释型:一边编译一边执行,劣势是运行速度慢,但通过运用PyPy交互解释器(JIT技术)会让python程序执行速度快很多。优势是可移植性强。 2、强类型:即类型安全类型。除非通过强制转换,否则变量类...
    99+
    2023-01-31
    Python
  • 函数学习总结
    定义 自己总结:就相当于现实中各种用途的工具,有着对数据进行各种处理的功能(实质就是比较复杂的变量?!) 分类  自定义函数和Python语言已经定义过的常用的内置函数 自定义函数的组成部分 def 函数名(参数1,参数2...): '...
    99+
    2023-01-31
    函数
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作