คุกกี้ที่มีสถานะพาร์ติชันอิสระ (CHIPS)

อนุญาตให้นักพัฒนาแอปเลือกใช้คุกกี้ในพื้นที่เก็บข้อมูล "ที่แบ่งพาร์ติชัน" โดยมีที่เก็บคุกกี้แยกต่างหากต่อเว็บไซต์ระดับบนสุด

สถานะการติดตั้งใช้งาน

Browser Support

  • Chrome: 114.
  • Edge: 114.
  • Firefox: 141.
  • Safari: not supported.

Source

CHIPS คืออะไร

Cookies Having Independent Partitioned State (CHIPS) ช่วยให้นักพัฒนาแอปเลือกใช้คุกกี้ในพื้นที่เก็บข้อมูลที่แบ่งพาร์ติชันได้ โดยมีกระปุกคุกกี้แยกกันสำหรับแต่ละเว็บไซต์ระดับบนสุด ซึ่งจะช่วยปรับปรุงความเป็นส่วนตัวและความปลอดภัยของผู้ใช้

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

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

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

CHIPS เปิดตัวแอตทริบิวต์คุกกี้ใหม่ Partitioned เพื่อรองรับคุกกี้ข้ามเว็บไซต์ที่แบ่งพาร์ติชันตามบริบทระดับบนสุด

ส่วนหัว Set-Cookie

Set-Cookie: __Host-name=value; Secure; Path=/; SameSite=None; Partitioned;

JavaScript:

document.cookie="__Host-name=value; Secure; Path=/; SameSite=None; Partitioned;"

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

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

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

เมื่อผู้ใช้เข้าชมเว็บไซต์ใหม่ เช่น เว็บไซต์ B เฟรม C ที่ฝังไว้จะไม่ได้รับคุกกี้ที่ตั้งค่าไว้เมื่อฝัง C ในเว็บไซต์ A

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

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

กรณีการใช้งาน

เช่น เว็บไซต์ retail.example อาจต้องการทำงานร่วมกับบริการของบุคคลที่สาม support.chat.example เพื่อฝังช่องแชทสนับสนุนในเว็บไซต์ ปัจจุบันบริการแชทแบบฝังจำนวนมากใช้คุกกี้เพื่อบันทึกสถานะ

แผนภาพแสดงเว็บไซต์ที่มีวิดเจ็ตแชทแบบฝัง
เว็บไซต์ระดับบนสุด retail.example ฝังบริการของบุคคลที่สาม support.chat.example

หากไม่มีความสามารถในการตั้งค่าคุกกี้ข้ามเว็บไซต์ support.chat.example จะต้องหาวิธีอื่นในการจัดเก็บสถานะ ซึ่งมักจะซับซ้อนกว่า หรืออาจต้องฝังไว้ในหน้าเว็บระดับบนสุด ซึ่งจะทำให้เกิดความเสี่ยงเนื่องจากจะอนุญาตให้สคริปต์ support.chat.example มีสิทธิ์ที่สูงขึ้นใน retail.example เช่น ความสามารถในการเข้าถึงคุกกี้การตรวจสอบสิทธิ์

CHIPS เป็นตัวเลือกที่ง่ายกว่าในการใช้คุกกี้ข้ามเว็บไซต์ต่อไปโดยไม่มีความเสี่ยงที่เกี่ยวข้องกับคุกกี้ที่ไม่ได้แบ่งพาร์ติชัน

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

  • แชทแบบฝังของบุคคลที่สาม
  • การฝังแผนที่ของบุคคลที่สาม
  • การฝังการชำระเงินของบุคคลที่สาม
  • การจัดสรรภาระงาน CDN ของทรัพยากรย่อย
  • ผู้ให้บริการ CMS แบบไม่มีส่วนหัว
  • โดเมนแซนด์บ็อกซ์สำหรับการแสดงเนื้อหาของผู้ใช้ที่ไม่น่าเชื่อถือ (เช่น googleusercontent.com และ githubusercontent.com)
  • CDN ของบุคคลที่สามที่ใช้คุกกี้เพื่อแสดงเนื้อหาที่ควบคุมการเข้าถึงโดยสถานะการตรวจสอบสิทธิ์ในเว็บไซต์ของบุคคลที่หนึ่ง (เช่น รูปโปรไฟล์ในเว็บไซต์โซเชียลมีเดียที่โฮสต์ใน CDN ของบุคคลที่สาม)
  • เฟรมเวิร์กส่วนหน้าซึ่งอาศัย API ระยะไกลที่ใช้คุกกี้ในคำขอ
  • โฆษณาที่ฝังซึ่งต้องมีขอบเขตสถานะต่อผู้เผยแพร่โฆษณา (เช่น การบันทึกค่ากําหนดโฆษณาของผู้ใช้สําหรับเว็บไซต์นั้น)

