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

Browser Support

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

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

Browser Support

  • Chrome: 80.
  • Edge: 86.
  • Firefox: behind a flag.
  • Safari: not supported.

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

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

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

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