แอตทริบิวต์คุกกี้

เมื่อเว็บเซิร์ฟเวอร์ตอบสนองต่อคำขอทรัพยากร เซิร์ฟเวอร์สามารถรวมส่วนหัว Set-Cookie ไว้ในการตอบสนองด้วย ส่วนหัวดังกล่าวจะบอกให้เบราว์เซอร์จัดเก็บคุกกี้

ตัวอย่างเช่น Set-Cookie:cat=tabby

นอกจากจะระบุชื่อและค่าคุกกี้แล้ว Set-Cookie ยังสามารถรวมแอตทริบิวต์เพื่อควบคุมว่าจะตั้งค่าคุกกี้หรือไม่ และคุกกี้จะหมดอายุเมื่อใด แอตทริบิวต์คุกกี้จะคั่นด้วยเครื่องหมายเซมิโคลอน เช่น

    Set-Cookie:cat=tabby; Secure; HTTPOnly; Expires=Tue, 31 Dec 2999 23:59:59 GMT;

เอกสารนี้อธิบายแอตทริบิวต์คุกกี้ที่สำคัญที่สุด

การใช้คุกกี้ HTTP จะอธิบายแอตทริบิวต์คุกกี้ในรายละเอียดทางเทคนิคมากขึ้น

Secure

หากส่วนหัว Set-Cookie มี Secure ระบบจะรวมคุกกี้ไว้กับคำขอที่เข้ารหัสซึ่งใช้โปรโตคอล HTTPS เท่านั้น โดยจะไม่รวมคุกกี้ไว้ในคำขอ HTTP ซึ่งจะช่วยหยุด การโจมตีแบบคนกลาง (Man-in-the-middle) ที่ผู้โจมตีจะเข้าแทรกแซงการสื่อสารระหว่าง เบราว์เซอร์กับเซิร์ฟเวอร์อย่างลับๆ เพื่อส่งต่อข้อมูลและอาจเปลี่ยนแปลงข้อมูลดังกล่าว

HTTPOnly

หากส่วนหัว Set-Cookie มี HTTPOnly JavaScript จะเข้าถึงคุกกี้ไม่ได้ เช่น โดยใช้ document.cookie ซึ่งจะช่วยป้องกันการโจมตีบางประเภทที่กำหนดเป้าหมายไปที่คุกกี้

SameSite

คำขอทรัพยากรจากเว็บไซต์อื่นที่ไม่ใช่เว็บไซต์ที่คุณเข้าชมคือคำขอข้ามเว็บไซต์ คุกกี้ที่ตั้งค่าเพื่อตอบสนองต่อคำขอข้ามเว็บไซต์คือคุกกี้ของบุคคลที่สาม

แอตทริบิวต์ SameSite จะควบคุมว่าจะรวมคุกกี้ของบุคคลที่สามไว้ในคำขอหรือไม่ โดยมีค่าที่เป็นไปได้ 3 ค่า ได้แก่ Strict, Lax หรือ None

ดูข้อมูลเพิ่มเติมได้ที่คุกกี้ของบุคคลที่สามคืออะไร

Strict

ระบบจะส่งคุกกี้เพื่อตอบสนองต่อคำขอจากหน้าเว็บที่อยู่ในเว็บไซต์ต้นทางของคุกกี้เท่านั้น ตัวอย่างเช่น ลองนึกภาพว่าผู้ใช้เข้าชม cats.example และมีการตั้งค่าคุกกี้ด้วยแอตทริบิวต์ SameSite=Strict ต่อมาผู้ใช้เข้าชมเว็บไซต์อื่นและคลิกลิงก์ไปยังหน้าเว็บใน cats.example ระบบจะไม่รวมคุกกี้ที่ตั้งค่าไว้ในคำขอนั้น

Lax

แอตทริบิวต์นี้ทำงานในลักษณะเดียวกับ Strict ยกเว้นว่าเบราว์เซอร์จะรวมคุกกี้ไว้ด้วยเมื่อผู้ใช้คลิกลิงก์ไปยังเว็บไซต์ต้นทางของคุกกี้ (ในตัวอย่าง Strict ก่อนหน้านี้ ระบบ จะ รวมคุกกี้ไว้เมื่อผู้ใช้คลิกลิงก์ไปยัง cats.example) Lax เป็นค่าเริ่มต้นหากไม่มีแอตทริบิวต์ SameSite ในส่วนหัว Set-Cookie

None

ไม่มีข้อจำกัด โดยระบบจะรวมคุกกี้ไว้กับคำขอ ไม่ว่าจะเป็นคำขอข้ามเว็บไซต์หรือไม่ก็ตาม เมื่อใช้ SameSite=None คุกกี้ต้องมีแอตทริบิวต์ Secure ด้วย

Partitioned

แอตทริบิวต์นี้ช่วยให้คุณเลือกใช้คุกกี้สำหรับพื้นที่เก็บข้อมูลที่แบ่งพาร์ติชัน โดยมี "โหลคุกกี้" แยกกันสำหรับเว็บไซต์ระดับบนสุดแต่ละเว็บไซต์ ระบบจะใช้คีย์ 2 รายการสำหรับคุกกี้ ได้แก่ เว็บไซต์ระดับบนสุดและโดเมนที่ตั้งค่าคุกกี้

ตัวอย่างเช่น ลองนึกภาพว่าทั้งเว็บไซต์ ก. และเว็บไซต์ ข. มี iframe จากเว็บไซต์ ค. iframe ในเว็บไซต์ ข. จะเข้าถึงคุกกี้ที่แบ่งพาร์ติชันซึ่ง iframe ในเว็บไซต์ ก. ตั้งค่าไว้ไม่ได้ เนื่องจากคุกกี้ ก.ค. แยกจากคุกกี้ ข.ค.

แผนภาพแสดงว่าเว็บไซต์ 2 เว็บไซต์ที่แตกต่างกันซึ่งฝังบุคคลที่สามร่วมกันจะไม่แชร์คุกกี้สำหรับบุคคลที่สามนั้นอีกต่อไป
เมื่อมีการแบ่งพาร์ติชันคุกกี้ บริการของบุคคลที่สามที่ตั้งค่าคุกกี้เมื่อฝังอยู่ในเว็บไซต์ระดับบนสุดเว็บไซต์หนึ่งจะเข้าถึงคุกกี้เดียวกันนั้นไม่ได้เมื่อฝังบริการไว้ในเว็บไซต์ระดับบนสุดอื่นๆ

คุกกี้ที่มีแอตทริบิวต์ Partitioned เรียกว่า CHIPS หรือ Cookies Having Independent Partitioned State

คุกกี้ที่แบ่งพาร์ติชันต้องมีแอตทริบิวต์ Secure

ดูข้อมูลเพิ่มเติมได้ที่ Cookies Having Independent Partitioned State

Expires และ Max-Age

คุณสามารถระบุวันที่และเวลา 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 ไว้ในส่วนหัวการตอบกลับ 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: การสาธิตคุกกี้ของบุคคลที่สาม

เครื่องมือ

ดูข้อมูลเพิ่มเติม