Menu

cookies

cookies非同期関数で、Server Components で HTTP 受信リクエストのクッキーを読み取ったり、Server Actions または Route Handlers で送信リクエストのクッキーを読み書きしたりできます。

app/page.tsx
TypeScript
import { cookies } from 'next/headers'
 
export default async function Page() {
  const cookieStore = await cookies()
  const theme = cookieStore.get('theme')
  return '...'
}

リファレンス

メソッド

以下のメソッドが利用可能です。

メソッド戻り値説明
get('name')Objectクッキー名を受け入れ、名前と値を含むオブジェクトを返します。
getAll()オブジェクトの配列一致する名前を持つすべてのクッキーのリストを返します。
has('name')Booleanクッキー名を受け入れ、クッキーが存在するかどうかに基づいて boolean を返します。
set(name, value, options)-クッキー名、値、オプションを受け入れ、送信リクエストのクッキーを設定します。
delete(name)-クッキー名を受け入れ、クッキーを削除します。
clear()-すべてのクッキーを削除します。
toString()Stringクッキーの文字列表現を返します。

オプション

クッキーを設定する際、options オブジェクトの以下のプロパティがサポートされています。

オプション説明
nameStringクッキーの名前を指定します。
valueStringクッキーに保存する値を指定します。
expiresDateクッキーが有効期限切れになる正確な日時を定義します。
maxAgeNumberクッキーの有効期限を秒単位で設定します。
domainStringクッキーが利用可能なドメインを指定します。
pathString、デフォルト:'/'クッキーのスコープをドメイン内の特定のパスに制限します。
secureBooleanHTTPS 接続でのみクッキーが送信されることを保証し、セキュリティを強化します。
httpOnlyBooleanクッキーを HTTP リクエストに制限し、クライアント側のアクセスを防止します。
sameSiteBoolean、'lax''strict''none'クッキーのクロスサイトリクエスト動作を制御します。
priorityString("low""medium""high"クッキーの優先度を指定します。
partitionedBooleanクッキーがパーティション化されているかどうかを示します。

デフォルト値を持つ唯一のオプションは path です。

これらのオプションの詳細については、MDN ドキュメントを参照してください。

補足

  • cookies非同期関数で promise を返します。クッキーにアクセスするには、async/await または React の use 関数を使用する必要があります。
    • バージョン 14 以前では、cookies は同期関数でした。後方互換性のために、Next.js 15 では引き続き同期的にアクセスできますが、この動作は将来非推奨になります。
  • cookiesDynamic API であり、返される値は事前に知ることができません。これをレイアウトまたはページで使用すると、ルートが動的レンダリングにオプトインします。
  • .delete メソッドは以下の場合にのみ呼び出すことができます。
    • Server Action または Route Handler 内。
    • .set が呼び出されたのと同じドメインに属する場合。ワイルドカードドメインの場合、特定のサブドメインが完全に一致する必要があります。さらに、削除したいクッキーと同じプロトコル(HTTP または HTTPS)で実行する必要があります。
  • HTTP ではストリーミング開始後にクッキーを設定できないため、Server Action または Route Handler.set を使用する必要があります。

Server Components でのクッキー動作の理解

Server Components でクッキーを使用する場合、クッキーは根本的にクライアント側のストレージメカニズムであることを理解することが重要です。

  • クッキーの読み取りは、クライアントのブラウザが HTTP リクエストヘッダーでサーバーに送信するクッキーデータにアクセスしているため、Server Components で機能します。
  • クッキーの設定は、Route Handler または Server Action を使用している場合でも、Server Component 直接では実行できません。これは、クッキーが実際にはサーバーではなくブラウザによって保存されるためです。

サーバーは、ブラウザにクッキーを保存するよう指示するための命令(Set-Cookie ヘッダー経由)を送信できるだけで、実際のストレージはクライアント側で発生します。そのため、状態を変更するクッキー操作(.set.delete.clear)は、レスポンスヘッダーを適切に設定できる Route Handler または Server Action で実行する必要があります。

Server Actions でのクッキー動作の理解

Server Action でクッキーを設定または削除した後、Next.js はサーバー上で現在のページとそのレイアウトを再レンダリングして、UI が新しいクッキー値を反映するようにします。キャッシングガイドを参照してください。

UI はアンマウントされませんが、サーバーから取得するデータに依存するエフェクトは再実行されます。

キャッシュされたデータも更新するには、アクション内で revalidatePath または revalidateTag を呼び出してください。

クッキーの取得

(await cookies()).get('name') メソッドを使用して単一のクッキーを取得できます。

app/page.tsx
TypeScript
import { cookies } from 'next/headers'
 
export default async function Page() {
  const cookieStore = await cookies()
  const theme = cookieStore.get('theme')
  return '...'
}

すべてのクッキーの取得

(await cookies()).getAll() メソッドを使用してすべてのクッキーを取得できます。名前を指定しない場合、利用可能なすべてのクッキーを返します。

app/page.tsx
TypeScript
import { cookies } from 'next/headers'
 
export default async function Page() {
  const cookieStore = await cookies()
  return cookieStore.getAll().map((cookie) => (
    <div key={cookie.name}>
      <p>Name: {cookie.name}</p>
      <p>Value: {cookie.value}</p>
    </div>
  ))
}

クッキーの設定

Server Action または Route Handler(await cookies()).set(name, value, options) メソッドを使用してクッキーを設定できます。options オブジェクトはオプションです。

app/actions.ts
TypeScript
'use server'
 
import { cookies } from 'next/headers'
 
export async function create(data) {
  const cookieStore = await cookies()
 
  cookieStore.set('name', 'lee')
  // または
  cookieStore.set('name', 'lee', { secure: true })
  // または
  cookieStore.set({
    name: 'name',
    value: 'lee',
    httpOnly: true,
    path: '/',
  })
}

クッキーの存在確認

(await cookies()).has(name) メソッドを使用してクッキーが存在するかどうかを確認できます。

app/page.ts
TypeScript
import { cookies } from 'next/headers'
 
export default async function Page() {
  const cookieStore = await cookies()
  const hasCookie = cookieStore.has('theme')
  return '...'
}

クッキーの削除

クッキーを削除する方法は 3 つあります。

delete() メソッドを使用する方法:

app/actions.ts
TypeScript
'use server'
 
import { cookies } from 'next/headers'
 
export async function delete(data) {
  (await cookies()).delete('name')
}

同じ名前で空の値を持つ新しいクッキーを設定する方法:

app/actions.ts
TypeScript
'use server'
 
import { cookies } from 'next/headers'
 
export async function delete(data) {
  (await cookies()).set('name', '')
}

maxAge を 0 に設定するとクッキーが即座に有効期限切れになります。maxAge は秒単位の値を受け入れます。

app/actions.ts
TypeScript
'use server'
 
import { cookies } from 'next/headers'
 
export async function delete(data) {
  (await cookies()).set('name', 'value', { maxAge: 0 })
}

バージョン履歴

バージョン変更内容
v15.0.0-RCcookies は非同期関数になりました。codemod が利用可能です。
v13.0.0導入時期:cookies