เหตุผลที่ CHIPS ใช้รูปแบบการแบ่งพาร์ติชันแบบเลือกใช้

ในกรณีที่การเข้าถึงคุกกี้ของบุคคลที่สามที่ไม่ได้แบ่งพาร์ติชันถูกบล็อก เราได้ลองใช้วิธีการแบ่งพาร์ติชันอื่นๆ 2-3 วิธี

Firefox ประกาศว่าจะแบ่งพาร์ติชันคุกกี้ของบุคคลที่สามทั้งหมดโดยค่าเริ่มต้นในโหมด ETP Strict และโหมดการเรียกดูแบบส่วนตัว ดังนั้นคุกกี้ข้ามเว็บไซต์ทั้งหมดจะได้รับการแบ่งพาร์ติชันตามเว็บไซต์ระดับบนสุด อย่างไรก็ตาม การแบ่งพาร์ติชันคุกกี้โดยไม่ได้รับความยินยอมจากบุคคลที่สามอาจทำให้เกิดข้อบกพร่องที่ไม่คาดคิด เนื่องจากบริการของบุคคลที่สามบางรายได้สร้างเซิร์ฟเวอร์ที่คาดหวังคุกกี้ของบุคคลที่สามที่ไม่ได้แบ่งพาร์ติชัน

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

สิ่งที่ทำให้ CHIPS แตกต่างจากการใช้งานคุกกี้ที่แบ่งพาร์ติชันที่มีอยู่คือการเลือกใช้ของบุคคลที่สาม ต้องตั้งค่าคุกกี้ด้วยแอตทริบิวต์ใหม่เพื่อให้ส่งในคำขอข้ามฝ่ายได้เมื่อเลิกใช้งานคุกกี้ของบุคคลที่สาม (ที่ไม่ได้แบ่งพาร์ติชัน)

แม้ว่าคุกกี้ของบุคคลที่สามจะยังคงมีอยู่ แต่แอตทริบิวต์ Partitioned จะให้การเลือกใช้ลักษณะการทำงานของคุกกี้ประเภทที่เข้มงวดและปลอดภัยยิ่งขึ้น CHIPS เป็นขั้นตอนสำคัญที่จะช่วยให้บริการต่างๆ เปลี่ยนไปใช้อนาคตที่ไม่มีคุกกี้ของบุคคลที่สามได้อย่างราบรื่น

ปัจจุบันคุกกี้จะเชื่อมโยงกับชื่อโฮสต์หรือโดเมนของเว็บไซต์ที่ตั้งค่าคุกกี้ ซึ่งก็คือคีย์โฮสต์

เช่น สำหรับคุกกี้จาก https://support.chat.example คีย์โฮสต์คือ ("support.chat.example")

ใน CHIPS คุกกี้ที่เลือกใช้การแบ่งพาร์ติชันจะมีคีย์ 2 รายการ ได้แก่ คีย์โฮสต์และคีย์พาร์ติชัน

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

ในตัวอย่างก่อนหน้าซึ่งมีการฝัง https://support.chat.example ใน https://retail.example URL ระดับบนสุดคือ https://retail.example

ในกรณีนี้ คีย์พาร์ติชันคือ ("https", "retail.example")

ในทำนองเดียวกัน คีย์การแบ่งพาร์ติชันของคำขอคือเว็บไซต์ของ URL ระดับบนสุดที่เบราว์เซอร์เข้าชมเมื่อเริ่มคำขอ เบราว์เซอร์ต้องส่งคุกกี้ที่มีแอตทริบิวต์ Partitioned ในคำขอที่มีคีย์พาร์ติชันเดียวกันกับคุกกี้นั้นเท่านั้น

คีย์คุกกี้ในตัวอย่างก่อนหน้าจะมีลักษณะดังนี้ก่อนและหลัง CHIPS

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

ก่อน CHIPS

key=("support.chat.example")

หลังจาก CHIPS

key={("support.chat.example"),("https", "retail.example")}

การออกแบบความปลอดภัย

