🍪
【Next.js】クライアント、サーバー別 Cookie操作の備忘録
はじめに
Next.jsでCookieを取得したり、設定したりする方法はサーバーサイドとクライアントサイドで異なります。
それらを整理しました。
クライアントサイドでのCookie操作
クライアントサイドでは、ブラウザのAPI(document.cookie
)を使用するか、ライブラリを使用してCookieを操作できます。
document.cookie
)を使用する
ブラウザのAPI(正規関数を用いたユーティリティ関数を使用して、ブラウザのAPIでCookie操作する例です。
後続のライブラリを使用する方法の方が簡潔に書けるのでおすすめです。
Cookieを取得する
export function getCookie(name: string): string | null {
if (typeof document === 'undefined') return null;
const match = document.cookie.match(new RegExp(`(^| )${name}=([^;]+)`));
return match ? decodeURIComponent(match[2]) : null;
}
Cookieを設定する
export function setCookie(name: string, value: string, days?: number): void {
if (typeof document === 'undefined') return;
let expires = '';
if (days) {
const date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
expires = `; expires=${date.toUTCString()}`;
}
document.cookie = `${name}=${encodeURIComponent(value)}${expires}; path=/`;
}
Cookieを削除する
export function deleteCookie(name: string): void {
if (typeof document === 'undefined') return;
document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;
}
js-cookie
などのライブラリを使用する
js-cookie
などのライブラリを使用することで簡潔にCookie操作することができます。
import Cookies from 'js-cookie';
Cookieを取得する
export function getCookie(name: string): string | undefined {
return Cookies.get(name);
}
// 全てのCookieを取得する
export function getAllCookies(): Record<string, string> {
return Cookies.get();
}
Cookieを設定する
export function setCookie(name: string, value: string, days?: number): void {
Cookies.set(name, value, { expires: days, path: '/' });
}
Cookieを削除する
export function deleteCookie(name: string): void {
Cookies.remove(name, { path: '/' });
}
サーバーサイドでのCookie操作
Next.jsのApp Routerでは、サーバーコンポーネントやRoute Handlersでクッキーを操作できます。
Next.js のcookies関数が用意されています。
import { cookies } from 'next/headers';
Cookieを取得する
const value = cookies().get(name)?.value;
// すべてのCookieを取得する
const allCookies = cookies().getAll();
Cookieを設定する
cookies().set({
name,
value,
httpOnly: true,
path: '/',
secure: process.env.NODE_ENV === 'production',
maxAge: maxAge || 60 * 60 * 24 * 7, // デフォルト1週間
sameSite: 'strict'
});
Cookieを削除する
cookies().delete(name);
まとめ
以上、Cookie操作の備忘録でした!
Discussion