API การเข้าถึงพื้นที่เก็บข้อมูล

Chrome กำลังยุติการสนับสนุนคุกกี้ของบุคคลที่สามเพื่อลดการติดตามข้ามเว็บไซต์ ซึ่งถือเป็นความท้าทายอย่างมากสำหรับเว็บไซต์และบริการที่ต้องอาศัยคุกกี้ในบริบทที่ฝังไว้ในเส้นทางของผู้ใช้ เช่น การตรวจสอบสิทธิ์ Storage Access API (SAA) ช่วยให้ Use Case เหล่านี้ทำงานต่อไปได้และจํากัดการติดตามข้ามเว็บไซต์ให้ได้มากที่สุด

สถานะการใช้งาน

การสนับสนุนเบราว์เซอร์

  • 119
  • 85
  • 65
  • 11.1

แหล่งที่มา

Storage Access API พร้อมใช้งานในเบราว์เซอร์หลักๆ ทั้งหมด แต่มีความแตกต่างในการใช้งานเล็กน้อยระหว่างเบราว์เซอร์ต่างๆ ความแตกต่างเหล่านี้ได้รับการไฮไลต์ไว้ในส่วนที่เกี่ยวข้องของโพสต์นี้

งานยังคงแก้ไขปัญหาการบล็อกที่เหลืออยู่ทั้งหมดอย่างต่อเนื่องก่อนที่จะทำให้ API เป็นมาตรฐาน

Storage Access API คืออะไร

Storage Access API คือ JavaScript API ที่อนุญาตให้ iframe ขอสิทธิ์เข้าถึงพื้นที่เก็บข้อมูลเมื่อการตั้งค่าเบราว์เซอร์อาจปฏิเสธการเข้าถึง ฝังพร้อม Use Case ที่ขึ้นอยู่กับการโหลดทรัพยากรข้ามเว็บไซต์จะใช้ API เพื่อขอสิทธิ์เข้าถึงจากผู้ใช้ตามความจำเป็นได้

หากคำขอพื้นที่เก็บข้อมูลได้รับอนุมัติ iframe จะมีสิทธิ์เข้าถึงคุกกี้ข้ามเว็บไซต์ ซึ่งพร้อมใช้งานเมื่อผู้ใช้เข้าชมในฐานะเว็บไซต์ระดับบนสุด

Storage Access API ช่วยให้ผู้ใช้ปลายทางเข้าถึงคุกกี้ข้ามเว็บไซต์ได้โดยสร้างภาระให้ผู้ใช้ปลายทางน้อยที่สุด ในขณะเดียวกันก็ยังป้องกันไม่ให้มีการเข้าถึงคุกกี้ข้ามเว็บไซต์ทั่วไปเหมือนอย่างที่ใช้ในการติดตามผู้ใช้

Use Case

การฝังของบุคคลที่สามบางรายการต้องมีสิทธิ์เข้าถึงคุกกี้ข้ามเว็บไซต์เพื่อให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ดีขึ้น ซึ่งเป็นสิ่งที่จะใช้ไม่ได้หลังจากที่เลิกใช้งานคุกกี้ของบุคคลที่สามแล้ว

กรณีการใช้งานมีดังนี้

  • วิดเจ็ตการแสดงความคิดเห็นแบบฝังซึ่งต้องดูรายละเอียดเซสชันการลงชื่อเข้าใช้
  • ปุ่ม "ชอบ" บนโซเชียลมีเดียซึ่งต้องมีรายละเอียดเซสชันการเข้าสู่ระบบ
  • เอกสารที่ฝังซึ่งต้องมีรายละเอียดเซสชันการเข้าสู่ระบบ
  • ประสบการณ์การใช้งานระดับพรีเมียมที่มีให้สำหรับการฝังวิดีโอ (เช่น เพื่อไม่แสดงโฆษณาสำหรับผู้ใช้ที่ลงชื่อเข้าสู่ระบบ หรือต้องการทราบค่ากำหนดของผู้ใช้สำหรับคำบรรยายหรือจำกัดวิดีโอบางประเภท)
  • ระบบการชำระเงินแบบฝัง

กรณีการใช้งานเหล่านี้จำนวนมากเกี่ยวข้องกับการเข้าสู่ระบบใน iframe ที่ฝังไว้

