الوصول غير المتزامن إلى ملفات تعريف ارتباط HTTP

Victor Costan

ما هي Cookie Store API؟

تعرض Cookie Store API ملفات تعريف ارتباط HTTP للعاملين في الخدمة يوفّر بديلاً غير متزامن لـ document.cookie. تجعل واجهة برمجة التطبيقات من الأسهل:

  • تجنب التعطل في سلسلة التعليمات الرئيسية، من خلال الوصول إلى ملفات تعريف الارتباط بشكل غير متزامن.
  • تجنب البحث عن ملفات تعريف الارتباط، إذ يمكن ملاحظة تغييرات في ملفات تعريف الارتباط.
  • الوصول إلى ملفات تعريف الارتباط من مشغّلي الخدمات.

قراءة الشرح

الوضع الحالي

الخطوة الحالة
1. إنشاء شرح مكتمل
2. إنشاء مسودة أولية للمواصفات مكتمل
**3- جمع الملاحظات تكرار المواصفات** **قيد التقدّم**
4. مرحلة التجربة والتقييم متوقف مؤقتًا
5- إطلاق Not started

كيف يمكنني استخدام مخزن ملفات تعريف الارتباط غير المتزامن؟

تفعيل مرحلة التجربة والتقييم

لتجربتها محليًا، يمكن تفعيل واجهة برمجة التطبيقات في سطر الأوامر:

chrome --enable-blink-features=CookieStore

يؤدي تمرير هذه العلامة في سطر الأوامر إلى تفعيل واجهة برمجة التطبيقات بشكل عام في Chrome لما يلي: الجلسة الحالية.

ويمكنك بدلاً من ذلك تفعيل "#enable-experimental-web-platform-features" إبلاغ في chrome://flags.

لا تحتاج (على الأرجح) إلى استخدام ملفات تعريف الارتباط

قبل التعمق في واجهة برمجة التطبيقات الجديدة، أود أن أوضح أن ملفات تعريف الارتباط لا تزال موجودة على الويب هو الأسوأ من حيث الميزات الأساسية للتخزين من جهة العميل على المنصة، ويجب أن يتم استخدامها الملاذ الأخير. هذا ليس من قبيل الصدفة، فقد كانت ملفات تعريف الارتباط أول من يجريه العميل على الويب. وتعلمنا الكثير منذ ذلك الحين.

إليك الأسباب الرئيسية لتجنُّب استخدام ملفات تعريف الارتباط:

  • تنقل ملفات تعريف الارتباط مخطط التخزين إلى واجهة برمجة التطبيقات الخلفية. ويحمل كل طلب HTTP لقطة لوعاء ملف تعريف الارتباط. هذا يسهل على لمهندسي الواجهة الخلفية تقديم تبعيات على التنسيق الحالي لملفات تعريف الارتباط. مرة واحدة وبالتالي، لا يمكن للواجهة الأمامية تغيير مخطط التخزين بدون نشر تغيير مطابق للواجهة الخلفية.

  • تحتوي ملفات تعريف الارتباط على نموذج أمان معقّد. تتّبع ميزات منصة الويب الحديثة سياسة المصدر نفسها، ما يعني أنّ يحصل كل تطبيق على وضع الحماية الخاص به، ويكون مستقلاً تمامًا عن التطبيقات الأخرى التي قد يشغّلها المستخدم. نطاقات ملفات تعريف الارتباط إلى قصة أمنية أكثر تعقيدًا، والاكتفاء بمحاولة تلخيصها، وهذا من شأنه أن يضاعف حجم هذه المقالة.

  • تتميز ملفات تعريف الارتباط بتكاليف عالية الأداء. ينبغي أن تتضمن المتصفحات لقطة ملفات تعريف الارتباط في كل طلب HTTP، ولذلك يجب أن يكون كل تغيير في ملفات تعريف الارتباط عبر مكدسات التخزين والشبكات. تحتوي المتصفحات الحديثة على عمليات أفضل لتخزين ملفات تعريف الارتباط، ولكننا لن نتمكن مطلقًا من ملفات تعريف الارتباط فعالة مثل آليات التخزين الأخرى، والتي لا تحتاج إلى التحدث إلى مكدس الشبكة.

