この記事はGo言語、Ginフレームワークの、とくにgin-contrib sessionのログアウトについて、しっかりセッションを消す方法について書いています。
通説
gin-contrib sessionの扱い方を紹介している記事で、よくログアウト機能をこのように組み立てているものが主流になっています。
func Logout(ctx *gin.Context) {
session := sessions.Default(ctx)
session.Clear()
session.Save()
}
しかし、この方法ではブラウザ側ではセッションが残ったままになってしまいます。
セッションの内容がnilになっているかでセッションチェックを行っている場合はちゃんとログアウトできているような挙動をしますが、ブラウザの開発ツールでcookieのセッションが残っていることが確認できることかと思います。
筆者はこれを悪用したログアウト状態のPOSTを受けました(笑)
解決法
GitHubのissueに解決策がありました。
ログアウト関数を以下の通りに書き換えます。
func Logout(ctx *gin.Context) {
session := sessions.Default(ctx)
session.Clear()
session.Options(sessions.Options{Path: "/", MaxAge: -1})
session.Save()
}
これで、セッションがちゃんと消えていることがブラウザの開発ツールで確認できるかと思います。