CHIPS จะกำหนดและส่งคุกกี้ผ่านโปรโตคอลที่ปลอดภัยเท่านั้นเพื่อส่งเสริมแนวทางปฏิบัติที่ดีด้านความปลอดภัย

  • ต้องตั้งค่าคุกกี้ที่แบ่งพาร์ติชันด้วย Secure
  • เราขอแนะนําให้ใช้คํานําหน้า __Host- เมื่อตั้งค่าคุกกี้ที่แบ่งพาร์ติชันเพื่อให้คุกกี้เชื่อมโยงกับชื่อโฮสต์ (ไม่ใช่โดเมนที่ลงทะเบียนได้)

ตัวอย่าง

Set-Cookie: __Host-example=34d8g; SameSite=None; Secure; Path=/; Partitioned;

ทางเลือกแทน CHIPS

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

ซึ่งเป็นทางเลือกแทนการแบ่งพาร์ติชัน CHIPS ในกรณีที่ต้องเข้าถึงคุกกี้ข้ามเว็บไซต์ที่ไม่ได้แบ่งพาร์ติชัน

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

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

การออกแบบชุดเว็บไซต์ที่เกี่ยวข้องใช้ Storage Access API และไม่ได้ผสานรวมกับการแบ่งพาร์ติชัน CHIPS หากคุณมี Use Case ที่ต้องใช้การแบ่งพาร์ติชันคุกกี้ที่แชร์ในเว็บไซต์ภายใน RWS โปรดระบุตัวอย่างและแสดงความคิดเห็นเกี่ยวกับปัญหาใน GitHub

สาธิต

การสาธิตนี้จะอธิบายวิธีการทำงานของคุกกี้ที่แบ่งพาร์ติชันและวิธีตรวจสอบคุกกี้ในเครื่องมือสำหรับนักพัฒนาเว็บ

เว็บไซต์ ก. ฝัง iframe จากเว็บไซต์ ข. ซึ่งใช้ JavaScript เพื่อตั้งค่าคุกกี้ 2 รายการ ได้แก่ คุกกี้ที่แบ่งพาร์ติชันและคุกกี้ที่ไม่ได้แบ่งพาร์ติชัน เว็บไซต์ ข แสดงคุกกี้ทั้งหมดที่เข้าถึงได้จากตำแหน่งนั้นโดยใช้ document.cookie

เมื่อมีการบล็อกคุกกี้ของบุคคลที่สาม เว็บไซต์ B จะตั้งค่าและเข้าถึงคุกกี้ที่มีแอตทริบิวต์ Partitioned ได้ในบริบทข้ามเว็บไซต์เท่านั้น

เมื่ออนุญาตคุกกี้ของบุคคลที่สาม เว็บไซต์ B จะตั้งค่าและเข้าถึงคุกกี้ที่ไม่ได้แบ่งพาร์ติชันได้ด้วย

เว็บไซต์ ก. และเว็บไซต์ ข.
ซ้าย: มีการบล็อกคุกกี้ของบุคคลที่สาม ขวา: อนุญาตคุกกี้ของบุคคลที่สาม

ข้อกำหนดเบื้องต้น

  1. Chrome 118 ขึ้นไป
  2. ไปที่ chrome://flags/#test-third-party-cookie-phaseout แล้วเปิดใช้การตั้งค่านี้

ใช้เครื่องมือสำหรับนักพัฒนาเว็บเพื่อตรวจสอบคุกกี้ที่แบ่งพาร์ติชัน

  1. ไปที่ https://chips-site-a.glitch.me
  2. กด Control+Shift+J (หรือ Command+Option+J บน Mac) เพื่อเปิด DevTools
  3. คลิกแท็บแอปพลิเคชัน
  4. ไปที่แอปพลิเคชัน > พื้นที่เก็บข้อมูล > คุกกี้
  5. คลิก https://chips-site-b.glitch.me

DevTools จะแสดงคุกกี้ทั้งหมดจากต้นทางที่เลือก

คุกกี้จากเว็บไซต์ B ในแท็บแอปพลิเคชันของเครื่องมือสำหรับนักพัฒนาเว็บ

เว็บไซต์ B จะตั้งค่าคุกกี้ที่แบ่งพาร์ติชันได้เฉพาะในบริบทแบบข้ามเว็บไซต์ ส่วนคุกกี้ที่ไม่ได้แบ่งพาร์ติชันจะถูกบล็อก

  • คุณควรเห็น __Host-partitioned-cookie พร้อมคีย์การแบ่งพาร์ติชันของเว็บไซต์ระดับบนสุด https://chips-site-a.glitch.me
