前后端时区不一致导致的问题

出于安全考量,项目前后端在进行数据交互时,对数据进行了签名校验,算法可以归纳为:sign=MD5(要传输的数据+指定的特殊字符串+今天的第一秒)。为了防止前后端时间出现偏差(如前端在前一天23:59:59发送请求,后端在第二天0:0:0接收到请求),后端在校验时,如拼接今天的第一秒校验不通过,则还会尝试拼接昨天的第一秒和前天的第一秒,都不通过时才报错。

这套方法一直运作的很好,直到今天为了测试其他一个问题,修改了客户端的时区——当客户端时区修改后,便无论如何都无法通过校验了。

原因在于,每个时区的“今天的第一秒”的时间戳是不同的,服务器的时区是东八区,一旦客户端不是东八区,两者必然不相同。解决方法倒也很是简单,两边强制用一样的时区就好了——两边都转换为格林尼治时间,或者将客户端的时间转换为东八区时间都可以。