กรณีที่ควรใช้ Storage Access API มากกว่า API อื่นๆ

Storage Access API เป็นทางเลือกหนึ่งนอกเหนือจากการใช้คุกกี้ของบุคคลที่สาม คุณจึงควรทราบว่าเมื่อใดควรใช้ API นี้เมื่อเทียบกับตัวอื่นๆ แต่มีไว้สำหรับกรณีการใช้งานที่ทั้งสองกรณีต่อไปนี้เป็นจริง

  • ผู้ใช้จะโต้ตอบกับเนื้อหาที่ฝัง ซึ่งหมายความว่าไม่ใช่ iframe แบบแพสซีฟหรือ iframe ที่ซ่อนอยู่
  • ผู้ใช้เข้าชมต้นทางที่ฝังในบริบทระดับบนสุด กล่าวคือ เมื่อต้นทางนั้นไม่ได้ฝังในเว็บไซต์อื่น

เรามี API ทางเลือกสำหรับการใช้งานที่หลากหลาย ดังนี้

  • คุกกี้ที่มีสถานะพาร์ติชันอิสระ (CHIPS) ช่วยให้นักพัฒนาซอฟต์แวร์เลือกใช้คุกกี้ในพื้นที่เก็บข้อมูลที่ "แบ่งพาร์ติชันแล้ว" โดยมีโถคุกกี้แยกต่างหากสำหรับแต่ละเว็บไซต์ระดับบนสุด เช่น วิดเจ็ตแชทบนเว็บของบุคคลที่สามอาจอาศัยการตั้งค่าคุกกี้เพื่อบันทึกข้อมูลเซสชัน ข้อมูลเซสชันจะได้รับการบันทึกไว้ตามเว็บไซต์นั้นๆ ดังนั้น คุกกี้ที่ตั้งค่าโดยวิดเจ็ตจึงไม่จําเป็นต้องมีการเข้าถึงในเว็บไซต์อื่นๆ ที่มีการฝังไว้เช่นกัน Storage Access API จะมีประโยชน์เมื่อวิดเจ็ตของบุคคลที่สามที่ฝังอยู่อาศัยการแชร์ข้อมูลเดียวกันในต้นทางต่างๆ (เช่น รายละเอียดหรือค่ากำหนดเซสชันที่เข้าสู่ระบบ)
  • ชุดเว็บไซต์ที่เกี่ยวข้อง (RWS) เป็นวิธีสำหรับองค์กรในการประกาศความสัมพันธ์ระหว่างเว็บไซต์ เพื่อให้เบราว์เซอร์อนุญาตการเข้าถึงคุกกี้ของบุคคลที่สามแบบจำกัดเพื่อวัตถุประสงค์บางอย่าง เว็บไซต์ยังคงต้องขอสิทธิ์เข้าถึงด้วย Storage Access API แต่เว็บไซต์ภายในชุดจะให้สิทธิ์เข้าถึงได้โดยไม่ต้องมีข้อความแจ้งจากผู้ใช้
  • การจัดการข้อมูลเข้าสู่ระบบแบบรวมศูนย์ (FedCM) คือแนวทางการรักษาความเป็นส่วนตัวของบริการระบุตัวตนแบบรวมศูนย์ Storage Access API จะจัดการกับคุกกี้หลังการเข้าสู่ระบบ สำหรับการใช้งานในบางกรณี FedCM เป็นโซลูชันทางเลือกสำหรับ Storage Access API และอาจเหมาะสมกว่าเนื่องจากมีข้อความแจ้งของเบราว์เซอร์ที่เน้นการเข้าสู่ระบบมากกว่า อย่างไรก็ตาม การนำ FedCM มาใช้มักต้องเปลี่ยนแปลงโค้ดเพิ่มเติม เช่น เพื่อรองรับปลายทาง HTTP
  • นอกจากนี้ยังมี API ป้องกันการฉ้อโกง ที่เกี่ยวข้องกับโฆษณา และการวัดผลด้วย และ Storage Access API ไม่ได้มีไว้เพื่อแก้ปัญหาดังกล่าว

การใช้ Storage Access API

Storage Access API มีวิธีการตามที่สัญญาไว้ 2 วิธีดังนี้

