先来看看没有加 httpOnly 的情况:
res.setHeader('Set-Cookie', `userId=${userId}`)
document.cookie 的输出结果是 "userId=1553567783435_0.03530486473331074"
这时候给 document.cookie 赋值一个 "userId=123",再看看 Cookie 变成什么:
document.cookie 的输出结果是 "userId=123",也就是说,也就是说之前的 userId 的值被覆盖了。
再来看看加了 httpOnly 的情况:
res.setHeader('Set-Cookie', `userId=${userId}; httpOnly`)
给 document.cookie 赋值一个 "userId=123",看看 Cookie 变成什么:
会发现,userId 这个 Cookie 的值根本没有任何的变化,也就是说,httpOnly 这个作用生效了,它防止了前端对 userId 这个 Cookie 记录进行修改。你也可以理解为,userId 这个记录对前端隐藏了,既获取不到 userId 这个值,也不能给 userId 这个 Cookie 赋值。
至于为什么视频中 username 设置了 httpOnly 之后,进行了 document.cookie="username=zhangsan" 之后竟然能够加到 Cookie 中去,这个我也很疑惑。按照我测试出来的结果,如果 username 这个 cookie 是 httpOnly 的话,它是应该不能再赋值的,也不会出现 Cookie 中还存在另外一个 key 为 username 的记录。
那是不是说添加了 httpOnly 之后,前端就不能通过 document.cookie 进行修改 cookie 的操作了?并不是。
这次不对 userId 这个 Cookie 赋值了,我随便写一个 document.cookie="test=123"。
会发现,Cookie 中多了一条 key 为 test 的记录。
综上所述,在 Set-Cookie 的时候,添加 httpOnly 确实对限制前端修改 Cookie 是起了作用了,但所起的限制仅仅对设置了 httpOnly 的记录有效。
回到你所提的问题,相同的 key 出现被覆盖的情况,那么是否有检查过 Cookie 对应记录 httpOnly 是否已经正确设置了?如果设置正确的话,应该是不会出现你所说的出现覆盖的情况。