Bun.CookieMap: แยก Cookie header แล้วแก้ค่าโดยไม่ต่อสตริงเอง
การแยก Cookie header ด้วย split(";") แล้ว split("=") พลาดง่ายเมื่อค่ามีเครื่องหมายหรือ encoding ครับ Bun.CookieMap รับ header, object หรือ iterable แล้วให้ API แบบ map สำหรับอ่าน แก้ และ serialize โดยไม่ต้องต่อสตริงเอง
WHY: ให้ parser ดูไวยากรณ์ แต่ policy ยังเป็นของเรา
Cookie header เหมือนถุงใบสั่งหลายใบคั่นด้วยเครื่องหมายเดียว Parser ช่วยแกะชื่อและค่าให้ตรงรูปแบบ แต่ไม่ได้ตอบว่า cookie ใดเชื่อถือได้, หมดอายุไหม หรือใช้ยืนยันตัวตนได้หรือไม่ เรื่องเหล่านั้นต้องผูกกับ signature, session store และ attribute ที่ response กำหนด
const cookies = new Bun.CookieMap("session=abc123; theme=dark");
if (cookies.get("session") !== "abc123") {
throw new Error("session cookie was not parsed");
}
if (cookies.get("theme") !== "dark") {
throw new Error("theme cookie was not parsed");
}
cookies.set("theme", "forest");
cookies.delete("session");
const snapshot = cookies.toJSON();
if (snapshot.theme !== "forest" || "session" in snapshot) {
throw new Error(`unexpected cookie map: ${JSON.stringify(snapshot)}`);
}
อย่าสับสน Cookie กับ Set-Cookie
Request Cookie รวมหลายคู่ชื่อ–ค่าใน header เดียว ส่วน response Set-Cookie แต่ละบรรทัดมี attributes เช่น HttpOnly, Secure, SameSite, Path และ expiry การอ่านชื่อ–ค่าได้ไม่เท่ากับตั้ง attributes ครบ อย่า serialize map ธรรมดาเป็น session cookie แล้วลืม flag ป้องกัน
ค่าจาก client ยังเป็น untrusted input ต้องจำกัดขนาดและจำนวนก่อนใช้ใน log, query หรือ cache key และ session identifier ต้องตรวจ MAC/signature หรือ lookup server-side อย่าเชื่อเพราะ parser ยอมรับรูปแบบ สำหรับ auth cookie ให้ rotate, expire และ revoke ตาม threat model ด้วย
Recap
- ใช้
CookieMapแทน parser สตริงเฉพาะกิจ - แยก semantics ของ request
Cookieกับ responseSet-Cookie - ตั้ง
HttpOnly,Secure,SameSiteและ scope ที่ response boundary - ถือค่าจาก client เป็น untrusted แม้ parse ผ่าน