スキップしてメイン コンテンツに移動

Gin Cookie認証入門

Gin Cookie認証入門

Cookie操作の基礎

Gin初心者が最初に直面するのは、ブラウザとサーバー間で状態を保持する方法です。Cookieはその代表的な手段で、c.SetCookieで設定し、c.Cookieで取得します。Cookieには有効期限、パス、ドメイン、セキュアフラグなどの属性があり、これらを正しく設定することでセキュリティとユーザー体験を向上させられます。

有効期限は expires または max-age で指定し、パスは path、ドメインは domain、セキュアは secure フラグで制御します。例えば、HTTPS専用で全ドメインに渡す場合は secure=truedomain=".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 では、SecureHttpOnly を両方 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 が送信されず、セキュリティが向上します。

この記事はAIによって作成されました。

コメント