และยังผสานรวมกับ Permissions API ด้วย วิธีนี้จะช่วยให้คุณตรวจสอบสถานะของสิทธิ์เข้าถึงพื้นที่เก็บข้อมูลในบริบทของบุคคลที่สามได้ ซึ่งจะระบุว่าการเรียก document.requestStorageAccess() จะได้รับโดยอัตโนมัติหรือไม่

การใช้เมธอด hasStorageAccess()

เมื่อโหลดเว็บไซต์เป็นครั้งแรก เว็บไซต์จะใช้เมธอด hasStorageAccess() เพื่อตรวจสอบว่าได้ให้สิทธิ์เข้าถึงคุกกี้ของบุคคลที่สามแล้วหรือยัง

// Set a hasAccess boolean variable which defaults to false.
let hasAccess = false;

async function handleCookieAccessInit() {
  if (!document.hasStorageAccess) {
    // Storage Access API is not supported so best we can do is
    // hope it's an older browser that doesn't block 3P cookies.
    hasAccess = true;
  } else {
    // Check whether access has been granted via the Storage Access API.
    // Note on page load this will always be false initially so we could be
    // skipped in this example, but including for completeness for when this
    // is not so obvious.
    hasAccess = await document.hasStorageAccess();
    if (!hasAccess) {
      // Handle the lack of access (covered later)
    }
  }
  if (hasAccess) {
    // Use the cookies.
  }
}
handleCookieAccessInit();

ระบบจะให้สิทธิ์เข้าถึงพื้นที่เก็บข้อมูลแก่เอกสาร iframe หลังจากเรียกใช้ requestStorageAccess(), เท่านั้น ดังนั้น hasStorageAccess() จะแสดงผลเป็นเท็จในขั้นต้นเสมอ ยกเว้นเมื่อเอกสารต้นทางเดียวกันอื่นใน iframe เดียวกันได้รับสิทธิ์เข้าถึงแล้ว การให้สิทธิ์นี้ยังคงอยู่สำหรับการไปยังส่วนต่างๆ ต้นทางเดียวกันภายใน iframe โดยเฉพาะเพื่อให้มีการโหลดซ้ำหลังจากที่ให้สิทธิ์เข้าถึงหน้าที่ต้องใช้คุกกี้ในคำขอเริ่มต้นสำหรับเอกสาร HTML แล้ว

การใช้เมธอด requestStorageAccess()

หาก iframe ไม่มีสิทธิ์เข้าถึง คุณอาจต้องขอสิทธิ์เข้าถึงโดยใช้เมธอด requestStorageAccess() ดังนี้

if (!hasAccess) {
  try {
    await document.requestStorageAccess();
  } catch (err) {
    // Access was not granted and it may be gated behind an interaction
    return;
  }
}

ครั้งแรกที่มีการส่งคำขอนี้ ผู้ใช้อาจต้องอนุมัติการเข้าถึงนี้ด้วยข้อความแจ้งของเบราว์เซอร์ หลังจากนั้นระบบจะแก้ไขสัญญา หรือระบบจะปฏิเสธหากเป็นข้อยกเว้น หากใช้ await

เพื่อป้องกันการละเมิด ข้อความแจ้งของเบราว์เซอร์นี้จะแสดงหลังการโต้ตอบของผู้ใช้เท่านั้น นั่นจึงเป็นเหตุผลที่ requestStorageAccess() ต้องมีการเรียกจากเครื่องจัดการเหตุการณ์ที่เปิดใช้งานโดยผู้ใช้แทนที่จะเรียกทันทีที่ iframe โหลด

async function doClick() {

  // Only do this extra check if access hasn't already been given
  // based on the hasAccess variable.
  if (!hasAccess) {
    try {
      await document.requestStorageAccess();
      hasAccess = true; // Can assume this was true if above did not reject.
    } catch (err) {
      // Access was not granted.
      return;
    }
  }

  if (hasAccess) {
    // Use the cookies
  }
}

document.querySelector('#my-button').addEventListener('click', doClick);

ข้อความแจ้งเกี่ยวกับสิทธิ์

เมื่อผู้ใช้คลิกปุ่มเป็นครั้งแรก ข้อความแจ้งของเบราว์เซอร์จะปรากฏโดยอัตโนมัติ โดยปกติจะอยู่ในแถบที่อยู่ ด้านล่างคือตัวอย่างข้อความแจ้งของ Chrome แต่เบราว์เซอร์อื่นๆ ก็มี UI ที่คล้ายกัน

