You are currently viewing Cookieを消すときはパスに注意

Cookieを消すときはパスに注意

処理の分岐や、簡易的なトークンの保存などにCookieを利用し、利用が終わったら即座にCookieを消したいと言うことがあると思います。

基本的なCookieの消し方

Cookieの削除方法としては「有効期限を0やマイナスに設定」することで削除することができます
具体的には、以下のいずれかを行います
・Expiresを現在日時より過去を設定する
・Max-Ageを0 または マイナスの値を設定する(ただし、マイナスはブラウザにより挙動が変わる可能性があるため、0指定が推奨されているそうです)

自分が開発中のWebアプリでは、以下の方法でCookie削除を行っていました
フレームワークとして、Go言語のEchoを利用しています

cookie, err := c.Cookie("token")
cookie.Expires = time.Now().Add(-1 * time.Hour)

ただ、この状態でテストを行ったところ、Cookieがうまく消えていませんでした

Cookieが消えない原因

Cookieが消えなかった原因は2つありました
・SetCookieを呼び出していなかった
・Cookieのパスを明示的に指定していなかった

SetCookieを呼び出していなかったのは単純なケアレスミスなのですが、Cookieパスについては今回始めて知りました
Cookieを削除する際、明示的にpath属性を指定する必要があるようで、削除対象のCookieパスを指定することで正常に削除することができました

修正後のコードは以下のようになります

		deleteCookie := &http.Cookie{
			Name:    "token",
			Value:   "",
			Expires: time.Unix(0, 0),
			Path:    "/", // フロントでセットしたPathと合わせる
		}
		c.SetCookie(deleteCookie)

Expiresをtime.Unix(0, 0)を利用しているのは、time.Now().Add(-1 * time.Hour)だと何故か過去日付が取得できなかったため、Unix()メソッドを使って確実な過去日時(1970年)を取得しています
もちろん、過去日付が設定できればほかメソッドを利用しても大丈夫です

まとめ

ということで、Cookieがうまく消えないというお話でした
今回のケースでは
・有効期間に過去日時が指定されていなかった
・path属性が削除対象のCookieとズレていた
というのが原因でした

他にも、DomainやSecure、SameSiteといった属性の違いでも削除されないことがあるため、削除対象のCookieと属性が一致しているか確認するのが重要です

ので、もしCookie削除が狙ったとおりに動かない場合は、この部分を見直してみると良いかもしれません

コメントを残す