cookies
cookies
は非同期関数であり、Server ComponentでHTTPの着信リクエストのcookieを読み取ったり、Server ActionsまたはRoute Handlersで送信リクエストのcookieを読み書きしたりできます。
- TypeScript
- JavaScript
app/page.tsx
import { cookies } from 'next/headers'
export default async function Page() {
const cookieStore = await cookies()
const theme = cookieStore.get('theme')
return '...'
}
app/page.js
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 | HTTPS接続でのみcookieを送信して追加のセキュリティを確保します |
httpOnly | Boolean | cookieをHTTPリクエストに限定し、クライアント側からのアクセスを防ぎます |
sameSite | Boolean, 'lax' , 'strict' , 'none' | cookieのクロスサイトリクエストの動作を制御します |
priority | String ("low" , "medium" , "high" ) | cookieの優先度を指定します |
encode('value') | Function | cookieの値をエンコードするために使用される関数を指定します |
partitioned | Boolean | cookieが分割されているかどうかを示します |
デフォルト値を持つ唯一のオプションは path
です。
これらのオプションについて詳しくはMDN ドキュメントを参照してください。
知っておくべきこと
cookies
は非同期関数であり、Promiseを返します。cookieにアクセスするにはasync/await
やReactのuse
関数を使用する必要があります- バージョン14およびそれ以前では、
cookies
は同期関数でした。互換性を保つために、Next.js 15でも同期的にアクセスできますが、この動作は将来的に非推奨となる予定です。
- バージョン14およびそれ以前では、
cookies
は、その戻り値を事前に予測することができないDynamic APIです。これをレイアウトまたはページで使用すると、そのルートは動的レンダリングになります。.delete
メソッドは以下の場合にのみ呼び出すことができます- Server Action または Route Handler内
.set
を呼び出したのと同じドメインに属する場合。また、削除したいcookieと同じプロトコル(HTTPまたはHTTPS)でコードを実行する必要があります。
- HTTPはストリーミング開始後のcookie設定を許可しないため、Server ActionまたはRoute Handlerで
.set
を使用してください。
例
cookieの取得
(await cookies()).get('name')
メソッドを使って、単一のcookieを取得できます
- TypeScript
- JavaScript
app/page.tsx
import { cookies } from 'next/headers'
export default async function Page() {
const cookieStore = await cookies()
const theme = cookieStore.get('theme')
return '...'
}
app/page.js
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
app/page.tsx
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>
))
}
app/page.js
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
app/actions.ts
'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: '/',
})
}
app/actions.js
'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
app/page.ts
import { cookies } from 'next/headers'
export default async function Page() {
const cookieStore = await cookies()
const hasCookie = cookieStore.has('theme')
return '...'
}
app/page.js
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
app/actions.ts
'use server'
import { cookies } from 'next/headers'
export async function delete(data) {
(await cookies()).delete('name')
}
app/actions.js
'use server'
import { cookies } from 'next/headers'
export async function delete(data) {
(await cookies()).delete('name')
}
同じ名前と空の値で新しいcookieを設定します
- TypeScript
- JavaScript
app/actions.ts
'use server'
import { cookies } from 'next/headers'
export async function delete(data) {
(await cookies()).set('name', '')
}
app/actions.js
'use server'
import { cookies } from 'next/headers'
export async function delete(data) {
(await cookies()).set('name', '')
}
maxAge
を0に設定すると、即座にcookieが期限切れになります。maxAge
は秒単位で指定できます
- TypeScript
- JavaScript
app/actions.ts
'use server'
import { cookies } from 'next/headers'
export async function delete(data) {
(await cookies()).set('name', 'value', { maxAge: 0 })
}
app/actions.js
'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 が導入されました |