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

فيكتور كوستان

ما هي 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 محدّدة، عبر واجهة برمجة التطبيقات fetch.

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

تعد واجهة برمجة التطبيقات document.cookie الشائعة مصدرًا مضمونًا إلى حد ما لتشويش تطبيقك. على سبيل المثال، كلما استخدمت دالة getter 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"
// }

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

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

// undefined

الملاحظة وعدم المشاركة في استطلاعات

يكتشف أحد التطبيقات الشائعة للوصول إلى ملفات تعريف الارتباط من JavaScript متى يسجّل المستخدم خروجه ويحدّث واجهة المستخدم. ويتم إجراء ذلك حاليًا من خلال إجراء استطلاعات رأي 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 API للعاملين في مجال الخدمة بسبب التصميم المتزامن. تكون واجهة برمجة تطبيقات 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 Blink.

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

مراجع إضافية