如何提高API接口的性能和设计安全可靠的API

如何提高API接口的性能

下图显示了提高 API 性能的 5 种常见技巧。

分页

这是在结果集较大时常用的优化方法。结果会以流式方式传回客户端,以提高服务响应速度。

异步日志

同步日志每次调用都要处理磁盘,会降低系统速度。异步日志会先将日志发送到无锁缓冲区,然后立即返回。日志会定期刷新到磁盘,这大大减少了 I/O 开销。

缓存

我们可以将经常访问的数据缓存到缓存中。客户端先查询缓存,而不是直接访问数据库。如果出现缓存缺失,客户端可以从数据库中查询。Redis 等缓存将数据存储在内存中,因此数据访问速度比数据库快得多。

Payload 压缩

可以使用 gzip 等对请求和响应进行压缩,从而大大缩小传输数据的大小。这可以加快上传和下载速度。

连接池

访问资源时,我们经常需要从数据库加载数据。打开和关闭数据库连接会增加大量开销。因此,我们应该通过一个开放连接池来连接数据库。连接池负责管理连接的生命周期。

如何设计安全可靠的API ?

① 使用 HTTPS

  • 数据加密:HTTPS 对客户端和服务器之间传输的数据进行加密。它使用 TLS 或其前身 SSL 对通信进行加密。这种加密可确保用户数据、身份验证等敏感信息在传输过程中保持安全。如果没有 HTTPS,这些信息可能会被数据包嗅探等技术截获。

  • 合规要求:许多监管标准,如 GDPR 和 PCI DSS,都要求使用 HTTPS 来保护用户的敏感信息。

  • SEO 要求:谷歌等搜索引擎会优先考虑支持 HTTPS 的网站和应用程序接口,认为它们更安全。

② 使用 OAuth 2.0

OAuth 2.0 对设计安全可靠的 API 至关重要,因为它能够在不共享用户凭证的情况下使用代理来访问资源。它还支持跨多个应用程序和服务的集成,促进了单点登录(SSO),允许用户进行一次身份验证来无缝访问多个服务或应用程序。

③ 使用 WebAuthn

WebAuthn 不依赖于集中式服务器或密码数据库。它允许用户注册和使用自己的设备(如安全密钥或生物特征识别设备)进行身份验证,消除仅依赖密码的弱点。通过实现 WebAuthn,API 可以符合 FIDO 等安全标准,满足合规要求。

④ 使用分级 API Key

我们通常要针对系统开放的服务接口设计不同的访问权限。分级的 API Key 可以提供细粒度的访问控制。比如,在使用 Stripe 时,我们可以给“访问账户”指定一个只读 API Key,给“操作账户”指定另一个 API Key。

⑤ 授权

这一条和上一条相关。我们需要给系统内部的各种 API 接口设计访问授权,遵循“最小权限”原则

⑥ 限流

在设计 API 时,需要估计大致容量,并针对容量来限流,从而保护系统。限流的好处有很多,比如防止 DDos 攻击,防止系统过载,合理分配系统资源等。

⑦ 版本控制

API 版本控制提供了一种结构化的 API 生命周期管理方法,将 API 的管理提升到代码一个级别,同时确保向后兼容性。它使开发人员能够引入新功能而不会破坏用户对于旧版本的依赖。

⑧ 白名单

白名单指定并仅允许预先批准的 IP 地址或用户访问 API。这有助于防止常见的安全威胁,如未经授权的访问、数据泄露、注入攻击等。它提高了潜在攻击者的门槛。

⑨ 定期检查 OWASP API 安全风险清单

The OWASP API Security Top 10 是由 OWASP(Open Web Application Security Project)编制的清单,该组织致力于提高软件安全性。该清单特别突出了与 API 相关的最关键安全风险,旨在提高开发人员、安全专业人员和组织对 API 相关漏洞和威胁的意识,并提供指导,以有效解决这些问题。

⑩ 使用 API 网关

