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

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

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

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

บทความนี้จะอธิบายแอตทริบิวต์คุกกี้ที่สําคัญที่สุด

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

แบบปลอดภัย

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

👉 คุณควรใส่ Secure โดยค่าเริ่มต้นสำหรับคุกกี้ทั้งหมด

HTTPOnly

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

👉 คุณควรใส่ HTTPOnly โดยค่าเริ่มต้นสำหรับคุกกี้ทั้งหมด ยกเว้นในกรณีที่คุณต้องตั้งค่าและรับค่าคุกกี้โดยใช้ JavaScript

SameSite

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

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

👉 SameSite=Lax คือค่าเริ่มต้นหากไม่ได้ตั้งค่าไว้ SameSite=None อนุญาตคุกกี้ข้ามเว็บไซต์ แต่หมายความว่าระบบจะบล็อกคุกกี้ในกรณีที่มีการจำกัดคุกกี้ของบุคคลที่สาม

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

เข้มงวด

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

LAX

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

ไม่มี

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

แบ่งพาร์ติชันแล้ว

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

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

👉 คุณควรใส่แอตทริบิวต์ Partitioned โดยค่าเริ่มต้นหากกำลังสร้างคุกกี้ของบุคคลที่สาม เว้นแต่คุณจะทราบอย่างชัดเจนว่าต้องแชร์คุกกี้นั้นในแทรกหลายรายการ

แผนภาพที่แสดงว่าเว็บไซต์ 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 ระบบจะลบคุกกี้เมื่อเซสชันปัจจุบันสิ้นสุด คุกกี้ประเภทนี้บางครั้งเรียกว่าคุกกี้เซสชัน

👉 เว้นแอตทริบิวต์ Max-Age และ Expires ไว้ เว้นแต่ว่าคุณต้องการให้คุกกี้อยู่ได้นานกว่าเซสชันปัจจุบัน เบราว์เซอร์จะลบคุกกี้ที่หมดอายุ ดังนั้นจึงไม่มีเหตุผลที่จะตั้งค่าวันหมดอายุเป็นปีข้างหน้า แต่คุณควรพิจารณารีเฟรชคุกกี้เมื่อผู้ใช้เข้าชมเว็บไซต์อีกครั้ง

โดเมน

หากส่วนหัว 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

👉 อย่าใส่แอตทริบิวต์ Domain เว้นแต่ว่าคุณต้องการให้คุกกี้รวมอยู่ในคำขอไปยังโดเมนย่อย

เส้นทาง

หากแอตทริบิวต์ 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 เท่านั้น

👉 รวม Path=/ กับคุกกี้หากต้องการให้คําขอทั้งหมดไปยังเส้นทางใดก็ตามในเว็บไซต์รวมคุกกี้ อย่าพึ่งพา Path เพื่อปกป้องความปลอดภัย

การสาธิต

  • 1pc.glitch.me: การสาธิตคุกกี้ของบุคคลที่หนึ่ง
  • 3pc.glitch.me: การสาธิตคุกกี้ของบุคคลที่สาม

เครื่องมือ

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