安全是 RESTful web service 的基石,我们主要讨论以下3种主要的方法:

  • Basic authentication
  • Oauth 2.0
  • Oauth 2.0 + JWT

1. Basic authentication

这是最古老、最简单的方法。

形式

username + password + Base64。

工作机制

假设一个用户要登录 Facebook 账号,查看:feed 流、消息、好友、组,这4个服务都是独立的。

用户提交用户名密码之后,系统验证后允许进入,然而系统是不知道其角色和权限的,例如什么服务允许访问。

所以,每次用户访问任何服务时,系统需要再次验证是否允许此次操作,这意味着需要一次对授权服务器的额外调用。例如上面的4个服务,那么每个用户就会有4次额外调用。

现在想象每秒我们有 3000 个用户访问,乘以4个服务,结果就是每秒 12000 次授权服务器调用。

结论

可扩展性差,有大量的没有商业价值的额外调用,显著增加了服务器的压力。

2. Oauth 2.0

形式

username + password + access token + expiration token

工作机制

用户使用用户名密码登录系统之后,会收到一对 token,一个 access token 和一个 refresh token。

access token 用于访问所有服务,过期时,使用 refresh token 产生一对新的 token。

如果一个用户每天都进入系统,token 会每天更新,不必每次使用用户名密码登录。

refresh token 也有过期周期,过期后需要再次使用用户名密码登录。

Oauth 2.0 用来替换 Basic authentication,有其明显的优势,例如用户不必每次都提交用户名密码,然而,系统仍然需要调用授权服务器,来检查 token 所属用户能做的操作。

假设过期时间是一天,可以大大减少登录服务器的负载,因为一个用户一天只需要登录验证一次,而不是每次进入系统时都需要。

但是,系统仍然需要去存储状态的地方去验证每个 token,查看用户的角色。

所以,最后还是需要多次调用授权服务器。

结论

和 Basic authentication 有同样的问题,扩展性差,授权服务器会有大量负载。

OAuth 2 + Json Web Tokens

形式

username + password + JSON map + Base64 + private key + expiration date

工作机制

用户第一次使用用户名密码登录系统后,系统不仅返回一个 access token,而且还有一个 JSON map,其中包含所有的用户信息,例如角色和权限,这些信息是使用 Base64 编码的,并使用私钥加密。

在 token 中存储了状态信息,使服务是无状态的。

用户自己拿着自己的信息,所有信息都在 token 里面,所以就不需要额外的调用了。

这对减少服务器的负载起到了巨大的作用,现在这个方法在世界范围内被广泛使用。

结论

扩展性好,非常适合微服务。

亚马逊的做法

在用户创建亚马逊账号的时候,会生成一个永久的、超级安全的 access token,需要用户保护好。

当用户需要请求亚马逊的时候,需要使用这个私有的 token 对 HTTP header 数据进行签名,并添加到 header 中一起发送过去。

服务器端,亚马逊也有用户的这个私有 token,接收到用户的请求后,同样对 header 进行签名,然后和用户的签名进行比较,如何相同,则允许访问。

最大的好处就是只需要发送一次用户名密码,用于获取 token,而且使用签名机制非常安全,不在乎消息被拦截。

翻译自:

https://medium.com/@yellow/rest-security-basics-f59013850c4e

推荐阅读:

