Gin Cookie認証入門
Cookie操作の基礎
Gin初心者が最初に直面するのは、ブラウザとサーバー間で状態を保持する方法です。Cookieはその代表的な手段で、c.SetCookieで設定し、c.Cookieで取得します。Cookieには有効期限、パス、ドメイン、セキュアフラグなどの属性があり、これらを正しく設定することでセキュリティとユーザー体験を向上させられます。
有効期限は expires または max-age で指定し、パスは path、ドメインは domain、セキュアは secure フラグで制御します。例えば、HTTPS専用で全ドメインに渡す場合は secure=true と domain=".example.com" を設定します。
c.SetCookieとc.Cookieの使い方
以下は Gin で Cookie を設定し、取得する典型的なコード例です。
func setCookie(c *gin.Context) {
c.SetCookie(
"session_id", // Cookie 名
"abc123", // 値
3600, // 有効期限(秒)
"/", // パス
"example.com", // ドメイン
true, // Secure
true, // HttpOnly
)
}
func getCookie(c *gin.Context) {
cookie, err := c.Cookie("session_id")
if err != nil {
// Cookie が存在しない場合の処理
c.JSON(401, gin.H{"error": "認証情報がありません"})
return
}
// cookie を使った処理
c.JSON(200, gin.H{"session_id": cookie})
}
上記の c.SetCookie では、Secure と HttpOnly を両方 true に設定しています。これにより、HTTPS 通信時のみ Cookie が送信され、JavaScript からのアクセスもブロックされます。c.Cookie は Cookie が存在しない場合にエラーを返すので、エラーハンドリングを忘れないようにしましょう。
セッションと認証でCookieを活用する
Cookie はセッション管理の基盤です。サーバー側でセッション ID を生成し、c.SetCookie でクライアントに渡すことで、次回以降のリクエストで c.Cookie で ID を取得し、データベースやメモリに保存されたセッション情報を参照します。
認証フローでは、ログイン時にトークンを Cookie に保存し、各 API エンドポイントで c.Cookie を使ってトークンを検証します。トークンの有効期限は Cookie の有効期限と同期させると、クライアント側での管理が簡単になります。
さらに、path を限定することで、特定の API パスだけで Cookie を送信させることができます。例えば、/api/secure/* のみで Cookie を送るように設定すると、不要なリクエストで Cookie が送信されず、セキュリティが向上します。
コメント
コメントを投稿