点击上方蓝色“程序猿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 的安全基础相关推荐

  1. FreeMarker中文帮助手册API文档,基础入门学习文档

    FreeMarker中文帮助手册API文档,基础入门学习文档 分类: 编程技术 发布: bywei 浏览: 7 日期: 2011年5月28日 分享到: QQ空间 新浪微博 腾讯微博 人人网 什么是Fr ...

  2. ASP.NET Google Maps Javascript API V3 实战基础篇一获取和设置事件处理程序中的属性...

    ASP.NET Google Maps Javascript API V3 实战基础篇一获取和设置事件处理程序中的属性 <%@ Page Language="C#" Auto ...

  3. ASP.NET Google Maps Javascript API V3 实战基础篇一检测用户位置

    ASP.NET Google Maps Javascript API V3 实战基础篇一检测用户位置 对于一些基本的东西,google maps JavaScript api v3 文档已经讲解得足够 ...

  4. 【ASP.NET Core Web API 6.0 基础学习】

    ASP.NET Core Web API 6.0 基础学习 半夏创建Web Api 6.0教程 返回时间格式化 Swagger注释和版本控制 使用appsetting.json的数据 IOC注入,使用 ...

  5. API测试-接口测试基础

    目录 接口测试基础 1.什么是接口? 2.接口类型 3.接口本质 4.什么是接口测试? 5.为什么做接口测试? 6.怎样做接口测试? 7.接口测试的测试点是什么? 8.接口测试都要掌握哪些知识? 接口 ...

  6. API测试-接口测试基础(1)

    由于自己想学习API方面的测试,但是市面上搜不到相关的图书可以系统学习,网上的内容又零零散散,适合有点API开发基础的人去搜索.为了方面新手学习API测试,现在整理了他人的宝贵经验和自己的学习心得,尽 ...

  7. flash 绘图API:绘制基础的图形

    flash 的绘图API 函数是很强大的绘图工具,能够创建出很多神奇的效果.最近偶然发现了一些不错的程序,测试了一下感觉很有趣.这部分不算很难,主要懂借用他的命令,加上自己一点创意就能发挥出意想不到的 ...

  8. linux关于界面的API,linux系统基础知识(ABI和API)

    对于linux而言,我们首先要明确一个核心观念,linux从严格意义上来讲,就是一个内核(Kernel)这个内核就是位于计算机硬件之上,对于用户来说,我们要和计算机打交道,必须要通过CPU来分配指令, ...

  9. (三)JMockit API:@Mocked -基础篇

    @Mocked可以修饰一个类,接口等. 当@Mocked修饰一个类 import mockit.Mocked; import org.junit.Assert; import org.junit.Te ...

最新文章

  1. R语言构建文本分类模型:文本数据预处理、构建词袋模型(bag of words)、构建xgboost文本分类模型、xgboost模型预测推理并使用混淆矩阵评估模型、可视化模型预测的概率分布
  2. python svm超参数_grid search 超参数寻优
  3. python求平均成绩 输入用空格分隔的两个代码_在Python2.7中,如何计算以空格分隔的多个输入?...
  4. Java竞选组长发言_竞选组长的发言稿_450字
  5. 动态规划-背包是否装满
  6. 计组之中央处理器:2、指令周期数据流(指令周期、机器周期、时钟周期、取指周期、间址周期、执行周期、中断周期、单指令周期、多指令周期、流水线方案)
  7. angular 自定义组件_如何创建Angular 6自定义元素和Web组件
  8. maven引入hadoop_如何在maven中引用hadoop v2.3.0 jar?
  9. oracle form lov 查询慢
  10. 阿衰小冲用计算机,《阿衰漫画》小衰学电脑,差点扔进垃圾桶,ESC怎么没有作用?...
  11. vim配置Nerdtree
  12. 专业版谷歌地球地图永久版带手机版App
  13. Lancet Neurology:长期意识障碍的干预治疗
  14. 多媒体-windows自带录音机录音中时间限制的解决方案
  15. 计算机与网络之间是红叉,雨林木风win7系统网络连接出现红叉无法上网的解决办法...
  16. No changes detected报错解决方案
  17. 耦合(六种)与 内聚(七种)—《软件工程与计算》笔记
  18. 机器学习-Sklearn-13(回归类大家族-下——非线性问题:多项式回归(多项式变换后形成新特征矩阵))
  19. 如何创作一款商业级的安卓独立应用
  20. 复合继承关系下的构造和析构

热门文章

  1. python3 missing 1 required positional argument 错误
  2. OBJECT_METHOD初窥
  3. Win7最高权限问题
  4. Android点击Button实现功能的几种方法
  5. VC维的来龙去脉(转)
  6. P2P网络中DHT算法分析
  7. 负载均衡Load Balance学习
  8. C Capture Full IE Document
  9. binder IPC TRANSACTION过程分析(BC_TRANSACTION-Binder Driver)
  10. 手动生成token_手动设计简单的Token验证