ภาพหน้าจอแสดงข้อความแจ้งเกี่ยวกับสิทธิ์เข้าถึง Chrome Storage Access API
ข้อความแจ้งเกี่ยวกับสิทธิ์สำหรับ Storage Access API ของ Chrome

เบราว์เซอร์อาจข้ามข้อความแจ้งและได้รับสิทธิ์โดยอัตโนมัติในบางสถานการณ์ต่อไปนี้

  • มีการใช้หน้าเว็บและ iframe ในช่วง 30 วันที่ผ่านมาหลังจากยอมรับข้อความแจ้ง
  • หาก iframe ที่ฝังเป็นส่วนหนึ่งของชุดเว็บไซต์ที่เกี่ยวข้อง
  • ใน Firefox ระบบจะข้ามข้อความแจ้งสำหรับเว็บไซต์ที่รู้จัก (เว็บไซต์ที่คุณได้โต้ตอบด้วยในระดับบนสุด) สำหรับความพยายาม 5 ครั้งแรกด้วย

อีกทางเลือกหนึ่งคือ วิธีการอาจถูกปฏิเสธโดยอัตโนมัติโดยไม่แสดงข้อความแจ้งในบางสถานการณ์ต่อไปนี้

  • หากผู้ใช้ยังไม่เคยเข้าชมและโต้ตอบกับเว็บไซต์ที่เป็นเจ้าของ iframe ในแบบเอกสารระดับบนสุด ไม่ใช่ใน iframe ซึ่งหมายความว่า Storage Access API จะมีประโยชน์กับเว็บไซต์ที่ฝังอยู่ซึ่งผู้ใช้เคยเข้าชมก่อนหน้านี้ในบริบทของบุคคลที่หนึ่ง
  • หากมีการเรียกใช้เมธอด requestStorageAccess() นอกเหตุการณ์การโต้ตอบของผู้ใช้ โดยไม่ได้รับอนุมัติก่อนพรอมต์หลังการโต้ตอบ

แม้ว่าผู้ใช้จะได้รับข้อความแจ้งเกี่ยวกับการใช้งานครั้งแรก แต่การเข้าชมครั้งต่อๆ มาจะสามารถแก้ไขปัญหา requestStorageAccess() ได้โดยไม่ต้องมีข้อความแจ้งและไม่จำเป็นต้องมีการโต้ตอบของผู้ใช้ใน Chrome และ Firefox โปรดทราบว่า Safari ต้องการการโต้ตอบของผู้ใช้เสมอ

เนื่องจากการเข้าถึงคุกกี้อาจได้รับสิทธิ์เข้าถึงโดยไม่มีข้อความแจ้งหรือไม่มีการโต้ตอบจากผู้ใช้ จึงมักเป็นไปได้ที่จะรับสิทธิ์เข้าถึงคุกกี้ของบุคคลที่สามก่อนการโต้ตอบของผู้ใช้ในเบราว์เซอร์ที่รองรับฟีเจอร์นี้ (Chrome และ Firefox) โดยการเรียกใช้ requestStorageAccess() เมื่อโหลดหน้าเว็บ ซึ่งอาจทำให้คุณเข้าถึงคุกกี้ข้ามเว็บไซต์ของบุคคลที่สามได้ทันทีและมอบประสบการณ์การใช้งานที่สมบูรณ์มากขึ้น แม้แต่ก่อนที่ผู้ใช้จะโต้ตอบกับ iframe การทำเช่นนี้อาจเป็นประสบการณ์ของผู้ใช้ที่ดีกว่าในบางสถานการณ์เมื่อเทียบกับการรอการโต้ตอบจากผู้ใช้

กำลังใช้การค้นหาสิทธิ์ storage-access

หากต้องการตรวจสอบว่าจะให้สิทธิ์เข้าถึงโดยไม่ต้องมีการโต้ตอบของผู้ใช้ได้หรือไม่ ให้ตรวจสอบสถานะของสิทธิ์ storage-access และเรียก requestStoreAccess() ก่อนๆ เฉพาะในกรณีที่ผู้ใช้ไม่จำเป็นต้องดำเนินการใดๆ แทนการเรียกโฆษณาแล้วจะดำเนินการไม่สำเร็จเมื่อต้องมีการโต้ตอบ

