浅析前后端分离架构下的API安全问题:JWT保证token不被盗用的方案(即如何防范Replay Attacks)

  前后端分离架构带来的好处一搜一大堆,这里主要讨论一下后端接口的安全问题。因为在分离的情况下,后端 api 是暴露在外网中的,常规的web项目无论如何前端都是要通过公网访问到后台api的,带来的隐患也有很多。比如:

  (1)接口公开,谁都可以访问;

  (2)数据请求的参数在传输过程被篡改;

  (3)接口被重复调用。

一、为什么采用 Token

  token就像一把钥匙,只要有了这把钥匙就可以把家里的东西往外搬,但万一token在客户端或者在传输过程中被截取了怎么办?做到如下可以降低 token 被盗风险。

1、在存储的时候把 token 进行对称加密存储,用时解开。

  加密后的 token 被其他人得到以后,需要使用密钥进行解密后才能使用,其他人无法得到密钥就不能得到正确的 token。

2、将请求 URL、时间戳、token 三者进行合并加盐签名,服务端校验有效性。

  最好结合1,2两种方式一起使用,token进行加密处理,将请求 URL、时间戳、加密后的token,三者进行合并加盐签名,因为盐值是保密的,所以其他人只是得到token的话,无法进行正确的签名,后端验证请求的签名值来判断请求是否有效。

3、验证 token 对应的 IP 地址或者移动端的设备id

  每次请求可以将token和请求的对应的ip地址或设备id保存起来,放到数据库或者redis缓存中,如果后面请求token对应的ip地址或设备id不一样,则视为非法请求

4、如何防范Replay Attacks

  token 解决了篡改数据的问题,还有第3个问题,那就是攻击者不修改数据,只是重复攻击。

  所谓重复攻击就是攻击者发送一个后端服务器已接收过的包,来达到攻击系统的目的。比如在浏览器端通过用户名/密码验证获得签名的Token被木马窃取。即使用户登出了系统,黑客还是可以利用窃取的Token模拟正常请求,而服务器端对此完全不知道,因为JWT机制是无状态的。

  那么如何解决呢?可以在Payload里增加时间戳,并且前后端都参与来解决:

(1)前端生成token时,在payload里增加当前时间戳;

(2)后端接收后,对解析出来的时间戳和当前时间进行判断,

(3)如果相差特定时间内(比如5秒),允许请求,否则判定为重复攻击

posted @ 2021-08-15 21:03  古兰精  阅读(6307)  评论(0编辑  收藏  举报