当前位置: 首页 > news >正文

REST介绍,实质,六大约束,优缺点(数据冗余问题,身份验证困难(解决方式 -- JWT+集中式认证服务,使用代理))

目录

REST

介绍

实质

六大约束

客户端 - 服务器(Client-Server)

无状态(Stateless)

可缓存(Cacheable)

统一接口(Uniform Interface)

分层系统(Layered System)

按需代码(Code on Demand)

优点

可复用性

缺点

数据冗余

身份验证困难

引入

性能问题

JWT+集中式认证服务

JWT

介绍

是否保证无状态

使用代理

介绍

信任代理

网关认证逻辑

是否保证无状态


REST

介绍

REST是缩写,全称是(Resource) Representational State Transfer

  • 意思是:资源在网络中以某种表现形式进行状态转移
  • Resource:资源,即数据 -- REST的核心理念,一切皆资源 (每个资源通过一个唯一的 URL 标识)
  • Representational:某种表现形式(JSON,XML,JPEG等),都是可协商的(不同端都可解析)
  • State Transfer:状态变化 -- 通过HTTP的动词(get查询、post新增、put修改、delete删除)等实现,其中http是最常用的实现方式

它不是具体的协议或标准,而是一组设计原则,用来构建 可扩展、可维护的分布式系统 —— 尤其是 Web API

实质

REST = 用 URL 定位资源,用 HTTP 方法定义操作,用状态码表达结果,用 JSON/其他 传输数据

六大约束

客户端 - 服务器(Client-Server)

职责分离,客户端负责界面与交互,服务器负责数据与逻辑

无状态(Stateless)

每次请求都是独立的 -- 服务端不记得上一个请求+每个请求都能独立完成+服务器根据请求中的全部信息作出响应

  • 所有状态信息应由客户端在每次请求中携带
  • 服务器不在内存中保留客户端会话状态

可缓存(Cacheable)

REST系统需要可以缓存请求,以提高效率与性能

  • 在服务器响应中指明是否可缓存

统一接口(Uniform Interface)

客户端与服务器之间应该依赖统一、标准化的交互接口,从而降低耦合

  • 接口条件在上面的[实质]中有介绍

分层系统(Layered System)

架构可以由分层组成(负载均衡、缓存层、网关、代理、后端服务),客户端不必知道它与最终服务器之间中间有哪些层

  • 但也要保证可观测性(添加日志等)

按需代码(Code on Demand)

服务器可向客户端传输可执行代码(如 JavaScript),以扩展客户端功能

  • 非必须

而满足了以上条件设计的 Web 服务,就是RESTful

  • 其中,严格遵循 REST 设计原则的系统称为 RESTful 系统
  • 而遵循部分原则但核心思想一致的,也可称为 REST-like 或 REST-style 系统

优点

其中,重点说说可复用性

可复用性

后端处理数据后需要发给客户端,如果有多种客户端(web,ios,android):

传统接口设计中,需要为不同客户端定义不同请求/返回格式,并且配套写多种处理逻辑

使用 REST 之后,就几乎可以做到“一套接口通吃所有客户端”

其中:

  • REST 规定所有通信都使用 HTTP 协议(跨平台通用协议,不依赖具体框架)
  • 统一使用url定位资源,不管谁来访问,都是一样的
  • 返回的json数据可以被各种端解析
  • 无状态使得不同客户端的请求不会相互影响,服务器只关心“请求内容”,不关心是谁发来的

缺点

数据冗余

因为REST是面向资源的,请求/响应返回的数据粒度也自然是资源级,而不是字段级

  • 所以如果要获取某个用户的某个信息,发送的url也只会是定位的整个用户资源,而不是其中一个信息
  • 那么返回的也是完整的用户对象
  • 这就会造成数据冗余

身份验证困难

引入

在现有的基于http的web服务中,一般使用会话来管理用户状态,那么服务端内部就需要维护用户的登录状态

  • REST的无状态约束却不希望这样
  • 因为REST的优势就在于横向扩展性,不同端发送的请求可能被REST服务集群中的任意服务器处理
  • 那么由服务端维护状态,显然就不现实
性能问题

