Browser Support
คุกกี้ทุกรายการมีคู่คีย์-ค่าพร้อมกับแอตทริบิวต์จำนวนหนึ่งที่ควบคุมเวลาและสถานที่ที่ใช้คุกกี้นั้น
การเปิดตัวแอตทริบิวต์ 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 เพื่อให้มั่นใจว่าเจตนาของคุณชัดเจน
None, Lax หรือ Strict
การเปลี่ยนแปลงลักษณะการทำงานเริ่มต้นโดยไม่มี SameSite
Browser Support
แอตทริบิวต์ 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
ดูรายละเอียดเพิ่มเติมเกี่ยวกับการอัปเดตคุกกี้เพื่อจัดการการเปลี่ยนแปลงเหล่านี้ใน SameSite=None และความแตกต่างในลักษณะการทำงานของเบราว์เซอร์ได้ในบทความติดตามผล สูตรคุกกี้ SameSite
ขอขอบคุณสำหรับการมีส่วนร่วมและความคิดเห็นจาก Lily Chen, Malte Ubl, Mike West, Rob Dodson, Tom Steiner และ Vivek Sekhar