คุกกี้ทุกรายการมีคู่คีย์-ค่า พร้อมด้วยแอตทริบิวต์จำนวนหนึ่งที่ควบคุมว่าจะใช้คุกกี้นั้นที่ไหนและเมื่อใด
การเปิดตัวแอตทริบิวต์ 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 ตัวที่มีป้ายกำกับว่า "ไม่มี" "Lax" หรือ "เข้มงวด" โดยขึ้นอยู่กับบริบท](https://web.dev/static/articles/samesite-cookies-explained/image/three-cookies-labelled-no-495f9afccf1cd.png?authuser=6&hl=th)
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
รายการ
โปรดดูรายละเอียดเพิ่มเติมเกี่ยวกับการอัปเดตคุกกี้เพื่อให้จัดการการเปลี่ยนแปลงเหล่านี้กับ SameSite=None
และความแตกต่างของลักษณะการทํางานของเบราว์เซอร์ได้สำเร็จในบทความติดตามผลเรื่องสูตรคุกกี้ SameSite
ขอขอบคุณสำหรับการมีส่วนร่วมและความคิดเห็นจาก Lily Chen, Malte Ubl, Mike West, Rob Dodson, Tom Steiner และ Vivek Sekhar
รูปภาพหลักของคุกกี้โดย Pille-Riin Priske ใน Unsplash