© TOOLS BOX — Next.js / React / TypeScript コードサンプル集

サンプルガイド
←サンプル一覧
nextjsapi

Next.js の cookies() でサーバーサイドのクッキーを読み書きする

App Router の cookies() を使い、Server Component・Server Actions・Route Handler でクッキーを読み書きする実装例。

難易度: 中級·更新: 2026-04-17

対応バージョン

nextjs 15

前提環境

Next.js App Router のサーバーコンポーネントと Server Actions の基本を理解していること

概要

next/headers の cookies() を使うと、サーバーサイドでクッキーを読み書きできる。 クライアントコンポーネントから直接参照できないため、セッショントークンなどを安全に扱える。

インストール

# 追加インストールは不要

Server Component でクッキーを読む

// src/app/dashboard/page.tsx
import { cookies } from "next/headers";

export default async function DashboardPage() {
  const cookieStore = await cookies();
  const theme = cookieStore.get("theme")?.value ?? "light";

  return (
    <main className="p-6">
      <p className="text-sm">現在のテーマ: {theme}</p>
    </main>
  );
}

Server Actions でクッキーを書く

// src/app/actions/theme.ts
"use server";

import { cookies } from "next/headers";

export async function setTheme(theme: "light" | "dark") {
  const cookieStore = await cookies();
  cookieStore.set("theme", theme, {
    httpOnly: false,
    secure: process.env.NODE_ENV === "production",
    sameSite: "lax",
    maxAge: 60 * 60 * 24 * 365, // 1年
    path: "/",
  });
}
// src/components/ThemeToggle.tsx
"use client";

import { setTheme } from "@/app/actions/theme";

export function ThemeToggle() {
  return (
    <div className="flex gap-2">
      <button onClick={() => setTheme("light")} className="rounded border px-3 py-1 text-sm">
        ライト
      </button>
      <button onClick={() => setTheme("dark")} className="rounded border px-3 py-1 text-sm">
        ダーク
      </button>
    </div>
  );
}

Route Handler でセッショントークンを管理する

// src/app/api/session/route.ts
import { cookies } from "next/headers";
import { NextResponse } from "next/server";

export async function POST(request: Request) {
  const { token } = (await request.json()) as { token: string };
  const cookieStore = await cookies();

  cookieStore.set("session", token, {
    httpOnly: true,   // JS から読めない(XSS 対策)
    secure: process.env.NODE_ENV === "production",
    sameSite: "strict",
    maxAge: 60 * 60 * 24 * 7, // 7日
    path: "/",
  });

  return NextResponse.json({ ok: true });
}

export async function DELETE() {
  const cookieStore = await cookies();
  cookieStore.delete("session");
  return NextResponse.json({ ok: true });
}

ポイント

  • cookies() は Server Component / Server Actions / Route Handler でのみ使用可能
  • httpOnly: true にすると JavaScript からアクセスできず、XSS によるトークン盗用を防ぐ
  • secure: true は HTTPS 接続時のみクッキーを送信する(本番環境で必須)
  • sameSite: "strict" は CSRF 対策になるが、外部サイトからの遷移でクッキーが送られない点に注意
  • Next.js 15 では cookies() は非同期関数(await が必要)

注意点

cookies() は Server Component・Server Actions・Route Handler でのみ使用可能。クライアントコンポーネントからは直接参照できない。httpOnly / secure / sameSite オプションを適切に設定すること。

関連サンプル

同じテーマや技術スタックを使った実装例

  • Next.js の cookies() で httpOnly セッション Cookie を管理する

    next/headers の cookies() を使い、ログイン時に httpOnly セッション Cookie を発行し、Server Component・Route Handler・Middleware で読み書きする例。

  • Supabase でメール・パスワード認証を実装する

    Next.js App Router + Supabase Auth を使ったメール/パスワード認証の実装例。サインアップ・ログイン・ログアウト・セッション管理(Server Components からの参照)を扱う。

  • Jest で Next.js Route Handler をテストする

    Request / Response オブジェクトを直接渡して Route Handler 関数をユニットテストする例。GET / POST それぞれのハッピーパスとエラーパスを検証する。

  • Next.js Route Handler でエラーレスポンスを型安全に統一する

    Route Handler のエラーレスポンスを型付きで統一し、400 / 404 / 500 を一貫して扱うラッパー関数を実装する例。try/catch パターンとエラー型の整理も示す。

  • Next.js Route Handler でサーバーサイドキーワード検索を実装する

    クエリパラメータで受け取ったキーワードを Route Handler でサーバーサイドフィルタし、ページネーション付きで返す例。クライアントのデバウンス入力と合わせた構成も示す。

関連仕様

このサンプルを理解するのに役立つ仕様や概念

  • FrameworkNext.jsReact ベースのフルスタックフレームワーク。SSR・SSG・App Router・API Routes を提供する。
  • API / OptionsameSiteCookie の送信範囲をクロスサイトリクエスト時に制御するオプション。CSRF 対策の基本設定。
  • API / OptionhttpOnlyJavaScript からの Cookie アクセスを禁止するオプション。XSS によるトークン窃取を防ぐ基本設定。
  • API / OptionsecureHTTPS 接続時のみ Cookie を送信するオプション。本番環境では必須のセキュリティ設定。
←サンプル一覧に戻る