安全是 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. MySQL面试(二)

    1.为什么索引遵循最左匹配原则? 当B+树的数据项是符合的数据结构,比如(name,age,sex)的时候,B+树是按照从左到右的顺序建立搜索树的.比如当(张三,20,F)这样的数据来检索的时候,b+ ...

  2. vue 项目使用局域网多端访问并实时自动更新(利用 browser-sync)

    在写vue的项目中时,虽然vue会自动更新页面,但是切换页面切来切去也很麻烦,有时候我们还要在公司另一台电脑或者手机上调试,这时候利用browser-sync插件,无需改动vue的代码即可实现: 1. ...

  3. H3C ping命令的输出

  4. Linux 内核 MODULEDEVICETABLE 宏

    这个 pci_device_id 结构需要被输出到用户空间, 来允许热插拔和模块加载系统知道什 么模块使用什么硬件设备. 宏 MODULE_DEVICE_TABLE 完成这个. 例如: MODULE_ ...

  5. Weblogic/WAS之Full GC监控与计算

    在网上看到关于内存回收机制,同大家一起分析探讨.堆内存划分为Eden.Survivor 和 Tenured/Old 空间,如下图所示: Minor GC 会清理年轻代的内存,Major GC 是清理老 ...

  6. 什么是神经网络 (Neural Network)

    反向传播: 可以看作是再一次将传过来的信号传回去, 看看这个负责传递信号神经元对于”讨糖”的动作到底有没有贡献, 让它好好反思与改正, 争取下次做出更好的贡献. 生物神经网络和人工神经网络的差别: 人 ...

  7. Python3 批量修改JPG图片尺寸

    功能 批量修改当前文件夹下的jpg图片到设置的尺寸 将修改后的图片移动到 new_img 这个文件夹下 导入库 from PIL import Image # 处理图片模块 import os imp ...

  8. Java正则表达式学习与记录

    转载自:http://www.runoob.com/java/java-regular-expressions.html 正则表达式定义了字符串的模式,用于搜索.编辑或处理文本. 1.正则表达式中字符 ...

  9. tomcat日志传参乱码问题

    问题:      在centos系统下,tomcat8.0.36控制台日志打印会出现中文乱码. 解决方案:      在catalina.sh里加上 JAVA_OPTS="-Dfile.en ...

  10. MyBatis 注解开发+逆向(Generator)

    注解开发 最初设计时,MyBatis 是一个 XML 驱动的框架.配置信息是基于 XML 的,而且映射语句也是定义在 XML 中的.随着技术的更新发展,对于开发效率要求也原来越高,特别是一些小型项目; ...