cookies
cookies
は、server componentでHTTPの受信リクエストのcookieを読み取るための非同期関数であり、server actionsやroute handlerで送信リクエストのcookieを読み書きするためのものです。
- TypeScript
- JavaScript
import { cookies } from 'next/headers'
export default async function Page() {
const cookieStore = await cookies()
const theme = cookieStore.get('theme')
return '...'
}
import { cookies } from 'next/headers'
export default async function Page() {
const cookieStore = await cookies()
const theme = cookieStore.get('theme')
return '...'
}
リファレンス
メソッド
以下のメソッドが利用可能です:
メソッド | 戻り値の型 | 説明 |
---|---|---|
get('name') | Object | cookie名を受け取り、その名前と値を持つオブジェクトを返します。 |
getAll() | Array of objects | 一致する名前を持つすべてのcookieのリストを返します。 |
has('name') | Boolean | cookie名を受け取り、cookieが存在するかどうかに基づいてブール値を返します。 |
set(name, value, options) | - | cookie名、値、およびオプションを受け取り、送信リクエストのcookieを設定します。 |
delete(name) | - | cookie名を受け取り、cookieを削除します。 |
clear() | - | すべてのcookieを削除します。 |
toString() | String | cookieの文字列表現を返します。 |
オプション
cookieを設定する際、options
オブジェクトから以下のプロパティがサポートされています:
オプション | 型 | 説明 |
---|---|---|
name | String | cookieの名前を指定します。 |
value | String | cookieに格納される値を指定します。 |
expires | Date | cookieが失効する正確な日付を定義します。 |
maxAge | Number | cookieの寿命を秒単位で設定します。 |
domain | String | cookieが利用可能なドメインを指定します。 |
path | String, default: '/' | ドメイン内の特定のパスにcookieの範囲を制限します。 |
secure | Boolean | 追加のセキュリティのために、cookieがHTTPS接続でのみ送信されることを保証します。 |
httpOnly | Boolean | cookieをHTTPリクエストに限定し、クライアント側のアクセスを防ぎます。 |
sameSite | Boolean, 'lax' , 'strict' , 'none' | cookieのクロスサイトリクエストの動作を制御します。 |
priority | String ("low" , "medium" , "high" ) | cookieの優先度を指定します。 |
encode('value') | Function | cookieの値をエンコードするために使用される関数を指定します。 |
partitioned | Boolean | cookieがpartitionedであるかどうかを示します。 |
デフォルト値が設定されている唯一のオプションはpath
です。
これらのオプションについて詳しくは、MDNドキュメントをご覧ください。
Good to know
cookies
は非同期関数であり、Promiseを返します。cookieにアクセスするにはasync/await
またはReactのuse
関数を使用する必要があります。- バージョン14以前では、
cookies
は同期関数でした。後方互換性を考慮して、Next.js 15では同期的にアクセスすることも可能ですが、この動作は将来的に廃止される予定です。
- バージョン14以前では、
cookies
はDynamic APIであり、返される値は事前に知ることができません。これをレイアウトやページで使用すると、dynamic renderingにルートがオプトインされます。.delete
メソッドは以下の場合にのみ呼び出すことができます:- server actionまたはroute handler内。
.set
が呼び出されたのと同じドメインに属している場合。ワイルドカードドメインの場合、特定のサブドメインは正確に一致する必要があります。さらに、削除したいcookieと同じプロトコル(HTTPまたはHTTPS)でコードが実行される必要があります。
- HTTPはストリーミングが開始された後にcookieを設定することを許可しないため、server actionまたはroute handlerで
.set
を使用する必要があります。
server componentにおけるcookieの動作の理解
server componentでcookieを扱う際には、cookieが基本的にクライアント側のストレージメカニズムであることを理解することが重要です:
- cookieの読み取りは、クライアントのブラウザがサーバーに送信するHTTPリクエストヘッダーのcookieデータにアクセスするため、server componentで動作します。
- cookieの設定は、route handlerやserver actionを使用しても、server component内で直接行うことはできません。これは、cookieが実際にはサーバーではなくブラウザによって保存されるためです。
サーバーは、ブラウザにcookieを保存するよう指示するためのSet-Cookie
ヘッダーを送信することしかできません。実際の保存はクライアント側で行われます。このため、状態を変更するcookie操作(.set
、.delete
、.clear
)は、レスポンスヘッダーを適切に設定できるroute handlerやserver actionで実行する必要があります。
例
cookieを取得する
(await cookies()).get('name')
メソッドを使用して、単一のcookieを取得できます:
- TypeScript
- JavaScript
import { cookies } from 'next/headers'
export default async function Page() {
const cookieStore = await cookies()
const theme = cookieStore.get('theme')
return '...'
}
import { cookies } from 'next/headers'
export default async function Page() {
const cookieStore = await cookies()
const theme = cookieStore.get('theme')
return '...'
}
すべてのcookieを取得する
(await cookies()).getAll()
メソッドを使用して、指定された名前に一致するすべてのcookieを取得できます。name
が指定されていない場合、利用可能なすべてのcookieを返します。
- TypeScript
- JavaScript
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>
))
}
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>
))
}
cookieを設定する
(await cookies()).set(name, value, options)
メソッドを使用して、server actionまたはroute handlerでcookieを設定できます。options
オブジェクトはオプションです。
- TypeScript
- JavaScript
'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: '/',
})
}
'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: '/',
})
}
cookieが存在するか確認する
(await cookies()).has(name)
メソッドを使用して、cookieが存在するかどうかを確認できます:
- TypeScript
- JavaScript
import { cookies } from 'next/headers'
export default async function Page() {
const cookieStore = await cookies()
const hasCookie = cookieStore.has('theme')
return '...'
}
import { cookies } from 'next/headers'
export default async function Page() {
const cookieStore = await cookies()
const hasCookie = cookieStore.has('theme')
return '...'
}
cookieを削除する
cookieを削除する方法は3つあります。
delete()
メソッドを使用する:
- TypeScript
- JavaScript
'use server'
import { cookies } from 'next/headers'
export async function delete(data) {
(await cookies()).delete('name')
}
'use server'
import { cookies } from 'next/headers'
export async function delete(data) {
(await cookies()).delete('name')
}
同じ名前で空の値を持つ新しいcookieを設定する:
- TypeScript
- JavaScript
'use server'
import { cookies } from 'next/headers'
export async function delete(data) {
(await cookies()).set('name', '')
}
'use server'
import { cookies } from 'next/headers'
export async function delete(data) {
(await cookies()).set('name', '')
}
maxAge
を0に設定すると、cookieは即座に失効します。maxAge
は秒単位の値を受け入れます。
- TypeScript
- JavaScript
'use server'
import { cookies } from 'next/headers'
export async function delete(data) {
(await cookies()).set('name', 'value', { maxAge: 0 })
}
'use server'
import { cookies } from 'next/headers'
export async function delete(data) {
(await cookies()).set('name', 'value', { maxAge: 0 })
}
バージョン履歴
バージョン | 変更点 |
---|---|
v15.0.0-RC | cookies は非同期関数になりました。codemodが利用可能です。 |
v13.0.0 | cookies が導入されました。 |