安全是 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

推荐阅读:

最新文章

  1. 状态栏消息提示——使用Notification
  2. Ajax作用、及Ajax函数的编写
  3. Java单例模式实现(线程安全)
  4. 转ASP.NET1.1请求队列限制
  5. Enum引发的血案,反思
  6. sphinx 源码阅读之分词,压缩索引,倒排——单词对应的文档ID列表本质和lucene无异 也是外部排序再压缩 解压的时候需要全部扫描doc_ids列表偏移量相加获得最终的文档ID
  7. JJ Ying:越来越跨界的界面设计
  8. Excle快速输入√与×
  9. python 调用mysql存储过程返回结果集
  10. ie6 7 8 9 firefox的css兼容问题
  11. 2016年1月编程语言排行榜:Java荣获2015年度冠军
  12. 你真正的了解Ajax?Ajax技术简述
  13. PhpStorm连接服务器,开始自动上传功能
  14. 福州大学W班 软件工程课中期调查
  15. 数据库中row_number()、rank()、dense_rank() 的区别
  16. loj#2312. 「HAOI2017」八纵八横(线性基 线段树分治)
  17. Nginx+DNS负载均衡实现
  18. jsp页面第一句话报这个错Syntax error, insert "}" to complete
  19. 纯css3实现只适应的正方形
  20. Socket初见

热门文章

  1. indexdb开cai发keng实zhi践lu
  2. Java虚拟机理解-内存管理
  3. 2019牛客多校第一场 I Points Division(动态规划+线段树)
  4. mybatis 整合redis作为二级缓存
  5. docker 使用elasticsearch+logstash
  6. 【python安装】错误——“User installations are disabled via policy on the machine”
  7. 超简单本地mock假数据测试,模拟后台数据返回必杀技
  8. vue实现下拉框全选和输入匹配
  9. 从桌面到 Web - 二十几天学 ASP.NETCore 1
  10. Centos虚拟机安装指南