cookie,session,token,jwt,base64,drf-jwt

  • cookie,session,token

  • jwt原理介绍

  • base64编码和解码

  • drf-jwt快速使用

  • 自定义user表,签发token


cookie,session,token

session会话

  客户端A访问服务器,服务器存储A的数据value,把key返回给客户端A,客户端A下次带着key(session ID)来访问服务器,服务器就能给出客户端A的数据。如果负载均衡,

户端A访问了另一个服务器,那个服务器没有客户端A的数据

cookie

  客户端A访问服务器,服务器返回cookie给客户端A,客户端A存储cookie,下次需要带着cookie访问服务器,服务器返回相应的数据

token令牌

  token可以在浏览器,也可以在移动端

  客户端A访问服务器,服务器给了客户端token,客户端A拿着token访问服务器,服务器验证token,返回数据。

 

1.session和cookie区别:

  数据存放位置不同:Session数据是存在服务器中的,cookie数据存放在浏览器当中。

  安全程度不同:cookie放在服务器中不是很安全,session放在服务器中,相对安全。

  性能使用程度不同:session放在服务器上,访问增多会占用服务器的性能;考虑到减轻服务器性能方面,应使用cookie。

  数据存储大小不同:单个cookie保存的数据不能超过4K,session存储在服务端,根据服务器大小来定。

2.token和session区别:

  token是开发定义的,session是http协议规定的;

  token不一定存储,session存在服务器中;

  token可以跨域,session不可以跨域,它是与域名绑定的。

token: 三段式

    第一段:头:公司信息,加密方式。。。    {}

    第二段:荷载:真正的数据 {name:lqz,id:1}

    第三段:签名,通过第一段和第二段,通过某种加密方式加密得到的  aafasdfas

token的使用分两个阶段

  登录成功后的【签发token阶段】---》生成三段

  登录成功访问某个接口的 【验证阶段】---》验证token是否合法

cookie是:存在客户端浏览器的键值对
session是:存在于服务端的键值对
token是:三段式,服务端生成的,存放在客户端(浏览器就放在cookie中,移动端:存在移动端中)

注意:

  使用token的认证机制,服务端还要存数据吗? token是服务的生成,客户端保存,服务的不存储token

                                                             


jwt原理介绍

jwt是token的一种

Json web token (JWT), token的应用于web方向的称之为jwt

构成和工作原理

JWT就是一段字符串,由三段信息构成的,将这三段信息文本用.链接一起就构成了Jwt字符串。就像这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

	# header:头
    	-声明类型,这里是jwt
	    -声明加密的算法 通常直接使用 HMAC SHA256
        -公司信息
        由
        {
          'typ': 'JWT',
          'alg': 'HS256'
        }
        变成了(base64的编码)
        eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
    # payload:荷载
        exp: jwt的过期时间,这个过期时间必须要大于签发时间
        iat: jwt的签发时间
        用户信息: 用户信息
        由
        {
          "exp": "1234567890",
          "name": "John Doe",
          "userid": 3
        }
       变成了(base64的编码)
       eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
        
    # signature:签名
    	把头和荷载加密后得到的:TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

注意:

secret是保存在服务器端的(加密方式+盐),jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,
所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了

jwt使用流程最核心的是: 

   签发:登录接口签发
   认证:认证类认证

 


base64编码和解码

# base64 可以把字符串编码成base64的编码格式:(大小写字母,数字和 =)eyJzdWIiOiAiMTIzNDU2Nzg5MCIsICJuYW1lIjogImxxeiIsICJhZG1pbiI6IHRydWV9

# base64可以把base64编码的字符串,解码回原来的格式

# 应用场景:
	- jwt中使用
    - 网络中传输字符串就可以使用base64编码
    - 网络中传输图片,也可能使用base64的编码
    
    
# 编码解码


# 把图片保存起来看看
import json
import base64
d = {'name': 'lqz', 'userid': 6, 'age': 19}
info = json.dumps(d)
print(info)
# 把字符串使用base64编码
res=base64.b64encode(info.encode('utf-8'))
print(res)  # eyJuYW1lIjogImxxeiIsICJ1c2VyaWQiOiA2LCAiYWdlIjogMTl9


res=base64.b64decode(s)
with open('code.png','wb') as f:
    f.write(res)

 


