Skip to content
在本页面
微信公众号

鉴权

直接把API暴露到互联网上给外部系统是存在安全风险的,因此我们要先对接口调用方做一个用户鉴权,对API权限划分,如果鉴权通过则允许用户调用API。根据不同的场景,鉴权方案也有很多种。

常见的鉴权方式

Cookie + Session是最传统的API鉴权方式,比如很多网站的登录模块就是靠这种方式实现会话管理。

在服务端会生成一个session来保存会话状态,各个session是通过唯一的session_id来标识的,一次判断请求是哪个客户端发起,session_id存储在客户端的cookie中。

后续的所有请求都会把cookie传到服务器端,服务器端解析cookie后找到对应的session进行判断。

因此这种鉴权方式具有以下特点:

  • 为了使后台应用能识别是哪个用户发出的请求,需要在后台服务器存储一份用户登录信息(即session),这份信息也会在响应前端请求时返回给前端,前端将其保存在cookie;
  • 下次请求时前端发送给后端应用,后端应用就可以识别这个请求是来自哪个用户;
  • cookie内仅包含一个session标识符而诸如用户信息、授权列表等都保存在服务端的session中。

其优点是:

  1. 比较传统,对开发来说资料较多,语言支持完善;
  2. 较易于扩展,外部session存储方案已经非常成熟了(比如Redis)。

但也有如下缺点:

  1. 性能相于较低:每一个用户经过后端应用认证之后,后端应用都要在服务端做一次记录,以方便用户下次请求的鉴别,通常而言session都是保存在内存中,而随着认证用户的增多,服务端的开销会明显增大;
  2. 在一个无状态协议里注入了状态,与REST风格不匹配;
  3. 因为基于cookie来进行用户识别, cookie如果被截获,用户就会很容易受到CSRF攻击;
  4. 很难跨平台:在移动应用上 session 和 cookie 很难行通,你无法与移动终端共享服务器创建的 session 和 cookie。

API Key + API Secret

这种方式是指当请求的资源、API Key 和 API Secret匹配时,用户才可以访问对应的资源,一般还会以时间戳等方式来进行请求的时效控制。

其原理为:

  1. 服务器给每个客户端生成一对Key/Secret保存,并告知客户端,Key和Secret之间没有任何关系,相互之间不能推算;
  2. 发起请求时,会把包括API Key在内的所有的请求参数排序,然后跟API Secret一起做hash生成一个sign参数,服务器只需要按照约定的规则做一次签名计算,然后和请求的签名作比较,如果一致,则验证通过。

为了避免重放攻击,可以加上时间戳参数,服务端验证时,如果时间超过允许范围则验证失败。

需要注意的是,这种模式并不是RBAC,而是ACL访问权限控制。这种方式实现简单,占用的计算资源和网络资源都较少,安全性也可以。但是一般来说每一个api用户都需要分配一对Key和Secret,因此当Key和Secret比较多的时候,服务器会有一定的存储成本 ,而服务端只能通过API Key来区别调用者,API Secret一旦泄密,将造成很大的安全风险。

token

token令牌的机制是用来代替session的鉴权方式,现在很多api的鉴权都是通过token。

token机制是服务器端生成的一串加密串发放给客户端,客户端请求服务器端所有资源时会带上这个Token,由服务器端来校验这个token的合法性。其具有无状态、适合分布式、扩展性好、性能高和安全性好等优点。

常见的token实现有以下几种:

  • 自定义实现token:应用开发者根据token机制原理自行实现;
  • JWT:即Json Web Token,是一种主流的Token规范;
  • Oauth:Oauth虽然是授权规范,但其中也用到了Token;
  • HTTP Basic Authentication认证机制;
  • Web API是基于HTTP协议的,而HTTP协议本身就带有认证机制。

什么是JWT?

JWT的全称是JSON Web Token,一个JWT由三部分构成:Header,Payload,Signature

  • Header规定了token加密的方式和token的类型,
  • payload是token中包含用户的一些信息,比如用户名、过期时间
  • Signature包含header的base64值+payload的base64值+secret

JWT的特点:

  • 防CSRF(主要是伪造请求,带上Cookie)
  • 适合移动应用
  • 无状态,编码数据

在线JWT网站jwt.io

客户端往服务发送登录请求,服务端验证后,返回token给客户端,客户端每次请求接口的时候都会带上header部分带上token并进行请求。然后服务端使用secret进行解密,来验证从客户端传递过来的token是不是一个有效的token。如果验证通过则返回数据。

算法/加密

算法中的指令描述的是一个计算,当其运行时能从一个初始状态和初始输入(可能为空)开始,经过一系列有限而清晰定义的状态最终产生输出并停止于一个终态。

数据加密的基本过程,就是对原来为明文的文件或数据按某种算法进行处理,使其称为不可读的一段代码,通常称为密文。通过这样的途径,来达到保护数据不被非法人窃取、阅读的目的。

安全传输协议HTTPS

HTTPS(HyperText Transfer Protocol Secure)超文本传输安全协议,常称为HTTP over TLS、HTTP over SSL或HTTP Secure)是一种通过计算机网络进行安全通信的传输协议。

那么API安全如何保障?

  • 通信信道加密:使用HTTPS
  • 通信数据加密:密文+加密关键数据
  • 通信安全策略:授权中间层、尝试次数、过期策略...

Released under the MIT License.