首页 > 解决方案 > 删除所有 cookie

问题描述

我很难使用以下代码删除所有 cookie。似乎发生的事情是域被更改为在其前面附加一个点。我没有删除所有 cookie,而是得到域略有不同的重复 cookie。有什么方法可以完全删除所有 cookie,无论它们的域是什么样的?

谢谢你的帮助!

//DeleteCookies deletes all cookies
func DeleteCookies(w http.ResponseWriter, r *http.Request) {
    for _, c := range r.Cookies() {
        deleted := &http.Cookie{
        Name: c.Name,
        Path: c.Path,
        //Expires:  time.Unix(0, 0),
        MaxAge:   -10,
        HttpOnly: c.HttpOnly,
        Domain:   c.Domain,
        Secure:   c.Secure,
        Value:    "",
        }
        http.SetCookie(w, deleted)
    }
}

标签: go

解决方案


您尝试做的事情并不好,因为 cookie 不能那样工作。

首先是简单的事情:HttpOnly、Domain 和 Secure:这些值不会在 HTTP 客户端请求中传输,这些字段c将始终为空。客户端使用这些字段来确定是否在Cookie标头中发送(名称,值)对,但不发送这些值。

对于 HttpOnly、Secure(和 SameSite),这无关紧要,因为这些(以及 MaxAge 和 Expires)对cookie身份没有贡献。

Cookie 身份基于在SetCookie标头中发送的三元组(域、路径、名称)。通常域和路径是隐含的,但它们确实在客户端上定义了值。

现在要删除具有标识(Domain-X、Path-X、Name-X)的 cookie,您必须发送具有相同标识(Domain-X、Path-X、Name-X)且 MaxAge=-1 的 cookie。但如上所述,您收到的 cookie不包含域和路径。

有两种出路:

  1. 您必须知道您的 cookie 是域 cookie 还是主机 cookie,以及它们设置的路径,并使用该信息删除它们。(我会推荐这个。)

  2. 删除所有可能的cookie。在请求路径/foo/bar/wuz时,来自客户端的 cookie 可能来自 path //foo或者 /foo/bar(如果我没记错的话;在 RFC 6265 中测试并查找它)。因此,删除所有这些路径的名称为“Name-X”的 cookie。对更复杂的 Domain 属性执行相同的操作。删除主机 cookie (Domain=="") 并删除域 cookie (Domain!="")。确保获得正确的域名(有效 TLD 加一)。

如您所见,2 相当复杂。但这就是 cookie 的设计方式:服务器应该知道服务器设置了哪些 cookie,即服务器应该知道其所有 cookie 的 cookie 身份(域、路径、名称)。客户端的职责是只为某个请求发回适当的 (Name,Value) 对。如果服务器希望删除一个 cookie,它只需将该 cookie 的 MaxAge 设置为 -1。请注意,“那个 cookie”是服务器应该知道的,而不是从客户端请求中推断出来的。


推荐阅读