วิธีนี้ยังช่วยให้คุณจัดการกับความต้องการล่วงหน้าด้วยการแสดงเนื้อหาต่างๆ ได้ เช่น ปุ่มเข้าสู่ระบบ

โค้ดต่อไปนี้จะเพิ่มการตรวจสอบสิทธิ์ storage-access ในตัวอย่างก่อนหน้านี้:

// Set a hasAccess boolean variable which defaults to false except for
// browsers which don't support the API - where we assume
// such browsers also don't block third-party cookies.
let hasAccess = false;

async function hasCookieAccess() {
  // Check if Storage Access API is supported
  if (!document.requestStorageAccess) {
    // Storage Access API is not supported so best we can do is
    // hope it's an older browser that doesn't block 3P cookies.
    return true;
  }

  // Check if access has already been granted
  if (await document.hasStorageAccess()) {
    return true;
  }

  // Check the storage-access permission
  // Wrap this in a try/catch for browsers that support the
  // Storage Access API but not this permission check
  // (e.g. Safari and older versions of Firefox).
  let permission;
  try {
    permission = await navigator.permissions.query(
      {name: 'storage-access'}
    );
  } catch (error) {
    // storage-access permission not supported. Assume no cookie access.
    return false;
  }

    if (permission) {
    if (permission.state === 'granted') {
      // Permission has previously been granted so can just call
      // requestStorageAccess() without a user interaction and
      // it will resolve automatically.
      try {
        await document.requestStorageAccess();
        return true;
      } catch (error) {
        // This shouldn't really fail if access is granted, but return false
        // if it does.
        return false;
      }
    } else if (permission.state === 'prompt') {
      // Need to call requestStorageAccess() after a user interaction
      // (potentially with a prompt). Can't do anything further here,
      // so handle this in the click handler.
      return false;
          } else if (permission.state === 'denied') {
            // Currently not used. See:
      // https://github.com/privacycg/storage-access/issues/149
      return false;
          }
    }

  // By default return false, though should really be caught by one of above.
  return false;
}

async function handleCookieAccessInit() {
  hasAccess = await hasCookieAccess();

  if (hasAccess) {
    // Use the cookies.
  }
}

handleCookieAccessInit();

iframe ที่แซนด์บ็อกซ์

เมื่อใช้ Storage Access API ใน iframe ที่ทำแซนด์บ็อกซ์ คุณต้องมีสิทธิ์แซนด์บ็อกซ์ต่อไปนี้

  • ต้องใช้ allow-storage-access-by-user-activation เพื่ออนุญาตการเข้าถึง Storage Access API
  • ต้องมี allow-scripts เพื่ออนุญาตให้ใช้ JavaScript ในการเรียก API
  • ต้องใช้ allow-same-origin เพื่ออนุญาตการเข้าถึงคุกกี้ต้นทางเดียวกันและพื้นที่เก็บข้อมูลอื่น

เช่น

<iframe sandbox="allow-storage-access-by-user-activation
                 allow-scripts
                 allow-same-origin"
        src="..."></iframe>

หากต้องการเข้าถึงด้วย Storage Access API ใน Chrome คุณต้องตั้งค่าคุกกี้ข้ามเว็บไซต์ด้วยแอตทริบิวต์ 2 รายการต่อไปนี้

  • SameSite=None - ซึ่งจำเป็นสำหรับการทำเครื่องหมายคุกกี้เป็นข้ามเว็บไซต์
  • Secure - ช่วยให้มั่นใจว่าจะเข้าถึงได้เฉพาะคุกกี้ที่เว็บไซต์ HTTPS กำหนด

ใน Firefox และ Safari คุกกี้จะมีค่าเริ่มต้นเป็น SameSite=None และไม่จำกัด SSA ไว้เฉพาะคุกกี้ Secure จึงไม่จำเป็นต้องมีแอตทริบิวต์เหล่านี้ เราขอแนะนำให้มีแอตทริบิวต์ SameSite ที่ชัดเจนและใช้คุกกี้ Secure เสมอ

การเข้าถึงหน้าระดับบนสุด

