Cookie Store API คืออะไร
Cookie Store API จะแสดงคุกกี้ HTTP แก่ Service Worker และ
เสนอทางเลือกแบบไม่พร้อมกันสำหรับ document.cookie
API ช่วยให้
ดำเนินการต่อไปนี้ได้ง่ายขึ้น
- หลีกเลี่ยงข้อขัดข้องในเทรดหลักด้วยการเข้าถึงคุกกี้แบบไม่พร้อมกัน
- หลีกเลี่ยงการหยั่งสัญญาณสำหรับคุกกี้ เนื่องจากการเปลี่ยนแปลงต่างๆ กับคุกกี้อาจสังเกตได้
- เข้าถึงคุกกี้จาก Service Worker
สถานะปัจจุบัน
ขั้นตอน | สถานะ |
---|---|
1. สร้างคำอธิบาย | เสร็จสมบูรณ์ |
2. สร้างข้อกำหนดคร่าวๆ เบื้องต้น | เสร็จสมบูรณ์ |
**3. รวบรวมความคิดเห็นและ ทำซ้ำตามข้อกำหนด** | **กำลังดำเนินการ** |
4. ช่วงทดลองใช้จากต้นทาง | หยุดชั่วคราว |
5. เปิดตัว | ยังไม่เริ่ม |
ฉันจะใช้การจัดเก็บคุกกี้แบบไม่พร้อมกันได้อย่างไร
เปิดใช้ช่วงทดลองใช้จากต้นทาง
หากต้องการลองใช้ในเครื่อง คุณเปิดใช้ API ในบรรทัดคำสั่งได้
chrome --enable-blink-features=CookieStore
การส่งผ่านแฟล็กนี้ในบรรทัดคำสั่งจะเปิดใช้ API ได้ทั่วโลกใน Chrome สำหรับ เซสชันปัจจุบัน
หรือคุณจะเปิดใช้ #enable-experimental-web-platform-features
ก็ได้
ธงในchrome://flags
คุณ (อาจจะ) ไม่ต้องการคุกกี้
ก่อนที่จะเจาะลึกเรื่อง API ใหม่ เราอยากทราบว่าคุกกี้ยังคงเป็นเว็บ พื้นที่เก็บข้อมูลดั้งเดิมที่แย่ที่สุดในฝั่งไคลเอ็นต์ของแพลตฟอร์ม และควรใช้เป็น ทางเลือกสุดท้าย นี่ไม่ใช่เรื่องบังเอิญ คุกกี้เป็นฝั่งไคลเอ็นต์แรกของเว็บ พื้นที่เก็บข้อมูล และเราได้เรียนรู้สิ่งต่างๆ มากมายนับตั้งแต่นั้น
เหตุผลหลักในการหลีกเลี่ยงคุกกี้ ได้แก่
คุกกี้จะนำสคีมาพื้นที่เก็บข้อมูลไปไว้ในแบ็กเอนด์ API คำขอ HTTP แต่ละรายการจะมีสแนปชอตของโถคุกกี้ วิธีนี้ช่วยให้คุณ วิศวกรระบบแบ็กเอนด์ที่จะแนะนำทรัพยากร Dependency ในรูปแบบคุกกี้ปัจจุบัน ครั้งเดียว ในกรณีนี้ ส่วนหน้าของจะเปลี่ยนสคีมาพื้นที่เก็บข้อมูลไม่ได้หากไม่ทำให้ใช้งานได้ การเปลี่ยนแปลงที่ตรงกันกับแบ็กเอนด์
คุกกี้มีรูปแบบการรักษาความปลอดภัยที่ซับซ้อน ฟีเจอร์ของแพลตฟอร์มเว็บสมัยใหม่เป็นไปตามนโยบายต้นทางเดียวกัน ซึ่งหมายความว่า แต่ละแอปพลิเคชันจะมีแซนด์บ็อกซ์ของตัวเอง และเป็นอิสระจาก แอปพลิเคชันอื่นๆ ที่ผู้ใช้อาจใช้งานอยู่ ขอบเขตของคุกกี้ ทำให้เรื่องราวด้านความปลอดภัยซับซ้อนขึ้นมาก สรุปที่จะเพิ่มขนาดของบทความนี้เป็น 2 เท่า
คุกกี้มีค่าใช้จ่ายประสิทธิภาพสูง เบราว์เซอร์ต้องรวมภาพรวมของ คุกกี้ของคุณในคำขอ HTTP ทุกรายการ ดังนั้น การเปลี่ยนแปลงกับคุกกี้ทุกครั้ง กระจายไปยังพื้นที่เก็บข้อมูลและสแต็กเครือข่ายต่างๆ เบราว์เซอร์สมัยใหม่มี การใช้การจัดเก็บคุกกี้ที่เพิ่มประสิทธิภาพ แต่เราไม่สามารถทำได้ คุกกี้มีประสิทธิภาพเทียบเท่ากับกลไกการจัดเก็บข้อมูลอื่นๆ ลงในสแต็กเครือข่าย
ด้วยเหตุผลข้างต้นทั้งหมด เว็บแอปพลิเคชันสมัยใหม่จึงควรหลีกเลี่ยงคุกกี้และ แต่จะจัดเก็บตัวระบุเซสชันไว้ใน IndexedDB และ เพิ่มตัวระบุลงในส่วนหัวหรือเนื้อหาในคำขอ HTTP ที่เจาะจง ผ่าน API การดึงข้อมูล
อย่างไรก็ตาม คุณยังคงอ่านบทความนี้ เนื่องจากคุณมี เหตุผลที่ควรใช้คุกกี้...
อ่านคุกกี้และลดการกระตุก
ผู้น่าเคารพ
document.cookie
API เป็นแหล่งที่มาของการกระเพื่อมที่เหมาะสมสำหรับแอปพลิเคชันของคุณ ตัวอย่างเช่น
เมื่อใดก็ตามที่คุณใช้ Getter document.cookie
เบราว์เซอร์จะต้องหยุดดำเนินการ
JavaScript จนกว่าจะมีข้อมูลคุกกี้ที่คุณขอ การดำเนินการนี้อาจใช้เวลา
ประมวลผล Hop หรือดิสก์อ่าน และจะทำให้ UI ของคุณกระตุก
การแก้ไขปัญหาที่ตรงไปตรงมาคือการเปลี่ยนจาก document.cookie
Getter ไปยัง Cookie Store API แบบอะซิงโครนัส
await cookieStore.get('session_id');
// {
// domain: "example.com",
// expires: 1593745721000,
// name: "session_id",
// path: "/",
// sameSite: "unrestricted",
// secure: true,
// value: "yxlgco2xtqb.ly25tv3tkb8"
// }
สามารถแทนที่ตัวตั้งค่า document.cookie
ได้ในลักษณะเดียวกัน โปรดทราบ
ว่ามีการรับประกันว่าการเปลี่ยนแปลงดังกล่าวจะถูกนำไปใช้หลังจาก Promise ส่งคืนโดย
cookieStore.set
แก้ปัญหา
await cookieStore.set({name: 'opt_out', value: '1'});
// undefined
สังเกตการณ์ ไม่สำรวจ
แอปพลิเคชันที่ได้รับความนิยมสำหรับการเข้าถึงคุกกี้จาก JavaScript ตรวจพบเมื่อ
ผู้ใช้ออกจากระบบและอัปเดต UI ซึ่งขณะนี้ทำได้โดยแบบสำรวจ
document.cookie
ทำให้เกิดการกระตุกและส่งผลเสียต่อแบตเตอรี่
ชีวิต
Cookie Store API เป็นอีกทางเลือกหนึ่งในการสังเกตการณ์คุกกี้ การเปลี่ยนแปลง ซึ่งไม่จำเป็นต้องมีแบบสำรวจ
cookieStore.addEventListener('change', event => {
for (const cookie of event.changed) {
if (cookie.name === 'session_id') sessionCookieChanged(cookie.value);
}
for (const cookie of event.deleted) {
if (cookie.name === 'session_id') sessionCookieChanged(null);
}
});
ยินดีต้อนรับ Service Worker
ระบบยังไม่ได้สร้าง document.cookie
API เนื่องจากการออกแบบให้ซิงโครนัส
พร้อมใช้งานสำหรับ
Service Worker
Cookie Store API ทำงานไม่พร้อมกัน ดังนั้นจึงได้รับอนุญาตให้ให้บริการ
ผู้ปฏิบัติงาน
การโต้ตอบกับคุกกี้จะทำงานในลักษณะเดียวกันในบริบทของเอกสารและใน Service Worker
// Works in documents and service workers.
async function logOut() {
await cookieStore.delete('session_id');
}
อย่างไรก็ตาม การสังเกตการเปลี่ยนแปลงของคุกกี้จะแตกต่างออกไปเล็กน้อยใน Service Worker การปลุก โปรแกรมทำงานของบริการอาจมีค่าใช้จ่ายสูง เราจึงต้องอธิบาย การเปลี่ยนแปลงคุกกี้ที่พนักงานสนใจ
ในตัวอย่างด้านล่าง แอปพลิเคชันที่ใช้ IndexedDB เพื่อแคชข้อมูลผู้ใช้ ตรวจสอบการเปลี่ยนแปลงของคุกกี้เซสชัน และทิ้งข้อมูลที่แคชไว้เมื่อ ผู้ใช้ออกจากระบบ
// Specify the cookie changes we're interested in during the install event.
self.addEventListener('install', event => {
event.waitUntil(cookieStore.subscribeToChanges([{name: 'session_id'}]));
});
// Delete cached data when the user logs out.
self.addEventListener('cookiechange', event => {
for (const cookie of event.deleted) {
if (cookie.name === 'session_id') {
indexedDB.deleteDatabase('user_cache');
break;
}
}
});
แนวทางปฏิบัติแนะนำ
เร็วๆ นี้
ความคิดเห็น
หากลองใช้ API นี้ โปรดแจ้งให้เราทราบว่าคุณคิดอย่างไร โปรดส่งโดยตรง
ความคิดเห็นเกี่ยวกับรูปร่าง API ไปยัง
ข้อมูลจำเพาะ
และรายงานข้อบกพร่องการใช้งานไปยัง
Blink>Storage>CookiesAPI
คอมโพเนนต์กะพริบ
เราสนใจที่จะเรียนรู้เกี่ยวกับการวัดประสิทธิภาพและการใช้ นอกเหนือจากกรณีที่ระบุไว้ในคำอธิบาย
แหล่งข้อมูลเพิ่มเติม
- คำอธิบายแบบสาธารณะ
- ข้อกำหนด
- ข้อบกพร่องในการติดตาม
- รายการ chromestatus.com
- ชุดข้อความของ WICG
- คอมโพเนนต์การกะพริบ:
Blink>Storage>CookiesAPI