คีย์การแบ่งพาร์ติชันสำหรับ __Host-partitioned-cookie
  1. คลิกไปที่เว็บไซต์ B
  2. ใน DevTools ให้ไปที่แอปพลิเคชัน > พื้นที่เก็บข้อมูล > คุกกี้
  3. คลิก https://chips-site-b.glitch.me
เว็บไซต์ B
ที่ระดับบนสุด เว็บไซต์ ข จะเห็นคุกกี้ทั้งหมด ทั้งที่แบ่งพาร์ติชันและไม่ได้แบ่งพาร์ติชัน

ในสถานการณ์นี้ เนื่องจากคุณอยู่ในเว็บไซต์ ข. ในบริบทระดับบนสุด จึงตั้งค่าและเข้าถึงคุกกี้ทั้ง 2 รายการได้

  • unpartitioned-cookie มีคีย์พาร์ติชันว่าง
  • __Host-partitioned-cookie คุกกี้มีคีย์การแบ่งพาร์ติชัน https://chips-site-b.glitch.me
คุกกี้จากเว็บไซต์ B ในแท็บแอปพลิเคชันของเครื่องมือสำหรับนักพัฒนาเว็บเมื่อเข้าชม B เป็นเว็บไซต์ระดับบนสุด __Host-partitioned-cookie มีคีย์การแบ่งพาร์ติชัน https://chips-site-b.glitch.me

หากคุณกลับไปที่เว็บไซต์ ก. ตอนนี้ระบบจะจัดเก็บ unpartitioned-cookie ไว้ในเบราว์เซอร์ แต่จะเข้าถึงจากเว็บไซต์ ก. ไม่ได้

  1. คลิกไปที่เว็บไซต์ ก
  2. คลิกแท็บเครือข่าย
  3. คลิก https://chips-site-b.glitch.me
  4. คลิกแท็บ Cookies

ขณะอยู่ในเว็บไซต์ ก. คุณควรเห็น __Host-partitioned-cookie ที่มีคีย์การแบ่งพาร์ติชันของเว็บไซต์ระดับบนสุด https://chips-site-a.glitch.me

แท็บเครือข่ายแสดงคุกกี้จาก iframe ของเว็บไซต์ B ซึ่งเข้าถึงได้เมื่อฝังอยู่ในเว็บไซต์ A

หากเลือกแสดงคำขอคุกกี้ที่กรองออก เครื่องมือสำหรับนักพัฒนาเว็บจะแสดงว่าคุกกี้ที่ไม่ได้แบ่งพาร์ติชันถูกบล็อก โดยจะไฮไลต์เป็นสีเหลืองพร้อมเคล็ดลับเครื่องมือที่ระบุว่า "คุกกี้นี้ถูกบล็อกเนื่องจากการกำหนดค่าของผู้ใช้"

แท็บเครือข่ายแสดงคุกกี้ที่ถูกบล็อกจาก iframe ของเว็บไซต์ B

ใน Application > Storage > Cookies การคลิก https://chips-site-b.glitch.me จะแสดงข้อมูลต่อไปนี้

  • unpartitioned-cookie ด้วยคีย์พาร์ติชันที่ว่างเปล่า
  • __Host-partitioned-cookie คุกกี้ที่มีคีย์การแบ่งพาร์ติชัน https://chips-site-a.glitch.me
คุกกี้จากเว็บไซต์ B ในแท็บแอปพลิเคชันของเครื่องมือสำหรับนักพัฒนาเว็บ __Host-partitioned-cookie คุกกี้มีคีย์การแบ่งพาร์ติชัน https://chips-site-a.glitch.me unpartitioned-cookie จะแสดง แต่ iframe ของเว็บไซต์ B จะเข้าถึงไม่ได้เมื่อฝังไว้ในเว็บไซต์ A

ล้างคุกกี้

หากต้องการรีเซ็ตเดโม ให้ล้างคุกกี้ทั้งหมดสำหรับเว็บไซต์โดยทำดังนี้

  • กด Control+Shift+J (หรือ Command+Option+J บน Mac) เพื่อเปิด DevTools
  • คลิกแท็บแอปพลิเคชัน
  • ไปที่แอปพลิเคชัน > พื้นที่เก็บข้อมูล > คุกกี้
  • คลิกขวาที่ https://chips-site-b.glitch.me
  • คลิกล้าง

แหล่งข้อมูล