REST API 的安全基础
点击上方蓝色“程序猿DD”,选择“设为星标”
回复“资源”获取独家整理的学习资料!
作者 | 魔王不造反
来源 | https://blog.biezhi.me/2019/01/rest-security-basics.html
10万开发者都知道的部署方式,你居然不知道!?内含悬赏活动
REST 是一种现代架构风格,它定义了一种设计 Web 服务的新方法。和之前的 HTTP 以及 SOA 不同,它不是一个协议(即:一套严格的规则),而是一些关于 Web 服务应该如何相互通信的一些建议和最佳实践。按照 REST 最佳实践开发的服务被称为 “RESTful Web 服务”。
安全性是 RESTful 服务的基石。启用它的方法之一是尽可能内置用户身份验证和授权机制。
在 RESTful 服务中实现用户身份验证和授权的方法有很多。我们今天要讲的主要方法(或标准)有:
Basic 认证
OAuth 2.0
OAuth 2.0 + JWT
为了让我们的讨论更加具体,假设我们的后端程序有微服务,并且每个用户请求时,必须调用后端的几个服务来返回请求的数据。所以,我们将不仅从安全性问题方面,而且在它们产生的额外流量和服务器负载的背景下检查每个标准。下面开始吧…
Basic 认证
最古老也是最简单的标准。
看起来像: 用户名 + 密码 + Base64(对用户名和密码做哈希的基础算法)。
工作原理:加入有人尝试登录用户的 Fackbook 账户,去访问他的消息、历史记录、群组信息,这些都是独立的服务。当用户输入用户名和密码后,系统会允许登录。但是,默认情况下,系统不知道用户的角色和权限是什么,他们可以访问哪些服务等等。
所以每次用户尝试访问任何一个服务的时候,系统都应该再次验证是否允许执行这个操作,这意味着需要对身份验证进行额外的调用。就我们的示例中有四个服务而言,在这种情况下,每个用户将有四个额外的调用。
现在假设每秒有 3k 个请求,在 Facebook 的系统中每秒 300k 请求更现实。将这请求乘以四,结果是每秒要向服务器发出 12k 次调用。
总结:可伸缩性差,大量的额外流量(额外调用)没有带来业务价值,服务器的负载很大。
OAuth 2.0
看起来像:用户名 + 密码 + 访问令牌 + 过期令牌
工作原理:OAuth 2.0 标准的核心思想是,用户使用用户名和密码登录系统后,客户端(用户访问系统的设备)会收到一对令牌,这是一个访问权限令牌和刷新令牌。
访问令牌用于访问系统中的所有服务。到期后,系统使用刷新令牌生成一对新的令牌。所以,如果用户每天都进入系统,令牌也会每天更新,不需要每次都用用户名和密码登录系统。刷新令牌也有它的过期时间(虽然它比访问令牌长得多),如果一个用户一年没有进入系统,那么很可能会被要求再次输入用户名和密码。
OAuth 2.0 标准取代了基本的身份验证方法,它具有一定的优势,例如用户每次想要进入系统时不用输入用户名和密码。但是,系统仍然需要调用身份验证服务器,就像使用基本身份验证方法时一样,以检查拥有该令牌的用户有权限做什么。
假设有效期是一天。这意味着登录服务器上的负载要少得多,因为用户每天只需要输入一次凭证,而不是每次都要进入系统。但是,系统仍需要验证每个令牌并检查用户角色的存储状态。所以我们最终还要调用身份验证服务器。
总结:和 Basic 验证有相同的问题 - 可伸缩性差,身份验证服务器负载较高。
OAuth2 + JSON Web 令牌
看起来像:用户名 + 密码 + JSON数据 + Base64 + 私钥 + 到期日期
工作原理:当用户第一次使用用户名和密码登录系统时,系统不仅会返回一个访问令牌(只是一个字符串),而是一个包含所有用户信息的 JSON 对象,比如角色和权限,使用 Base64 进行编码并使用私钥签名。下图是它在没有编码的情况下的样子:
看起来很可怕,但这确实有效!主要区别在于我们可以在令牌中存储状态,而服务保持无状态。这意味着用户自己拥有自己的信息,不需要额外的调用来检查它,因为所有的内容都在令牌里。这对于减少服务器负载方面是一个很大的优势。这个标准在世界范围内得到广泛应用。
总结:良好的可伸缩性,可以和微服务一起工作。
新玩意:亚马逊签名方式
一种全新的,奇特的方法,称为 HTTP 签名,亚马逊是目前使用它的大厂之一。
它的思路是,当你创建亚马逊帐户的时候,会生成一个永久的、非常安全的访问令牌,你要非常小心地存储起来并且不要给任何人显示。当你要从 Amazon 请求某些资源时,你可以获取到所有相关的 http 头信息,使用这个私钥对其进行签名,然后将签名的字符串作为 header 发送。
在服务器端,亚马逊也有你的访问密钥。它们接下来做什么?只需要使用你的 http 头信息和这个密钥进行签名。然后将签名字符串和你作为签名的字符串进行比较;如果相同那么就知道你是谁。
最大的好处是你只需要发送一次用户名和密码 - 就可以获得令牌。至于使用私钥签名的 header 信息,基本上没有机会对它们进行编码。就算有人截获了信息——谁在乎呢 ;)
英文原文:https://yellow.systems/blog/rest-security-basics
本文通过OpenWrite的Markdown转换工具发布
关注我,回复“加群”加入各种主题讨论群
一条简单的更新语句,MySQL是如何加锁的?
IntelliJ 平台 2020 年路线图
解决Maven依赖冲突的好帮手,必须了解一下!
使用Redis实现在线点赞系统
前端项目如何用eslint提高代码质量
通过这12张手绘图,搞懂什么是微服务架构
点击“阅读原文”免费领取价值199元学习大礼包
REST API 的安全基础相关推荐
- FreeMarker中文帮助手册API文档,基础入门学习文档
FreeMarker中文帮助手册API文档,基础入门学习文档 分类: 编程技术 发布: bywei 浏览: 7 日期: 2011年5月28日 分享到: QQ空间 新浪微博 腾讯微博 人人网 什么是Fr ...
- ASP.NET Google Maps Javascript API V3 实战基础篇一获取和设置事件处理程序中的属性...
ASP.NET Google Maps Javascript API V3 实战基础篇一获取和设置事件处理程序中的属性 <%@ Page Language="C#" Auto ...
- ASP.NET Google Maps Javascript API V3 实战基础篇一检测用户位置
ASP.NET Google Maps Javascript API V3 实战基础篇一检测用户位置 对于一些基本的东西,google maps JavaScript api v3 文档已经讲解得足够 ...
- 【ASP.NET Core Web API 6.0 基础学习】
ASP.NET Core Web API 6.0 基础学习 半夏创建Web Api 6.0教程 返回时间格式化 Swagger注释和版本控制 使用appsetting.json的数据 IOC注入,使用 ...
- API测试-接口测试基础
目录 接口测试基础 1.什么是接口? 2.接口类型 3.接口本质 4.什么是接口测试? 5.为什么做接口测试? 6.怎样做接口测试? 7.接口测试的测试点是什么? 8.接口测试都要掌握哪些知识? 接口 ...
- API测试-接口测试基础(1)
由于自己想学习API方面的测试,但是市面上搜不到相关的图书可以系统学习,网上的内容又零零散散,适合有点API开发基础的人去搜索.为了方面新手学习API测试,现在整理了他人的宝贵经验和自己的学习心得,尽 ...
- flash 绘图API:绘制基础的图形
flash 的绘图API 函数是很强大的绘图工具,能够创建出很多神奇的效果.最近偶然发现了一些不错的程序,测试了一下感觉很有趣.这部分不算很难,主要懂借用他的命令,加上自己一点创意就能发挥出意想不到的 ...
- linux关于界面的API,linux系统基础知识(ABI和API)
对于linux而言,我们首先要明确一个核心观念,linux从严格意义上来讲,就是一个内核(Kernel)这个内核就是位于计算机硬件之上,对于用户来说,我们要和计算机打交道,必须要通过CPU来分配指令, ...
- (三)JMockit API:@Mocked -基础篇
@Mocked可以修饰一个类,接口等. 当@Mocked修饰一个类 import mockit.Mocked; import org.junit.Assert; import org.junit.Te ...
最新文章
- R语言构建文本分类模型:文本数据预处理、构建词袋模型(bag of words)、构建xgboost文本分类模型、xgboost模型预测推理并使用混淆矩阵评估模型、可视化模型预测的概率分布
- python svm超参数_grid search 超参数寻优
- python求平均成绩 输入用空格分隔的两个代码_在Python2.7中,如何计算以空格分隔的多个输入?...
- Java竞选组长发言_竞选组长的发言稿_450字
- 动态规划-背包是否装满
- 计组之中央处理器:2、指令周期数据流(指令周期、机器周期、时钟周期、取指周期、间址周期、执行周期、中断周期、单指令周期、多指令周期、流水线方案)
- angular 自定义组件_如何创建Angular 6自定义元素和Web组件
- maven引入hadoop_如何在maven中引用hadoop v2.3.0 jar?
- oracle form lov 查询慢
- 阿衰小冲用计算机,《阿衰漫画》小衰学电脑,差点扔进垃圾桶,ESC怎么没有作用?...
- vim配置Nerdtree
- 专业版谷歌地球地图永久版带手机版App
- Lancet Neurology:长期意识障碍的干预治疗
- 多媒体-windows自带录音机录音中时间限制的解决方案
- 计算机与网络之间是红叉,雨林木风win7系统网络连接出现红叉无法上网的解决办法...
- No changes detected报错解决方案
- 耦合(六种)与 内聚(七种)—《软件工程与计算》笔记
- 机器学习-Sklearn-13(回归类大家族-下——非线性问题:多项式回归(多项式变换后形成新特征矩阵))
- 如何创作一款商业级的安卓独立应用
- 复合继承关系下的构造和析构