API接口设计之 安全性 与 性能

接口安全性

1. Token验证机制

通过用户名/密码调用授权接口获取Token,设置token有效期保持用户授权期间状态,可以使用token将信息保存在服务端,避免网络间传输,目的在于防止用户信息泄露,存储状态机。

2. 接口调用签名

由于前后端分离前端通过http请求调用后端接口,期间通过网络介质传输接口调用参数,黑客可能通过公共网域监听http请求信息,窃取调用接口参数信息,并从中查询规律,从而不通过客户端,直接通过http直接请求调用接口。这种情况下需要通过签名方式对一些敏感接口进行签名访问。

做法步骤:

a. 前后端约定Secret密钥,密钥可以尽可能复杂。

b. 约定MD5加密规则:一般格式:MD5(param1 + secret + param2 + timestamp)

c. 后端接收到前端参数后使用同样得MD5算法进行加密操作,通过比对前后端密文,如果一致则可以调用后续业务。不一致则返回错误信息。

3. 接口限流

防止黑客恶意攻击(比如cc攻击)导致qps过高,可以考虑策略在服务入口为相同uid的账户请求限制每秒钟的最高访问数。

限流解决方案:

可以通过分布式缓存中间件Redis,将客户得Uid作为key通过自增长获取用户接口调用次数,如果接口调用请求过多超过服务访问阈值,拒绝用户继续访问该接口。

通过Nginx在网管层面进行限流控制。使用方法可以使用nginx得limit_conn模块实现,也可通过自定义脚本,通过刷访问日志得方式实现。

 4. 接口幂等控制,接口如果没有做幂等性控制,则改接口遇到接口重复调用或者接口调用方有重试机制,则会出现数据重复被录入

得情况,这是需要考虑接口幂等问题,通常解决接口幂等性问题得常用方法是:

a. 在数据库层面进行唯一键约束

b. 在接口调用前先调用获取令牌接口获取redis令牌,然后将令牌信息放入请求参数中提交,后台拿到令牌后访问redis验证,如果有该令牌则进行后续业务。

c. 数据库乐观锁控制,在更新数据是,保存数据更新版本,每次更新版本+1,更新语句为:UPDATE table t set t.a = value and t.version = t.version +1 WHERE t.id = #{id} t.version = #{version}

接口性能

1. 接口无状态设计,采用接口无状态设计就可以轻松实现服务得横向扩展,这样当接口并发量高得时候就可以增加服务数量来提高接口得并发量。

2. 重要数据进行缓存预热处理,从而实现调用接口时减少应用过多得和底层数据得交互,提升IO得性能。

3. 使用LRU,LFU,LNU等算法,缓存热点数据,降低缓存击穿率。

4. 使用消息中间件,对高频接口进行异步消峰处理。提升接口得响应事件。

相关推荐