cookies
cookies
は、サーバーコンポーネントでHTTP受信リクエストのCookieを読み取ったり、サーバーアクションまたはルートハンドラで送信リクエストのCookieを読み書きしたりできる非同期関数です。
import { cookies } from 'next/headers'
export default async function Page() {
const cookieStore = await cookies()
const theme = cookieStore.get('theme')
return '...'
}
リファレンス
メソッド
以下のメソッドが利用可能です
メソッド | 戻り値の型 | 説明 |
---|---|---|
get('name') | オブジェクト | Cookie名を指定して、名前と値を持つオブジェクトを返します。 |
getAll() | オブジェクトの配列 | 一致する名前を持つすべてのCookieのリストを返します。 |
has('name') | ブーリアン | Cookie名を指定して、Cookieが存在するかどうかに基づいてブーリアンを返します。 |
set(name, value, options) | - | Cookie名、値、およびオプションを受け取り、送信リクエストのCookieを設定します。 |
delete(name) | - | Cookie名を指定してCookieを削除します。 |
clear() | - | すべてのCookieを削除します。 |
toString() | 文字列 | Cookieの文字列表現を返します。 |
オプション
Cookieを設定する際、options
オブジェクトの以下のプロパティがサポートされています
オプション | 型 | 説明 |
---|---|---|
name | 文字列 | Cookieの名前を指定します。 |
value | 文字列 | Cookieに保存する値を指定します。 |
expires | 日付 | Cookieが期限切れになる正確な日付を定義します。 |
maxAge | 数値 | Cookieの有効期間を秒単位で設定します。 |
domain | 文字列 | Cookieが利用可能なドメインを指定します。 |
path | 文字列, デフォルト: '/' | Cookieのスコープをドメイン内の特定のパスに制限します。 |
secure | ブーリアン | セキュリティ向上のため、CookieがHTTPS接続経由でのみ送信されるようにします。 |
httpOnly | ブーリアン | CookieをHTTPリクエストに制限し、クライアントサイドからのアクセスを防止します。 |
sameSite | ブーリアン, 'lax' , 'strict' , 'none' | Cookieのクロスサイトリクエストの挙動を制御します。 |
priority | 文字列 ("low" , "medium" , "high" ) | Cookieの優先度を指定します |
encode('value') | 関数 | Cookieの値をエンコードするために使用される関数を指定します。 |
partitioned | ブーリアン | Cookieがパーティション化されているかどうかを示します。 |
デフォルト値を持つ唯一のオプションはpath
です。
これらのオプションの詳細については、MDNドキュメントを参照してください。
知っておくと良いこと
cookies
はPromiseを返す非同期関数です。Cookieにアクセスするには、async/await
またはReactのuse
関数を使用する必要があります。- バージョン14以前では、
cookies
は同期関数でした。下位互換性のために、Next.js 15では引き続き同期的にアクセスできますが、この挙動は将来的に非推奨になります。
- バージョン14以前では、
cookies
は、返される値が事前に不明な動的APIです。レイアウトやページでこれを使用すると、そのルートは動的レンダリングにオプトインされます。.delete
メソッドは、以下の条件でのみ呼び出すことができます。- HTTPではストリーミング開始後にCookieを設定することは許可されていないため、サーバーアクションまたはルートハンドラ内で
.set
を使用する必要があります。
サーバーコンポーネントでのCookieの挙動を理解する
サーバーコンポーネントでCookieを扱う際、Cookieが本質的にクライアントサイドのストレージメカニズムであることを理解することが重要です。
- Cookieの読み取りは、クライアントのブラウザがHTTPリクエストヘッダーでサーバーに送信するCookieデータにアクセスするため、サーバーコンポーネントで機能します。
- Cookieの設定は、ルートハンドラまたはサーバーアクションを使用している場合でも、サーバーコンポーネントで直接行うことはできません。これは、Cookieがサーバーではなくブラウザによって実際に保存されるためです。
サーバーは、ブラウザにCookieを保存するよう指示(Set-Cookie
ヘッダー経由)を送ることしかできません。実際の保存はクライアントサイドで行われます。これが、状態を変更するCookie操作(.set
、.delete
、.clear
)を、レスポンスヘッダーが適切に設定できるルートハンドラまたはサーバーアクションで実行する必要がある理由です。
例
Cookieの取得
(await cookies()).get('name')
メソッドを使用して単一のCookieを取得できます
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が返されます。
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)
メソッドを使用してCookieを設定できます。options
オブジェクトはオプションです。
'use server'
import { cookies } from 'next/headers'
export async function create(data) {
const cookieStore = await cookies()
cookieStore.set('name', 'lee')
// or
cookieStore.set('name', 'lee', { secure: true })
// or
cookieStore.set({
name: 'name',
value: 'lee',
httpOnly: true,
path: '/',
})
}
Cookieの存在確認
(await cookies()).has(name)
メソッドを使用してCookieが存在するかどうかを確認できます
import { cookies } from 'next/headers'
export default async function Page() {
const cookieStore = await cookies()
const hasCookie = cookieStore.has('theme')
return '...'
}
Cookieの削除
Cookieを削除するには3つの方法があります。
• delete()
メソッドを使用する
'use server'
import { cookies } from 'next/headers'
export async function delete(data) {
(await cookies()).delete('name')
}
• 同じ名前で空の値を持つ新しいCookieを設定する
'use server'
import { cookies } from 'next/headers'
export async function delete(data) {
(await cookies()).set('name', '')
}
• maxAge
を0に設定すると、Cookieは即座に期限切れになります。maxAge
は秒単位の値を受け取ります。
'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 が導入されました。 |
この情報は役立ちましたか?