API 网关作为入站 API 请求的集中入口点。它们能够实施诸如身份验证、授权、加密和威胁防护等安全措施。这种集中化能够在所有 API 中应用一致的安全策略。

11 错误处理

有效的错误处理机制使 API 能够优雅地处理意外情况或故障,确保错误得到适当地传达给客户端,提供更好的用户体验。确保返回给客户端的错误消息不会暴露 API 内部运作或基础架构的敏感信息。

12 输入验证

无效或格式不正确的输入数据可能导致数据丢失、损坏或系统崩溃。输入验证在设计安全可靠的 API 中至关重要,有助于防止常见的攻击,如 SQL 注入、NoSQL 注入和其他基于注入的漏洞。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/449765.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣226.翻转二叉树(二叉树的先序遍历)

文章目录 题目描述思路复杂度Code 题目描述 思路 利用二叉树的先序遍历,每次递归遍历时将当前节点的左右子节点交换即可 复杂度 时间复杂度: O ( n ) O(n) O(n);其中 n n n为树节点的个数 空间复杂度: O ( h e i g h ) O(heigh) O(heigh);其…

任务执行中拖延的认知神经机制

任务执行中拖延的认知神经机制 引言 虽然动机的产生往往是人们行动的前提(Ajzen, 2011;林琳&白新文,2014),但动机的产生却并不必然地导致随后的行为(Rhodes&deBruijn,2013;Sniehotta, Scho1z, & Schwarzer, 2005)。动机向行为的转换依赖于一系列自我控…

北京市行政村边界shp数据/北京市乡镇边界/北京市土地利用分类数据

北京是一座有着三千多年历史的古都,在不同的朝代有着不同的称谓,大致算起来有二十多个别称。北京地势西北高、东南低。西部、北部和东北部三面环山,东南部是一片缓缓向渤海倾斜的平原。境内流经的主要河流有:永定河、潮白河、北运…

Ollama 只安装 Ollama,本地快速部署谷歌开源大模型Gemma(基于Ollama)

参考:本地快速部署谷歌开源大模型Gemma(基于Ollama) - 知乎 确保系统更新: Bash sudo apt update && sudo apt upgrade 需要先下载Ollama,版本要求0.1.26及以上 运行curl -fsSL https://ollama.com/install.sh | sh 监听 Ollama API 接…

常见的限流算法- python版本

shigen坚持更新文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 个人IP:shigen 在系统的稳定性设计中,需要考虑到的就是限流,避免高并发…

【VUe】简略学习 vue