Storage Access API มีไว้เพื่อเปิดใช้การเข้าถึงคุกกี้ของบุคคลที่สามภายใน iframe ที่ฝัง

นอกจากนี้ยังมีกรณีการใช้งานอื่นๆ เมื่อหน้าระดับบนสุดต้องการเข้าถึงคุกกี้ของบุคคลที่สาม ตัวอย่างเช่น รูปภาพหรือสคริปต์ที่ถูกจำกัดโดยคุกกี้ ซึ่งเจ้าของเว็บไซต์อาจต้องการรวมไว้ในเอกสารระดับบนสุดโดยตรงแทนที่จะรวมไว้ใน iframe เพื่อจัดการกับกรณีการใช้งานนี้ Chrome ได้เสนอส่วนขยายให้กับ Storage Access API โดยเพิ่มเมธอด requestStorageAccessFor()

เมธอด requestStorageAccessFor()

การสนับสนุนเบราว์เซอร์

  • 119
  • 119
  • x
  • x

แหล่งที่มา

เมธอด requestStorageAccessFor() ทำงานคล้ายกับ requestStorageAccess() แต่ใช้กับทรัพยากรระดับบนสุด และใช้ได้กับเว็บไซต์ในชุดเว็บไซต์ที่เกี่ยวข้องเท่านั้น เพื่อป้องกันการให้สิทธิ์เข้าถึงทั่วไปแก่คุกกี้ของบุคคลที่สาม

โปรดดูรายละเอียดเพิ่มเติมเกี่ยวกับวิธีใช้ requestStorageAccessFor() ที่ชุดเว็บไซต์ที่เกี่ยวข้อง: คู่มือนักพัฒนาซอฟต์แวร์

การค้นหาสิทธิ์ top-level-storage-access

การสนับสนุนเบราว์เซอร์

  • 119
  • 119
  • x
  • x

ต้องมีสิทธิ์ top-level-storage-access เพื่อตรวจสอบว่าจะให้สิทธิ์เข้าถึงแก่ requestStorageAccessFor() ได้หรือไม่ ซึ่งคล้ายกับสิทธิ์ storage-access

Storage Access API แตกต่างอย่างไรเมื่อใช้กับ RWS

เมื่อใช้ชุดเว็บไซต์ที่เกี่ยวข้องกับ Storage Access API ความสามารถเพิ่มเติมบางส่วนจะพร้อมใช้งานตามรายละเอียดในตารางต่อไปนี้

ไม่มี RWS พร้อม RWS
ต้องใช้ท่าทางสัมผัสของผู้ใช้เพื่อเริ่มคำขอการเข้าถึงพื้นที่เก็บข้อมูล
กำหนดให้ผู้ใช้ไปที่ต้นทางพื้นที่เก็บข้อมูลที่ขอในบริบทระดับบนสุดก่อนให้สิทธิ์เข้าถึง
สามารถข้ามข้อความแจ้งของผู้ใช้ครั้งแรกได้
ไม่จำเป็นต้องเรียกใช้ requestStorageAccess หากเคยให้สิทธิ์การเข้าถึงแล้ว
ให้สิทธิ์เข้าถึงโดเมนอื่นๆ ในเว็บไซต์ที่เกี่ยวข้องโดยอัตโนมัติ
รองรับ requestStorageAccessFor สำหรับการเข้าถึงหน้าในระดับบนสุด
ความแตกต่างระหว่างการใช้ Storage Access API โดยไม่ใช้กับชุดเว็บไซต์ที่เกี่ยวข้อง

การสาธิต: การตั้งค่าและการเข้าถึงคุกกี้

การสาธิตต่อไปนี้แสดงให้เห็นว่าคุณสามารถเข้าถึงคุกกี้ที่ตั้งค่าไว้ในหน้าจอแรกของการสาธิตได้อย่างไรในเฟรมที่ฝังในเว็บไซต์ที่ 2 ของเดโม

storage-access-api-demo.glitch.me

การสาธิตนี้ต้องใช้เบราว์เซอร์ที่ปิดใช้คุกกี้ของบุคคลที่สาม

  • Chrome 118 ขึ้นไปที่ตั้งค่า Flag chrome://flags/#test-third-party-cookie-phaseout และรีสตาร์ทเบราว์เซอร์แล้ว
  • Firefox
  • Safari

แหล่งข้อมูล