于是,REST架构最纯粹的解决方式就是 -- 由客户端每次带上需要的用户信息,服务器根据这些信息验证权限后,才能处理请求

  • 但是每次请求都要身份验证 + 现代系统使用复杂的哈希算法保证安全,使得登录验证变成一个重操作,影响高并发性能

所以,通过把认证开销“做一次或者集中做”来提高整体吞吐与响应速度

JWT+集中式认证服务

系统中设置一个独立的认证服务,用户首次登录时验证用户名和密码,通过后该服务生成一个凭证,后续请求皆携带该凭证,后端通过验签确认身份

JWT

JWT(JSON Web Token),自包含的数字凭证

介绍

Auth Server 使用私钥签发短周期 access token(含 user_id、roles、exp),客户端保存并每次请求带上该token,后端使用公钥本地验签并读取用户信息

  • Auth Server 签发JWT本身不需要状态 -- 因为不需要保存token,客户端下次请求时,Auth Server只要验证签名正确且未过期,就能确定用户身份
  • 缺点:一旦签发出去,就在有效期内始终有效,如果被盗,攻击者可以在有效期内任意使用
是否保证无状态

服务端处理请求时,只需验证 token 签名,不需要访问其他,所以是无状态的

  • 但现实系统通常会为了安全或功能需求引入一点“状态性”

使用长期refresh_token(用来刷新新的access_token) + 短期JWT(访问资源用)的形式,来增强系统安全性

  • 频繁使用的access_token即使被盗,也会很快过期,暴露风险就降低了
  • 但是认证服务需要存储refresh_token,存在轻量状态

使用代理
介绍

认证全部集中在网关入口,在转发时注入内部header(包含用户信息),后端服务信任[经过网关的请求],直接读取header即可进行业务处理

  • 这样后端可以不做验签或查缓存,省去重复开销
  • 由网关保存用户的登录状态
信任代理

如何做到信任代理呢?

  • “信任”是需要手动配置的 -- 后端不能自动信任任何header,必须配置网关来源验证机制
网关认证逻辑

其中,网关认证逻辑可以有两种

是否保证无状态

  • 业务后端确实无状态,但整体来看还是有轻微状态

http://www.dtcms.com/a/523738.html

相关文章:

  • Snapchat Data Scientist 面试经验分享|从 OA 到 Final Round 全流程复盘
  • 消息队列集群——RabbitMQ
  • 初识C语言14.动态内存管理
  • ks2e做网站高端品牌设计
  • 华为od-22届考研-C++面经
  • Win10 系统构建仿真 NVIDIA Jetson Orin Nano 环境部署 YOLOv8 模型
  • 英文网站开发付费下插件wordpress
  • 【面板数据】汽车之家及懂车帝汽车配置信息数据集(1999-2025.4)
  • Slotted Aloha
  • 「赤兔」Chitu 框架深度解读(六):剖析 Attention 机制后端实
  • 嵌入式开发中为啥常用do{}while(0)进行宏定义
  • 第六部分:VTK进阶(第172章 vtk-m加速器管线)
  • 矽塔 SA8207 36V输入耐压 高精度可调过流保护与集成智能故障管理 过压过流保护芯片
  • 关键词优化公司网站怎么做网站后台界面
  • 从「Bug 制造机」到「问题解决者」的进化之路
  • 华为新一代鸿蒙操作系统实现与苹果互联
  • 常用 apt 命令及语法(Ubuntu)
  • 华为 AI,建造中的全景图
  • 第二十九篇:动态规划(一):基础与背包问题
  • 深度学习中的训练流程:从输入到权重更新的完整旅程
  • QT------QPainter::save() 和 QPainter::restore() 的使用方法和作用。
  • http trailer 与 http2
  • 有没有会计做兼职的网站wordpress获取文章
  • 中国人在国外做网站网站代理网站群建设 会议 主持
  • 在Ubuntu Linux安装brew 使用brew安装llama.cpp 运行文心Ernie大模型
  • 基于MATLAB/Simulink的风光储联合系统经M3C接入电网的低电压穿越仿真研究
  • CNCF Kepler与MCP:开启云原生绿色计算的人机协作新纪元
  • 昇腾NPU部署GPT-OSS-20B混合专家模型:从环境配置到性能优化的完整实践指南
  • java8中的‘+‘的使用注意事项
  • 德国莱茵金属公司使用Varjo XR-4创建虚拟现实培训解决方案