APP、前后端分离项目都采用API接口形式与服务器进行数据通信,传输的数据被查看、被抓包、被伪造时有发生,那么如何设计一套安全的API接口?
设计方案
- token授权认证,防止未授权用户获取数据
- 时间戳超时机制
- URL签名,防止请求参数被篡改
- 防重放,防止接口被第二次请求,防采集
- 采用HTTPS通信协议,防止数据明文传输
Token授权认证
Http协议是无状态的,一次请求结束,连接断开,下次服务器再收到请求,不知道发送请求的用户。对于有权限访问的模块,我们需要知道是哪个用户发起的请求。
token的设计方案,是用户在客户端通过用户名和密码登录后,服务器会返回给客户端一个token,并将token以键值对多方式存放在缓存中,然后客户端每次访问操作都携带上此token。服务端接受到请求后进行token验证。
token生成设计要求
- 保证唯一
- 要有时效性,过期后需重新登陆,来获取新的token
- 每次生成的token需不一致
- 缓存中保存键值对形式为:token,value(用户id或信息)
一般token过期后,会使用客户端保存的用户名+密码来进行静默登陆来获取token
时间戳超时限制
客户端每次请求接口都带上当前时间的时间戳timestamp,服务端接受到时间戳后跟当前时间进行对比,比如时间差大于一定时间(例如1分钟),则认为请求时效。
URL签名
使用算法对参数进行签名,对比客户端和服务端签名是否一致(客户端和服务端拥有私钥)
一般签名算法
- 首先对通信的参数按key进行字母排序放入数组中(一般请求的接口地址也要参与排序和签名,那么需要额外添加url=http://url/getInfo这个参数);
- 对排序完的数组键值对用&进行连接,形成用于加密的参数字符串;
- 在加密的参数字符串前面或者后面加上私钥,然后用md5进行加密,得到sign,然后随着请求接口一起传给服务器。
防重放
客户端第一次访问接口后,将签名sign存放到缓存中,超时时间设定为与时间戳到超时时间一致。
这样,如果请求被非法者截获,使用同一个url再次访问,发现服务端已存在签名,然后拒绝本次服务;如果sign缓存时效,客户端访问链接,由于时间戳时效,将拒绝服务。
采用HTTPS通信协议
HTTP协议是以明文方式发送内容
为了数据传输安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份