3种基础的 REST 安全机制的更多相关文章

  1. php四种基础排序算法的运行时间比较

    /** * php四种基础排序算法的运行时间比较 * @authors Jesse (jesse152@163.com) * @date 2016-08-11 07:12:14 */ //冒泡排序法 ...

  2. 【转载】Python编程中常用的12种基础知识总结

    Python编程中常用的12种基础知识总结:正则表达式替换,遍历目录方法,列表按列排序.去重,字典排序,字典.列表.字符串互转,时间对象操作,命令行参数解析(getopt),print 格式化输出,进 ...

  3. Python编程中常用的12种基础知识总结

    原地址:http://blog.jobbole.com/48541/ Python编程中常用的12种基础知识总结:正则表达式替换,遍历目录方法,列表按列排序.去重,字典排序,字典.列表.字符串互转,时 ...

  4. php四种基础排序算法的运行时间比较!

    /** * php四种基础排序算法的运行时间比较 * @authors Jesse (jesse152@163.com) * @date 2016-08-11 07:12:14 */ //冒泡排序法 ...

  5. Scrapy里Selectors 四种基础的方法

    在Scrapy里面,Selectors 有四种基础的方法xpath():返回一系列的selectors,每一个select表示一个xpath参数表达式选择的节点css():返回一系列的selector ...

  6. UI自动化之8种基础定位

    UI自动化的核心在于定位 目录 1.8种基础定位方法 2.xpath定位 3.css定位 4.多组元素 1.8种基础定位方法 driver.find_element_by_id() #id定位 dri ...

  7. Redis-5种基础数据结构

    Redis基础数据结构 知识整理源于<Redis深度历险 核心原理与应用实践>这本书 Redis 有的数据结构都以 唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 ...

  8. get,post,put,delete四种基础方法对应增删改查

    PUT,DELETE,POST,GET四种基础方法对应增删改查 1.GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改.增加数 ...

  9. 小tips:在JS语句执行机制涉及的一种基础类型Completion

    看一个如下的例子.在函数 foo 中,使用了一组 try 语句.在 try 中有 return 语句,finally 中的内容还会执行吗? function foo(){ try{ return 0; ...

随机推荐

  1. Google Java编程风格指南(中文+原始)

    目录 前言 源文件基础 源文件结构 格式 命名约定 编程实践 Javadoc 后记 前言 这份文档是Google Java编程风格规范的完整定义.当且仅当一个Java源文件符合此文档中的规则, 我们才 ...

  2. 【21.58%】【codeforces 746D】Green and Black Tea

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  3. C# 大端小端转换

    关于大端和小端,是一个有趣的问题.本文告诉大家如何在C#转换大端和小端. 这里有一个有趣的故事,请看详解大端模式和小端模式 - CSDN博客 默认的 C# 使用的是小端,如果收到的消息是大端,那么就会 ...

  4. vue移动端图片上传压缩

    上传压缩方法 import {api} from '../../api/api.js'; import axios from 'axios'; export function imgPreview ( ...

  5. 使用FluentEmail发送outlook邮件

    一,邮箱账号相关设置 1,创建outLook邮箱. 2,进入邮箱设置->同步电子邮件->允许设备和应用使用pop 3,设置microsoft账号的应用程序密码->进入安全性页面-&g ...

  6. 【Repo】repo sync:error.GitError: cannot initialize work tree

    1.Error Fetching projects: 100% (725/725), done. Checking out files: 100% (4605/4605), done.out file ...

  7. lumen简单使用exel组件

    1.首先打开命令行,进入到lumen项目的根目录中,然后用composer下载excel组件 composer require maatwebsite/excel ~2.1.0 2.安装成功后,在bo ...

  8. 无法加载文件C:\Users\TANG\AppData\Roaming\npm\nrm.ps1,因为在此系统上禁止运行脚本

    # 碰到问题解决过程 > 1. 刚在一个新的机器上装node环境时,要用一个nrm管理镜像源时.报了一个错,如图1 ![图1](https://img2018.cnblogs.com/blog/ ...

  9. 18.函数复习,文件处理b模式(二进制处理),文件处理其他高级玩法

    1.函数复习 # map # l = [1,2,3,4,5] # print(list(map(str,l))) # reduce # l = [1,2,3,4,5] # from functools ...

  10. 它来了,它来了,centos 8 的时代到来了

    简介 Centos 8 已经在2019年9月24日正式发布.由于这是从Red Hat Enterprise Linux(RHEL)派生的Linux发行版,因此CentOS团队必须构建基础结构来支持新引 ...