Api接口的安全
Api接口可以分两种一种是需要登录才能获取数据,使用的是token
使用jwt加密技术加密用户信息,设置token的过期时间一般是2个小时,提高token的安全性,然后把token返回给客户端,客户端可以将token存入localstorage或者cookie中,cookie和localstorage的区别是cookie只能存4k的数据,localstarage能存5m,cookie可以设定过期时间,默认为一次会话,localstarage会一直存在,除非手动清除,下次请求时可以把token放入请求头里,带到服务器,通过jwt进行解密,如果解不回来,或token过期,那就认为用户没有登录。
有两种方法 第一种就是跳到登录界面,让用户在登录,但这样就使用户需要每两个小时就要登录一下,用户体验很不好
第二种就是设置一个refeshtoken过期时间要比token时间长,如果返回的状态码是401,就是token过期了,让他带着refeshtoken去换取新的token和refeshtoken,把新的token和refeshtoken替换旧的,然后继续上一次的请求,这里要用到ajax的同步。这样通过refeshtoken完成了无痛刷新。这样能实现接口的安全
还有一种接口是不需要登录的接口,比如说取得推荐商品,获得分类等,有可能是别人非法调用我们的接口,获取数据,因此就要使用安全验证。
我们可以在前台使用时间戳和随机数还有一个固定的口令,用MD5或是别的加密方式(Rsa非对称加密),生成一个签名,当需要访问接口的时候,把时间戳,随机数,签名通过URL传递到后台。后台拿到时间戳,随机数后,通过一样的算法规则计算出签名,然后和传递过来的签名进行对比,一样的话,返回数据。
但还是不安全,可以通过抓包工具获得时间戳,随机数,签名,这样还是能获取数据,怎么解决呢?我们可以使这个签名只能使用一次,可以把签名存入数据库或Redis中,我选择的是Redis,速度快,把签名作为键,值的话随便,这样在验证签名前查找Redis中是否存在相同的签名,不存在才能往下走。
这样不需要登录的接口也能实现接口的安全。