Route Handler'da Cookie Okumak
document.cookie route handler'da yok

api/session/route.ts içinde document.cookie yazdım. Derleme geçti sanıyordum; runtime 'document is not defined' dedi. Route handler bir tarayıcı değil. Çerez isteğin başlığında gelir, next/headers onu okur. Kendi split işimi yazınca da httpOnly çerezi görmedim; çünkü tarayıcı onu zaten JS'e vermez, sunucu ise cookies() ile verir.
import { cookies } from "next/headers";
import { NextResponse } from "next/server";
export async function GET() {
const jar = await cookies();
const session = jar.get("session")?.value;
if (!session) {
return NextResponse.json({ user: null }, { status: 401 });
}
const user = await findUserBySession(session);
return NextResponse.json({ user });
}
export async function DELETE() {
const jar = await cookies();
jar.set("session", "", {
httpOnly: true,
secure: true,
sameSite: "lax",
path: "/",
expires: new Date(0),
});
return NextResponse.json({ ok: true });
}
GET okur, DELETE düşürür. httpOnly, Secure, SameSite, path — dördü birden. Path'i /api yapmak, uygulamanın geri kalanının çerezi görmemesine yol açabilir; oturum çerezi genelde / ister. Çerezi JSON gövdesine kopyalayıp client'a vermek, httpOnly'nin anlamını iptal eder. Client 'giriş yapmış mı' diye user nesnesine bakar, ham token'a değil.
cookies() bu rotayı dinamik yapar. Edge'de çalışsın diye force-static yazmak, çerezi dondurur veya hataya düşürür. Oturum rotası dinamik kalır. Bunu üçüncü yazıdaki no-store ile aynı aileden görüyorum: kişiye özel yanıt ısınmaz.
Request'ten okumak
cookies() yoksa request.cookies.get("session") de durur. İkisi aynı kavanoz. Ben cookies() tercih ediyorum çünkü action ve sayfa ile aynı import. Route handler'ı özel bir dünya sanmak, üç yerde üç API demek. Set ederken de jar.set, Response cookie'si değilse path ve expires unutulur. NextResponse.cookies.set aynı işi görür; karıştırmamak için tek yolu seçtim.
CORS'lu bir SPA bu handler'ı başka origin'den çağırırsa çerez gitmez. sameSite ve credentials buranın konusu; form action aynı origin'de kalır. Handler'ı 'universal auth' sanmak, altıncı yazıyı dokuzuncu yazının formuna bağlar. Cookie okumak, oturumu dışarıya açmak değil. Dışarıya JSON user vermek, token vermemek. Token çerezde kalır, document onu görmez, handler görür.
Edge ve Node
runtime = 'edge' yazınca bazı cookie ve crypto API'leri daralır. Oturum imzasını Node'da doğruluyorsam handler'ı edge'e zorlamıyorum. 'Edge daha hızlı' cümlesi, çerezi okuyamayan bir runtime'da boş. cookies() edge'de de var; benim doğrulama kütüphanem yoktu. Runtime'ı cookie yüzünden değil, bağımlılık yüzünden seçiyorum.
Set-Cookie'yi JSON gövdesiyle karıştırmamak. Client'ın localStorage'a yazması için token döndürmek, altıncı yazının başındaki hatanın ters yüzü: document yok diye çerezi ele vermek. Handler okur, tarayıcı saklar, JS okumaz. Bu üç cümle durunca route handler bir sayfa gibi davranır: sunucu, gizli, dinamik. Document.cookie aramak, yanlış odada anahtar aramak.
Birden fazla çerez
Oturum, locale, csrf — üçü ayrı isim. cookies().get tek anahtar ister. Hepsini tek JSON çerezde toplamak, birini değiştirince üçünü de yazmak demek. Ayırmak, path ve maxAge'i ayrı seçmek içindir. csrf dar path, oturum geniş path. Locale JS okuyabilir; oturum okuyamaz. Aynı kavanoz, farklı kapak.
Handler'da çerezi log'a yazmam. Altıncı yazı kısa dursun diye değil, token log'da yaşamayacağı için. Okumak, dökmek değil. next/headers kapısı bu kadar. Document yok, split yok, JSON token yok. Jar var, isim var, httpOnly var.
Middleware ile karıştırmamak
Middleware de çerez okur, yönlendirir. Handler işi yapar, JSON döner. İkisini tek yer sanmak, oturumu iki kez doğrulamak veya birini unutmak. Altıncı yazı handler tarafı. Middleware kapıda bekler, handler masada okur. Document ikisinde de yoktur.
Yorumlar
Yorumlar (0)
Yorumlar üyelere açık. Üye ol · Giriş yap