drf-jwt快速使用  

# jwt:签发(登录接口) 认证(认证类)
# django中使用jwt
    https://github.com/jpadilla/django-rest-framework-jwt  (旧版本)
    https://github.com/jazzband/djangorestframework-simplejwt (新版本)
  
    
# 安装
	pip3 install djangorestframework-jwt
# 快速使用
	-直接迁移表,因为它默认使用auth的user表签发token
    	makemigrations  migrate
    -创建超级用户(auth的user表中要右记录)
    	createsuperuser
    -这样我们就不需要写登录接口了,如果是使用auth的user表作为用户表,它可以快速签发
    -签发(登录):只需要在路由中配置(因为它帮咱们写好登录接口了)
    
    from rest_framework_jwt.views import obtain_jwt_token
    urlpatterns = [
        path('login/', obtain_jwt_token),
    ]
    
    -认证(认证类):先导入,然后配置在视图类上
    	class TestView(APIView):
            authentication_classes = [JSONWebTokenAuthentication,]
            permission_classes = [IsAuthenticated,]
            
    -前端访问时,token需要放在请求头中
    	Authorization:jwt token串
    
drf之jwt修改返回格式
# 登录成功后,前端看到的格式是固定的,只有token,我们想做成如下格式
	{code:100,msg:'登录成功',token:adfasdfasdf}
    
    
# 有个固定写法:写一个函数,函数返回什么,前端就看到什么,配置在配置文件中

# 使用步骤:
	1 写一个函数
    def jwt_response_payload_handler(token, user=None, request=None):
        return {
            'code':100,
            'msg':'登录成功',
            'username':user.username,
            'token':token
        }
     2 把函数配置在配置文件中
        JWT_AUTH={
        'JWT_RESPONSE_PAYLOAD_HANDLER': 'app01.response.jwt_response_payload_handler',
    	}
        
 # 以后登录接口返回的格式就是咱们写的函数的返回值

集群的概念

集群是一组相互独立的、通过高速计算机网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。
一个客户与集群相互作用时,集群像是一个独立的服务器。

计算机集群简称集群是一种计算机系统, 它通过一组松散集成的计算机软件/硬件连接起来高度紧密地协作完成计算工作。
在某种意义上,他们可以被看作是一台计算机。集群系统中的单个计算机通常称为节点,通常通过局域网连接,但也有其它的可能连接方式。
集群计算机通常用来改进单个计算机的计算速度和/或可靠性。一般情况下集群计算机比单个计算机,比如工作站或超级计算机性能价格比要高得多。

自定义user表,签发token

# models.py 中定义UserInfo表

class UserInfo(models.Model):
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=32)

# 写一个登录接口
from rest_framework.exceptions import APIException

from rest_framework_jwt.settings import api_settings
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER


from .models import UserInfo
class UserView(APIView):
    def post(self, request):
        try:
            username = request.data.get('username')
            password = request.data.get('password')
            user=UserInfo.objects.get(username=username,password=password)
            # 根据user,签发token---》三部分:头,荷载,签名
            # 使用djagnorestframework-jwt模块提供的签发token的函数,生成token
            payload = jwt_payload_handler(user) # 通过user对象---》{username:lqz,id:1,过期时间}
            token=jwt_encode_handler(payload) # 根据payload---》得到token:头.荷载.签名
            print(payload)
            print(token)

            return Response({'code':100,'msg':'登录成功','token':token})
        except Exception as e:
            raise APIException('用户名或密码错误')

集群和分布式的区别

集群与分布式区别

集群:复制模式,每台机器做一样的事。

分布式:两台机器分工合作,每台机器做的不一样。

X_FORWARDED_FOR 的概念

通过名字就知道,X-Forwarded-For 是一个 HTTP 扩展头部。HTTP/1.1(RFC 2616)协议并没有对它的定义,它最开始是由 Squid 这个缓存代理软件引入,用来表示 HTTP 请求端真实 IP。如今它已经成为事实上的标准,被各大 HTTP 代理、负载均衡等转发服务广泛使用,并被写入 RFC 7239(Forwarded HTTP Extension)标准之中。

X-Forwarded-For 请求头格式非常简单,如下:
	X-Forwarded-For: client, proxy1, proxy2
posted @   没错,干就完了!  阅读(86)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示