Vue 是一套用于构建用户界面的渐进式框架。要想使用这个框架,就需要先在页面中引用: 如何使用: 来到控制台: 数据绑定 若要在标签里替换,就需要使用 v-bind 指令了: 在标签里(尖括号里&#xf…

数据库insert详细用法

数据库版本:KingbaseES V008R006C008B0014 简介 INSERT 语句用于将数据插入表中,向指定表格添加1行或多行数据,本篇文章主要以kingbase介绍insert的一些技巧。 文章目录如下 1. 基本语法 2. 实用技巧 2.1. 插入其他表数据 2.2. 快速插入万…

【力扣hot100】刷题笔记Day25

前言 这几天搞工作处理数据真是类似我也,还被老板打电话push压力有点大的,还好搞的差不多了,明天再汇报,赶紧偷闲再刷几道题(可恶,被打破连更记录了)这几天刷的是动态规划,由于很成…

HTML5七天学会基础动画网页10(2)

制作立方体 学完前面的基础内容&#xff0c;制作立方体是个不错的练习方法&#xff0c;先看成品 再分析一下&#xff0c;六个面让每个面旋转平移就可以实现一个立方体&#xff0c;来看代码: <title> 制作立方体</title> <style> *{ margin: 0; padding: 0; …

鸿蒙开发:从入门到精通的全方位学习指南

随着华为鸿蒙HarmonyOS生态系统的迅速扩展&#xff0c;越来越多的开发者渴望深入了解并掌握这一前沿技术。本文旨在为鸿蒙开发新手提供一份详尽且实用的学习教程&#xff0c;助您从零开始&#xff0c;逐步迈向鸿蒙开发的巅峰。 一、鸿蒙开发环境搭建 DevEco Studio安装&#x…

C语言--- 指针运算笔试题详解

目录 题目1&#xff1a; 题目2&#xff1a; 题目3&#xff1a; 题目4&#xff1a; 题目5&#xff1a; 题目6&#xff1a; 题目7&#xff1a; 题目1&#xff1a; #include <stdio.h> int main() {int a[5] { 1, 2, 3, 4, 5 };int *ptr (int *)(&a 1);print…

Open3D 利用四个点计算球心和半径 (28)

Open3D 利用四个点计算球心和半径 (28) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 给定的四个点坐标,计算球心和半径,提供验证的四个点来比较最终的结果是否准确。 二、算法实现 1.代码 代码如下(示例): import numpy as npdef calculate_sphere_center_…

课时61:流程控制_if条件控制_嵌套if实践

2.2.3 嵌套if实践 学习目标 这一节&#xff0c;我们从 基础知识、简单实践、小结 三个方面来学习。 基础知识 简介 一个if语句仅仅能够针对一个场景的多种情况。当我们面对多场景的条件判断的时候&#xff0c;一个if结构语句无法满足需求&#xff0c;这个时候&#xff0c;我…

海格里斯HEGERLS智能托盘四向车系统为物流仓储自动化升级提供新答案

随着实体企业面临需求多样化、订单履行实时化、商业模式加速迭代等挑战&#xff0c;客户对物流仓储解决方案的需求也逐渐趋向于柔性化、智能化。作为近十年来发展起来的新型智能仓储设备&#xff0c;四向车系统正是弥补了先前托盘搬运领域柔性解决方案的空白。随着小车本体设计…

【AI】如何创建自己的自定义ChatGPT

如何创建自己的自定义ChatGPT 目录 如何创建自己的自定义ChatGPT大型语言模型(LLM)GPT模型ChatGPTOpenAI APILlamaIndexLangChain参考推荐超级课程: Docker快速入门到精通Kubernetes入门到大师通关课本文将记录如何使用OpenAI GPT-3.5模型、LlamaIndex和LangChain创建自己的…

Grunt、Gulp 与 webpack:谁更胜一筹?

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

PWM驱动智能小车舵机运动

文章目录 一、硬件电路二、舵机初始化三、舵机控制 一、硬件电路 通过TIMER3的通道3提供PWM驱动电机 二、舵机初始化 初始化让舵机位于最左边&#xff0c;也就是0。 static int ServoInit(struct Servo *ptdev){if(NULL ptdev){LogDebug("ServoInit EINVAL \r\n&qu…

力扣题目训练(19)

2024年2月12日力扣题目训练 2024年2月12日力扣题目训练575. 分糖果589. N 叉树的前序遍历590. N 叉树的后序遍历275. H 指数 II279. 完全平方数132. 分割回文串 II 2024年2月12日力扣题目训练 2024年2月12日第十九天编程训练&#xff0c;今天主要是进行一些题训练&#xff0c;…

蓝桥杯刷题7

目录 1. 字母数 2. 列名 3. 大乘积 4. 最大连通 5. 星期几 1. 字母数 public class Main {public static void main(String[] args) {int num 2023;while(true) {String mInteger.toString(num,16);if(m.matches("^[a-f]$")){System.out.println(num);break;}n…

人生旅途:清理过往,规划未来,松弛前行

在人生的道路上&#xff0c;我们时常会遭遇各种障碍和挑战。这些障碍可能来自于外界环境的压力&#xff0c;也可能来自于内心的困惑和迷茫。然而&#xff0c;正是这些障碍和挑战&#xff0c;塑造了我们的性格&#xff0c;让我们变得更加坚强和成熟。当我们清理完上一段的障碍后…