为啥不为不同用户的设备使用相同的 cookie?

Posted

技术标签:

【中文标题】为啥不为不同用户的设备使用相同的 cookie?【英文标题】:Why not have an identical cookie for different user's devices?为什么不为不同用户的设备使用相同的 cookie? 【发布时间】:2016-10-29 14:40:27 【问题描述】:

这是我的表结构:

// users
+----+--------+------------------------+------------------+-------------------------------+
| id |  name  |          email         |     cookie       |    /* some other columns */   |
+----+--------+------------------------+------------------+-------------------------------|
| 1  | Jack   | jack0948@gmail.com     | ojer0f934mf2...  |                               |
| 2  | Peter  | P_2009@ymail.com       | ko4398f43043...  |                               |
| 3  | John   | mx_pro34@gmail.com     | 0243hfd348i4...  |                               |
+----+--------+------------------------+------------------+-------------------------------+

cookie 列包含一个字符串(作为保持用户登录的cookie),该字符串也设置在用户的设备中。如您所见,我对每个用户只有 一个 字符串 (作为 cookie)。所以所有用户的设备都有一个相同的cookie。


我的问题是什么:最专业的程序员告诉我:

如果每个设备都有自己的cookie会更安全(每个设备的cookie应该不同于其他设备的cookie,而不是所有设备的恒定cookie)

嗯,为什么?为所有设备设置相同的 cookie 有什么问题?同样如您所见,我在数据库中只有一条 cookie 记录。因此,如果我为新设备更新该记录,那么之前的设备将被注销。

【问题讨论】:

如何防止会话劫持? @CD001 什么?我认为 session 与为所有设备使用相同的 cookie 无关。 说 Jack 在一个开放的 WiFi 上,我“窃听”并将他的 cookie 复制到我的手机并访问您的网站,它怎么知道我 不是 Jack? @CD001 :-) 够公平的..!不过,你说的发生的可能性很低。 即便如此——这几乎就是会话劫持的定义;登录应仅在会话期间绑定到具有某种指纹/令牌系统的单个设备 - 使用设置了 securehttpOnly 标志的 cookie。这可能就是为什么大多数专业人士会告诉您“如果每个设备都有自己的 cookie 会更安全” 【参考方案1】:

我猜你所说的 cookie 是指会话 ID。 Cookies 实际上可以代表任何东西。

您不应该在数据库中存储会话 ID。会话 ID 是临时值,应在每个新会话上更改。通过存储它们,您会遇到几个问题:

会话窃取:如果有人发现他不拥有的会话 ID,它将始终有效。这是错误的。 collisions :我想您使用某种散列方法生成这些值。在这种情况下,您可能会在具有相同会话 ID 的帐户之间发生冲突。 可能还有其他问题...

通过在每个新会话上生成会话 ID,您可以避免这些问题。但这意味着您的设备可能不会为同一用户提供相同的会话 ID。

通过存储会话 ID,您在此处实际执行的操作不是会话 ID。这是一个密码,以纯文本形式存储。这是非常错误的

【讨论】:

以上是关于为啥不为不同用户的设备使用相同的 cookie?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 iframe 请求不发送 cookie?

2 个用户使用相同的设备和相同的应用程序但登录 ID 不同 - 他们是不是有不同的 gcm 注册 ID?

cookie小结

为啥麦克风关闭时基频和幅度不为零?

cookie

OneSignal external_user_id 和同一用户的多个设备