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