لكل الأسباب المذكورة أعلاه، يجب أن تتجنب تطبيقات الويب الحديثة ملفات تعريف الارتباط بدلاً من ذلك تخزين معرف الجلسة في IndexedDB إضافة المعرّف صراحةً إلى رأس أو نص طلبات HTTP محددة، عبر واجهة برمجة تطبيقات جلب

ومع ذلك، ما زلت تقرأ هذه المقالة لأنك تتمتع سبب استخدام ملفات تعريف الارتباط...

الموقر document.cookie تعد واجهة برمجة التطبيقات مصدرًا مضمونًا إلى حد ما لأعطال التطبيق. على سبيل المثال: عندما تستخدم الخطأ document.cookie، يجب أن يتوقف المتصفّح عن التنفيذ. JavaScript إلى أن تحصل على معلومات ملف تعريف الارتباط التي طلبتها. يمكن أن يستغرق ذلك قفزة معالجة أو قراءة القرص، وستؤدي إلى عطل في واجهة المستخدم.

يمكنك حلّ هذه المشكلة مباشرةً من خلال التبديل من document.cookie. الانتقال إلى واجهة برمجة تطبيقات Cookie Store غير المتزامنة.

await cookieStore.get('session_id');

// {
//   domain: "example.com",
//   expires: 1593745721000,
//   name: "session_id",
//   path: "/",
//   sameSite: "unrestricted",
//   secure: true,
//   value: "yxlgco2xtqb.ly25tv3tkb8"
// }

يمكن استبدال أداة setter document.cookie بطريقة مشابهة. ملاحظات يجب أخذها في الاعتبار أن التغيير مضمون فقط بعد إرجاع الوعد بواسطة يعالج cookieStore.set.

await cookieStore.set({name: 'opt_out', value: '1'});

// undefined

الملاحظة وليس الاستطلاع

هناك تطبيق شائع للوصول إلى ملفات تعريف الارتباط من جافا سكريبت يكشف عن تسجيل خروج المستخدم، وتحديث واجهة المستخدم. يتم ذلك حاليًا من خلال الاستطلاعات تؤدي هذه السياسة إلى إيقاف ميزة "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);
  }
});

الترحيب بمشغّلي الخدمات

لم يتم إنشاء واجهة برمجة تطبيقات document.cookie بسبب التصميم المتزامن متاح لـ عاملي الخدمات. واجهة برمجة تطبيقات Cookie Store غير متزامنة، ولذلك يُسمح باستخدامها في الخدمة العمال.

يعمل التفاعل مع ملفات تعريف الارتباط بالطريقة نفسها في سياقات المستندات عاملي الخدمة.

// Works in documents and service workers.
async function logOut() {
  await cookieStore.delete('session_id');
}

مع ذلك، تختلف ملاحظة التغييرات في ملفات تعريف الارتباط قليلاً في عاملي الخدمة. الاستيقاظ عامل الخدمة قد يكون باهظ الثمن، لذلك ينبغي أن نوضح بوضوح تغييرات ملفات تعريف الارتباط التي يهتم بها العامل.

في المثال أدناه، أحد التطبيقات التي تستخدم 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;
    }
  }
});

أفضل الممارسات

سيتوفر قريبًا.

ملاحظات

إذا كنت تريد تجربة واجهة برمجة التطبيقات هذه، يُرجى إخبارنا برأيك. يُرجى توجيه ملاحظات حول شكل واجهة برمجة التطبيقات مستودع المواصفات وأبلغ عن أخطاء التنفيذ Blink>Storage>CookiesAPI وميض

ونولي اهتمامًا خاصًا بمعرفة معلومات حول قياسات الأداء واستخدامها أي حالات غير تلك الموضّحة في موضَّح الفيديو.

مراجع إضافية