3种基础的 REST 安全机制

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

  • 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/re...

推荐阅读:

相关文章
相关标签/搜索