使用cookie的操作构建器身份验证中的潜在竞争条

时间:2015-09-22 18:22:32

标签: scala authentication cookies playframework

我正在使用播放操作构建器来检查当用户通过cookie机制访问页面时是否对用户进行了身份验证。

通过验证cookie中加密的身份验证令牌与特定用户的数据库中存储的令牌相匹配来完成检查。

如果用户已通过身份验证,那么我将重新生成新令牌,然后将更新后的令牌存储在数据库中,并使用包含更新令牌的cookie更新结果。

在令牌重生过程中,我可以看到可能的竞争条件(尽管在我看来很少发生)。

我相信在同时请求页面时会发生这种情况:

  

Page1 - >已验证 - >令牌再生----->保存到db(已替换) - > cookie已更新

     

Page2 - >已验证 - >令牌再生 - >保存到db -------> cookie更新(替换)

现在,包含令牌的浏览器cookie将与DB中的值不匹配。

我该如何改进?我错误地设计了吗?

1 个答案:

答案 0 :(得分:0)

有一些方法可以改变身份验证cookie的值,因此它不可重复使用。

如果整个cookie都加密而不修改令牌本身。在cookie中使用时间戳将更改不可读的cookie值。这将使cookie不被“重播”。一旦cookie在服务器端解密,就可以在可接受的滑动窗口中进行检查。

您还可以在服务器端使用滑动窗口概念,方法是在数据库中存储少量时间的旧令牌。这也可以让你进行恒定的令牌重生。