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

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

  • 51
  • 16
  • 60
  • 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 ตัวที่มีป้ายกำกับว่า &quot;ไม่มี&quot; &quot;Lax&quot; หรือ &quot;เข้มงวด&quot; โดยขึ้นอยู่กับบริบท
ทำเครื่องหมายบริบทของคุกกี้อย่างชัดแจ้งเป็น None, Lax หรือ Strict

การเปลี่ยนแปลงลักษณะการทำงานเริ่มต้นโดยไม่มี SameSite

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

  • 80
  • 86
  • x

ระบบรองรับแอตทริบิวต์ SameSite อย่างแพร่หลาย แต่ยังไม่มีการใช้อย่างแพร่หลาย ก่อนหน้านี้ การตั้งค่าคุกกี้ที่ไม่มี SameSite จะกำหนดค่าเริ่มต้นให้ส่งคุกกี้ในทุกบริบท ซึ่งทำให้ผู้ใช้เสี่ยงต่อการรั่วไหลของ CSRF และการรั่วไหลของข้อมูลโดยไม่ได้ตั้งใจ เพื่อส่งเสริมให้นักพัฒนาซอฟต์แวร์ระบุความตั้งใจและมอบประสบการณ์ที่ปลอดภัยยิ่งขึ้นแก่ผู้ใช้ ข้อเสนอของ IETF เรื่อง Incrementally Better Cookies ได้ระบุการเปลี่ยนแปลงที่สำคัญ 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 โดยเร็วที่สุด หากคุณต้องพึ่งพาบริการที่จัดหาเนื้อหาของบุคคลที่สามในเว็บไซต์ โปรดตรวจสอบว่าผู้ให้บริการได้อัปเดตคุกกี้ของตน และอัปเดตข้อมูลโค้ดหรือเหตุการณ์ที่ต้องพึ่งพาเว็บไซต์เพื่อใช้ลักษณะการทำงานแบบใหม่แล้ว

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

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

รูปภาพหลักของคุกกี้โดย Pille-Riin Priske ใน Unsplash