当前位置: 首页 > 工具软件 > real-token > 使用案例 >

验证token,X_FORWARDED_FOR ,集群,分布式

松国兴
2023-12-01

目录

自定义认证类,验证token

请求头中:X_FORWARDED_FOR 代之什么?

三种IP具体含义:

集群 ,分布式

集群

分布式

集群和分布式及其区别:


自定义认证类,验证token

import jwt
from rest_framework_jwt.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
# from rest_framework_jwt.authentication import JSONWebTokenAuthentication

from rest_framework_jwt.settings import api_settings


jwt_decode_handler = api_settings.JWT_DECODE_HANDLER
from .models import User



class Base(BaseAuthentication):
    def authenticate(self,request):
        token=request.META.get('HTTP_TOKEN')
        # 验证token是否合法,jwt模块下验证token的函数
        try:
            payload = jwt_decode_handler(token)
        except jwt.ExpiredSignature:
            raise AuthenticationFailed('token expired')
        except jwt.DecodeError:
            raise AuthenticationFailed('token decode error')
        except jwt.InvalidTokenError:
            raise AuthenticationFailed('errors')
        # 执行到这里说明token合法,payload可以使用
        user_id = payload.get('user_id')
        user = User.objects.filter(pk=user_id).first()
        return (user,token)




请求头中: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

可以看到,XFF 的内容由「英文逗号 + 空格」隔开的多个部分组成,最开始的是离服务端最远的设备 IP,然后是每一级代理设备的 IP。

如果一个 HTTP 请求到达服务器之前,经过了三个代理 Proxy1、Proxy2、Proxy3,IP 分别为 IP1、IP2、IP3,用户真实 IP 为 IP0,那么按照 XFF 标准,服务端最终会收到以下信息:
X-Forwarded-For: IP0, IP1, IP2

Proxy3 直连服务器,它会给 XFF 追加 IP2,表示它是在帮 Proxy2 转发请求。列表中并没有 IP3,IP3 可以在服务端通过 Remote Address 字段获得。我们知道 HTTP 连接基于 TCP 连接,HTTP 协议中没有 IP 的概念,Remote Address 来自 TCP 连接,表示与服务端建立 TCP 连接的设备 IP,在这个例子里就是 IP3。

Remote Address 无法伪造,因为建立 TCP 连接需要三次握手,如果伪造了源 IP,无法建立 TCP 连接,更不会有后面的 HTTP 请求。不同语言获取 Remote Address 的方式不一样,例如 php 是 $_SERVER["REMOTE_ADDR"],Node.js 是 req.connection.remoteAddress,但原理都一样。
 

三种IP具体含义:

Remote Address:他是TCP中的概念,是无法伪造的,在应用程序中获取到的Remote Address值,是直接和应用服务器建立TCP连接的IP,可能是用户真实ip(用户直接访问应用服务器时),也可能是代理服务器(通过nginx负载均衡代理时);
X-Real-IP:它不是标准规范,其值是与代理服务器建立TCP连接的IP,该值可能是真实ip,也可能是其他代理服务器IP;
X-Forwarded-For:它是http的一个标准规范,其值是X-Forwarded-For: client, proxy1, proxy2... 由于可以伪造,所以在一些安全场景下获取用户真实ip不可靠。

集群 ,分布式

集群

集群是指在几个服务器上部署相同的应用程序来分担客户端的请求。

它是同一个系统部署在不同的服务器上,比如一个登陆系统部署在不同的服务器上。

好比 多个人一起做同样的事。

集群主要的使用场景是为了分担请求的压力。

但是,当压力进一步增大的时候,可能在需要存储的部分,比如mysql无法面对大量的“写压力”。

因为在mysql做成集群之后,主要的写压力还是在master的机器上,其他slave机器无法分担写压力,这时,就引出了“分布式”。

分布式

分布式是指多个系统协同合作完成一个特定任务的系统。

它是不同的系统部署在不同的服务器上,服务器之间相互调用。

好比 多个人一起做不同的事。

分布式是解决中心化管理的问题,把所有的任务叠加到一个节点处理,太慢了。

所以把一个大问题拆分为多个小问题,并分别解决,最终协同合作。

分布式的主要工作是分解任务,把职能拆解。

分布式的主要应用场景是单台机器已经无法满足这种性能的要求,必须要融合多个节点,并且节点之间的相关部分是有交互的。

相当于在写mysql的时候,每个节点存储部分数据(分库分表),这就是分布式存储的由来。

存储一些非结构化数据:静态文件、图片、pdf、小视频 ... 这些也是分布式文件系统的由来。

集群和分布式及其区别:

分布式:把一个大业务拆分成多个子业务,每个子业务都是一套独立的系统,子业务之间相互协作最终完成整体的大业务。 

集群:把处理同一个业务的系统部署多个节点 。

把一套系统拆分成不同的子系统部署在不同服务器上,这叫分布式。

把多个相同的系统部署在不同的服务器上,这叫集群。部署在不同服务器上的相同系统必然要做“负载均衡”。 

集群主要是简单加机器解决问题,对于问题本身不做任何分解。

分布式处理里必然涉及任务分解与答案归并。分布式中的某个子任务节点,可以是一个集群,该集群中的任一节点都作为一个完整的任务出现。

集群和分布式都是由多个节点组成,但集群中各节点间基本不需要通信协调,而分布式中各个节点的通信协调是必不可少的。


 
    -同一个业务部署在多台机器上,提高系统可用性,称之为集群
    -同的业务模块部署在不同的服务器上或者同一个业务模块分拆多个子业务,部署在不同的服务器上称之为分布式
    -总结:
    分布式是指将不同的业务分布在不同的地方。 
    而集群指的是将几台服务器集中在一起,实现同一业务
    

 类似资料: