เมื่อเว็บเซิร์ฟเวอร์ตอบกลับคำขอทรัพยากร เซิร์ฟเวอร์สามารถใส่ส่วนหัว Set-Cookie
ไปพร้อมกับการตอบกลับได้ ส่วนหัวดังกล่าวจะบอกให้เบราว์เซอร์จัดเก็บคุกกี้ เช่น Set-Cookie:cat=tabby
คุกกี้คืออะไรอธิบายวิธีการทำงานของคุกกี้
นอกจากระบุชื่อและค่าคุกกี้แล้ว Set-Cookie
ยังระบุแอตทริบิวต์เพื่อควบคุมว่าจะตั้งค่าคุกกี้หรือไม่ และกำหนดวันที่หมดอายุของคุกกี้ได้ด้วย โดยคั่นแอตทริบิวต์คุกกี้ด้วยเครื่องหมายเซมิโคลอน เช่น
Set-Cookie:cat=tabby; Expires=Tue, 31 Dec 2999 23:59:59 GMT;
บทความนี้จะอธิบายแอตทริบิวต์คุกกี้ที่สําคัญที่สุด
การใช้คุกกี้ HTTPอธิบายแอตทริบิวต์คุกกี้อย่างละเอียดทางเทคนิค
แบบปลอดภัย
👉 คุณควรใส่ Secure
โดยค่าเริ่มต้นสำหรับคุกกี้ทั้งหมด
หากส่วนหัว Set-Cookie
มี Secure
คุกกี้จะรวมอยู่ในคำขอที่เข้ารหัสที่ใช้โปรโตคอล HTTPS เท่านั้น โดยจะไม่รวมอยู่ในคำขอ HTTP ซึ่งจะช่วยหยุดการโจมตีผ่านสื่อกลางที่ผู้โจมตีแทรกแซงการสื่อสารระหว่างเบราว์เซอร์กับเซิร์ฟเวอร์อย่างลับๆ เพื่อส่งต่อข้อมูลและอาจมีการแก้ไขข้อมูล
HTTPOnly
👉 คุณควรใส่ HTTPOnly
โดยค่าเริ่มต้นสำหรับคุกกี้ทั้งหมด ละเว้นก็ต่อเมื่อต้องการการเข้าถึง JavaScript
หากส่วนหัว Set-Cookie
มี HTTPOnly
ระบบจะเข้าถึงคุกกี้ไม่ได้โดยใช้ document.cookie
วิธีนี้ช่วยป้องกันโจมตีบางประเภทที่มุ่งเป้าไปที่คุกกี้
SameSite
👉 SameSite=Lax
คือค่าเริ่มต้นหากไม่ได้ตั้งค่าไว้ SameSite=None
อนุญาตคุกกี้ข้ามเว็บไซต์ แต่หมายความว่าระบบจะบล็อกคุกกี้ในกรณีที่มีการจำกัดคุกกี้ของบุคคลที่สาม
คำขอทรัพยากรจากเว็บไซต์อื่นที่ไม่ใช่เว็บไซต์ที่คุณกําลังเข้าชมคือคำขอข้ามเว็บไซต์ คุกกี้ที่ตั้งค่าเพื่อตอบสนองคําขอข้ามเว็บไซต์เรียกว่าคุกกี้ของบุคคลที่สาม ดูข้อมูลเพิ่มเติม: คุกกี้ของบุคคลที่สามคืออะไร
แอตทริบิวต์ SameSite
จะควบคุมว่าจะรวมคุกกี้ของบุคคลที่สามในคำขอหรือไม่ โดยมีค่าที่เป็นไปได้ 3 ค่า ได้แก่ Strict
, Lax
หรือ None
เข้มงวด
ระบบจะส่งคุกกี้เพื่อตอบสนองต่อคําขอจากหน้าเว็บที่อยู่ในเว็บไซต์ต้นทางของคุกกี้เท่านั้น ตัวอย่างเช่น สมมติว่าผู้ใช้เข้าชม cats.example
และมีการตั้งค่าคุกกี้ที่มีแอตทริบิวต์ SameSite=Strict
ต่อมาผู้ใช้ไปที่เว็บไซต์อื่นและคลิกลิงก์ไปยังหน้าใน cats.example
คุกกี้ที่ตั้งไว้จะไม่รวมอยู่ในคําขอนั้น
LAX
ซึ่งจะทํางานในลักษณะเดียวกับ Strict
ยกเว้นว่าเบราว์เซอร์จะรวมคุกกี้ด้วยเมื่อผู้ใช้ไปยังเว็บไซต์ต้นทางของคุกกี้ (ในตัวอย่าง Strict
ก่อนหน้านี้ ระบบจะรวมคุกกี้เมื่อผู้ใช้ไปยังลิงก์ cats.example
) Lax
คือค่าเริ่มต้น หากไม่มีแอตทริบิวต์ SameSite
รวมอยู่ในส่วนหัว Set-Cookie
ไม่มี
ไม่มีข้อจำกัด: คุกกี้จะรวมอยู่ในคำขอ ไม่ว่าจะข้ามเว็บไซต์หรือไม่ก็ตาม เมื่อใช้ SameSite=None
คุกกี้ต้องมีแอตทริบิวต์ Secure
ด้วย
ดูข้อมูลเพิ่มเติมที่คำอธิบายเกี่ยวกับคุกกี้ SameSite
แบ่งพาร์ติชันแล้ว
👉 คุณควรใส่แอตทริบิวต์ Partitioned
โดยค่าเริ่มต้นหากกำลังสร้างคุกกี้ของบุคคลที่สาม เว้นแต่คุณจะทราบอย่างชัดเจนว่าต้องแชร์คุกกี้นั้นในแทรกหลายรายการ
แอตทริบิวต์นี้ช่วยให้คุณเลือกใช้คุกกี้ในพื้นที่เก็บข้อมูลที่แบ่งพาร์ติชันได้ โดยมี "คุกกี้ jar" แยกกันสำหรับแต่ละเว็บไซต์ระดับบนสุด คุกกี้จะคีย์ 2 ครั้ง โดยเว็บไซต์ระดับบนสุดและโดเมนที่ตั้งค่า
ตัวอย่างเช่น สมมติว่าเว็บไซต์ ก และเว็บไซต์ ข มี iframe จากเว็บไซต์ ค คุกกี้ที่แบ่งพาร์ติชันซึ่งตั้งค่าโดย iframe ในเว็บไซต์ ก. จะไม่สามารถเข้าถึงได้โดยใช้ iframe ในเว็บไซต์ ข. เนื่องจากคุกกี้ AC แยกจากคุกกี้ BC
คุกกี้ที่มีแอตทริบิวต์ Partitioned
เรียกว่า CHIPS: Cookies Having Independent Partitioned State
คุกกี้ที่แบ่งพาร์ติชันต้องมีแอตทริบิวต์ Secure
ดูข้อมูลเพิ่มเติม: Cookies Having Independent Partitioned State
Expires และ Max-Age
👉 เว้นแอตทริบิวต์ Max-Age
และ Expires
ไว้ เว้นแต่ว่าคุณต้องการให้คุกกี้อยู่ได้นานกว่าเซสชันปัจจุบัน เบราว์เซอร์จะลบคุกกี้ที่หมดอายุ ดังนั้นจึงไม่มีเหตุผลที่จะตั้งค่าวันหมดอายุเป็นปีข้างหน้า แต่คุณควรพิจารณารีเฟรชคุกกี้เมื่อผู้ใช้เข้าชมเว็บไซต์อีกครั้ง
คุณสามารถระบุExpires
วันที่และเวลา หรือ Max-Age
เป็นวินาที ซึ่งหลังจากนั้นคุกกี้ควรถูกลบและไม่ส่งอีกต่อไป เช่น
Set-Cookie:cat=tabby; Expires=Tue, 31 Dec 2999 23:59:59 GMT;
Set-Cookie:cat=tabby; Max-Age=86400
หากคุณไม่ระบุแอตทริบิวต์ Max-Age
หรือ Expires
ระบบจะลบคุกกี้เมื่อเซสชันปัจจุบันสิ้นสุด คุกกี้ประเภทนี้บางครั้งเรียกว่าคุกกี้เซสชัน
โดเมน
👉 อย่าใส่แอตทริบิวต์ Domain
เว้นแต่ว่าคุณต้องการให้คุกกี้รวมอยู่ในคำขอไปยังโดเมนย่อย
หากส่วนหัว Set-Cookie
มีแอตทริบิวต์ Domain
ระบบจะรวมคุกกี้ไปกับคำขอไปยังโดเมนที่ระบุและโดเมนย่อยทั้งหมดของโดเมนนั้น
หากส่วนหัว Set-Cookie
ไม่มีแอตทริบิวต์ Domain
ระบบจะไม่รวมคุกกี้ไปกับคำขอไปยังโดเมนย่อย
กล่าวคือ การใส่แอตทริบิวต์ Domain
จะลดข้อจำกัดของโดเมน
ตัวอย่างเช่น เมื่อมีการตอบกลับจากเว็บไซต์ cats.example
Set-Cookie:cat=tabby
คุกกี้จะรวมอยู่ในคำขอไปยังcats.example
เท่านั้นSet-Cookie:cat=tabby; Domain=cats.example
คุกกี้จะรวมอยู่ในคำขอไปยังcats.example
รวมถึงคำขอทรัพยากรในโดเมนย่อย เช่นfluffy.cats.example
หรือuser.assets.cats.example
เส้นทาง
👉 รวม Path=/
กับคุกกี้หากต้องการให้คําขอทั้งหมดไปยังเส้นทางใดก็ตามในเว็บไซต์รวมคุกกี้ อย่าพึ่งพา Path
เพื่อปกป้องความปลอดภัย
หากแอตทริบิวต์ Path
รวมอยู่ในส่วนหัวของคำตอบ Set-Cookie
คุกกี้ที่ตั้งค่าไว้จะรวมอยู่ในคำขอ URL (ในเว็บไซต์ที่ตั้งค่าคุกกี้) ที่ตรงกับค่า Path
เท่านั้น
เช่น
Set-Cookie:cat=tabby; Path=/articles
ระบบจะรวมคุกกี้นี้ไว้ในคําขอเส้นทาง URL ที่ขึ้นต้นด้วย/articles
✅https://cats.example/articles/tabby/index.html
✅https://cats.example/articles/breeds/tabby/index.html
❎https://cats.example/images/tabby.jpg
❎https://cats.example/en/articles/tabby/index.html
Set-Cookie:cat=tabby; Path=/
คําขอทั้งหมดไปยัง URL ใดก็ตามในเว็บไซต์จะมีคุกกี้นี้
หากส่วนหัวคำตอบ Set-Cookie
ไม่มีค่า Path
ระบบจะรวมคุกกี้ไว้กับคำขอไปยังไดเรกทอรีเดียวกันเท่านั้น ตัวอย่างเช่น สมมติว่ามีการระบุคุกกี้ cat=tabby
เพื่อตอบสนองคําขอ cats.example/images/tabby.jpg.
หากไม่ได้ระบุ Path
คุกกี้จะรวมอยู่ในคําขอไฟล์ภายในไดเรกทอรี cats.example/images
เท่านั้น
เดโม
- 1pc.glitch.me: การสาธิตคุกกี้ของบุคคลที่หนึ่ง
- 3pc.glitch.me: การสาธิตคุกกี้ของบุคคลที่สาม
เครื่องมือ
- ดู เพิ่ม แก้ไข และลบคุกกี้ในเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome
- เครื่องมือวิเคราะห์ของ Privacy Sandbox