คำอธิบายเกี่ยวกับคุกกี้ SameSite

การรองรับเบราว์เซอร์

  • Chrome: 51.
  • ขอบ: 16
  • Firefox: 60
  • Safari: 13.

แหล่งที่มา

คุกกี้ทุกรายการมีคู่คีย์-ค่าพร้อมกับแอตทริบิวต์จำนวนหนึ่งที่ ควบคุมเวลาและสถานที่ที่ใช้คุกกี้

การแนะนำแอตทริบิวต์ SameSite (ระบุไว้ใน RFC6265bis) ช่วยให้คุณประกาศว่าคุกกี้ถูกจำกัดสำหรับบุคคลที่หนึ่งหรือ เนื้อหาในเว็บไซต์เดียวกัน การเข้าใจว่า 'เว็บไซต์' ใด หมายความที่นี่ เว็บไซต์นี้ประกอบด้วยส่วนต่อท้ายโดเมนและส่วนของโดเมน ข้างหน้า ตัวอย่างเช่น โดเมน www.web.dev เป็นส่วนหนึ่งของเว็บไซต์ web.dev

คีย์เวิร์ด: หากผู้ใช้อยู่ใน www.web.dev และขอรูปภาพจาก static.web.dev คำขอนี้เป็นคำขอแบบเว็บไซต์เดียวกัน

รายการคำต่อท้ายสาธารณะจะกำหนดหน้าที่นับเป็นหน้า การใช้เว็บไซต์เดียวกัน ไม่ได้ใช้เพียงแค่โดเมนระดับบนสุด เช่น .com แต่อาจรวมถึงบริการต่างๆ เช่น github.io วิธีนี้ช่วยให้ your-project.github.io และ my-project.github.io เพื่อนับเป็นเว็บไซต์แยกกัน

คีย์เวิร์ด: หากผู้ใช้อยู่ใน your-project.github.io และขอรูปภาพจาก my-project.github.io นั้นเป็นคำขอแบบข้ามเว็บไซต์

ใช้แอตทริบิวต์ SameSite เพื่อประกาศการใช้คุกกี้

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

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

Set-Cookie: promo_shown=1; SameSite=Strict

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

SameSite=Lax อนุญาตให้เบราว์เซอร์ส่งคุกกี้ที่มีระดับบนสุดเหล่านี้ การนำทาง ตัวอย่างเช่น หากเว็บไซต์อื่นอ้างอิงถึงเนื้อหาของเว็บไซต์ของคุณใน โดยใช้รูปภาพแมวของคุณและให้ลิงก์ไปยังบทความของคุณเป็น ดังต่อไปนี้:

<p>Look at this amazing cat!</p>
<img src="https://blog.example/blog/img/amazing-cat.png" />
<p>Read the <a href="https://blog.example/blog/cat.html">article</a>.</p>

เมื่อตั้งค่าคุกกี้เป็น Lax ดังนี้

Set-Cookie: promo_shown=1; SameSite=Lax

เมื่อเบราว์เซอร์ขอ amazing-cat.png สำหรับบล็อกของคนอื่น การตั้งค่า ไม่ส่งคุกกี้ แต่เมื่อผู้อ่านติดตาม ลิงก์ไปยัง cat.html ในเว็บไซต์ของคุณ คำขอดังกล่าวมีคุกกี้

เราขอแนะนำให้ใช้ SameSite ในลักษณะนี้โดยตั้งค่าคุกกี้ที่ส่งผลต่อเว็บไซต์ แสดงกับ Lax และคุกกี้ที่เกี่ยวข้องกับการดำเนินการของผู้ใช้กับ Strict

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

วันที่ คุกกี้ 3 รายการที่มีป้ายกำกับ None, Lax หรือ Strict ขึ้นอยู่กับบริบท
ทำเครื่องหมายบริบทของคุกกี้อย่างชัดแจ้งว่าเป็น None, Lax หรือ Strict

การเปลี่ยนแปลงการทำงานเริ่มต้นที่ไม่ได้ใช้ SameSite

การรองรับเบราว์เซอร์

  • Chrome: 80
  • ขอบ: 86
  • Firefox: อยู่หลังธง
  • Safari: ไม่รองรับ

แอตทริบิวต์ SameSite ได้รับการรองรับอย่างกว้างขวาง แต่ยังไม่มีการนำไปใช้อย่างแพร่หลาย ก่อนหน้านี้ การตั้งค่าคุกกี้โดยไม่มี SameSite จะเป็นการกำหนดค่าเริ่มต้นให้ส่งคุกกี้เข้ามา บริบททั้งหมด ซึ่งทำให้ผู้ใช้มีความเสี่ยงต่อ CSRF และไม่ได้ตั้งใจ การรั่วไหลของข้อมูล เพื่อกระตุ้นให้นักพัฒนาแอประบุความตั้งใจของตน และมอบประสบการณ์การใช้งานที่ปลอดภัยกว่า นั่นก็คือ IETF คุกกี้ที่ดีขึ้นทีละน้อย ระบุการเปลี่ยนแปลงที่สำคัญ 2 ประการ:

  • คุกกี้ที่ไม่มีแอตทริบิวต์ SameSite จะถือว่าเป็น SameSite=Lax
  • คุกกี้ที่มี SameSite=None จะต้องระบุ Secure ด้วย ซึ่งหมายความว่า บริบทที่ปลอดภัย

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

SameSite=Lax โดยค่าเริ่มต้น

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

SameSite=None ต้องปลอดภัย

เมื่อสร้างคุกกี้ข้ามเว็บไซต์โดยใช้ SameSite=None คุณต้องตั้งค่าคุกกี้เหล่านั้นด้วย เป็น Secure เพื่อให้เบราว์เซอร์ยอมรับ:

Set-Cookie: widget_session=abc123; SameSite=None; Secure

คุณสามารถทดสอบลักษณะการทำงานนี้ได้ใน Chrome 76 โดยเปิดใช้ about://flags/#cookies-without-same-site-must-be-secure และจาก Firefox 69 โดยการตั้งค่า network.cookie.sameSite.noneRequiresSecure ใน about:config

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

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการอัปเดตคุกกี้เพื่อจัดการกับคุกกี้เหล่านี้ให้สำเร็จ การเปลี่ยนแปลงใน SameSite=None และความแตกต่างของลักษณะการทำงานของเบราว์เซอร์ โปรดดู บทความติดตามผล สูตรคุกกี้ SameSite

ขอบคุณสำหรับการมีส่วนร่วมและความคิดเห็นจาก Lily Chen, Malte Ubl, Mike West, Rob Dodson, Tom Steiner และ Vivek Sekhar

รูปภาพหลักของคุกกี้โดย พิล-รีน พริสเก ในวันที่ หน้าจอแนะนํา