Server Component chỉ được đọc cookie. Ghi sẽ ném lỗi kiểu Cookies can only be modified in a Server Action or Route Handler.
Lý do: response có thể đã bắt đầu stream khi component render, thậm chí output của route có thể đang được lấy từ cache — không còn thời điểm hợp lệ để gắn header Set-Cookie. Chỉ những nơi tương ứng một request có response chưa gửi mới ghi được: Server Action, Route Handler, Middleware.
// app/actions/login.ts
'use server'
import { cookies } from 'next/headers'
export async function login(formData: FormData) {
const session = await createSession(formData)
const store = await cookies()
store.set('session', session.token, { httpOnly: true, secure: true, sameSite: 'lax', path: '/' })
}Hệ quả về rendering cần nắm: chỉ cần đọc cookies(), headers(), draftMode() hoặc searchParams là route bị opt-out khỏi static render và chuyển sang dynamic. Đó là lý do một trang đang static bỗng bị render lại mỗi request sau khi thêm một dòng đọc cookie — trong log build, route đổi từ ký hiệu static sang dynamic.
Muốn giữ phần lớn trang static thì tách phần phụ thuộc cookie xuống component con và bọc <Suspense>, để phần vỏ vẫn được prerender.