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

เมื่อเว็บเซิร์ฟเวอร์ตอบกลับคำขอทรัพยากร เซิร์ฟเวอร์สามารถใส่ส่วนหัว 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

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

คุกกี้ที่มีแอตทริบิวต์ 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: การสาธิตคุกกี้ของบุคคลที่สาม

เครื่องมือ

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