โดเมนคุกกี้ของเบราว์เซอร์ทำงานอย่างไร


380

เนื่องจากปัญหาโดเมน / โดเมนย่อยแปลก ๆ ที่ฉันได้รับฉันต้องการทราบว่าเบราว์เซอร์จัดการกับคุกกี้อย่างไร หากพวกเขาทำมันด้วยวิธีที่แตกต่างกันก็จะเป็นการดีที่ได้ทราบความแตกต่าง

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

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


ที่เพิ่ม:

เหตุผลที่ฉันถามเรื่องนี้เพราะฉันสนใจในบางกรณีขอบ ชอบ:

  • คุกกี้.example.comจะมีให้ใช้www.example.comหรือไม่
  • คุกกี้.example.comจะมีให้ใช้example.comหรือไม่
  • คุกกี้example.comจะมีให้ใช้www.example.comหรือไม่
  • คุกกี้example.comจะมีให้ใช้anotherexample.comหรือไม่
  • จะwww.example.comสามารถตั้งค่าคุกกี้ได้example.comหรือไม่
  • จะwww.example.comสามารถตั้งค่าคุกกี้ได้www2.example.comหรือไม่
  • จะwww.example.comสามารถตั้งค่าคุกกี้ได้.comหรือไม่
  • เป็นต้น

เพิ่ม 2:

นอกจากนี้ยังมีคนแนะนำว่าฉันควรตั้งค่าคุกกี้อย่างไร:

  • สามารถตั้งค่าได้ทั้งwww.example.comหรือexample.com;
  • มันสามารถเข้าถึงได้โดยทั้งสองและwww.example.comexample.com

คำตอบ:


367

แม้ว่าจะมีเป็นRFC 2965 ( Set-Cookie2มีจำหน่ายแล้วแล้วRFC 2109 ) ที่ควรกำหนดคุกกี้ปัจจุบันเบราว์เซอร์ส่วนใหญ่ไม่สนับสนุนอย่างเต็มที่ แต่เพียงเป็นไปตามข้อกำหนดเดิมโดย Netscape

มีความแตกต่างระหว่างค่าแอตทริบิวต์ของโดเมนและโดเมนที่มีประสิทธิภาพ: อดีตถูกนำมาจากSet-Cookieฟิลด์ส่วนหัวและหลังคือการตีความของค่าคุณลักษณะที่ ตาม RFC 2965 ควรใช้สิ่งต่อไปนี้:

  • หากคุกกี้ชุดข้อมูลส่วนหัวไม่ได้มีโดเมนแอตทริบิวต์โดเมนที่มีประสิทธิภาพเป็นโดเมนของการร้องขอ
  • หากมีแอตทริบิวต์ของโดเมนอยู่ค่าของมันจะถูกใช้เป็นโดเมนที่มีประสิทธิภาพ (หากค่าไม่เริ่มต้นด้วยลูกค้า.จะถูกเพิ่มเข้าไป)

มีโดเมนที่มีประสิทธิภาพนั้นจะต้องตรงกับโดเมนที่ร้องขอในปัจจุบันสำหรับการตั้งค่า; มิฉะนั้นคุกกี้จะถูกแก้ไข ใช้กฎเดียวกันนี้ในการเลือกคุกกี้ที่จะส่งในคำขอ


การจับคู่ความรู้นี้กับคำถามของคุณควรใช้สิ่งต่อไปนี้

  • คุกกี้ด้วยDomain=.example.com จะพร้อมใช้งานสำหรับwww.example.com
  • คุกกี้ที่มีDomain=.example.com จะพร้อมใช้งานสำหรับexample.com
  • คุกกี้ด้วยDomain=example.comจะถูกแปลงเป็น.example.comและจะสามารถใช้ได้สำหรับwww.example.com
  • คุกกี้ที่มีDomain=example.comจะไม่สามารถใช้ได้สำหรับanotherexample.com
  • www.example.com จะสามารถตั้งค่าคุกกี้สำหรับexample.com
  • www.example.comจะไม่สามารถตั้งค่าคุกกี้สำหรับwww2.example.com
  • www.example.comจะไม่สามารถตั้งค่าคุกกี้สำหรับ.com ได้

และหากต้องการตั้งค่าและอ่านคุกกี้สำหรับ / โดยwww.example.comและexample.comให้ตั้งค่า.www.example.comและ.example.comตามลำดับ แต่.www.example.comโดเมนแรก ( ) จะสามารถเข้าถึงได้สำหรับโดเมนอื่น ๆ ด้านล่างโดเมนนั้น (เช่นfoo.www.example.comหรือbar.www.example.com ) ซึ่ง.example.comสามารถเข้าถึงได้โดยโดเมนอื่น ๆ ด้านล่างexample.com (เช่นfoo example.comหรือbar.example.com )


@Gumbo ดังนั้น abcexample.com สามารถเข้าถึงคุกกี้ด้วยโดเมน c.example.com ได้หรือไม่
Pacerier

2
คำถามที่ตามมาช้ามากสำหรับคำถามนี้ ประสบการณ์ของฉันและสิ่งนี้: webmasters.stackexchange.com/questions/55790/…แนะนำว่าโดเมนของ example.com จะไม่สามารถใช้ได้ที่ www.example.com แต่ตัวอย่างนี้จะแนะนำเป็นอย่างอื่น นี่เป็นตัวอย่างที่ผิดหรือฉันเข้าใจผิด (เป็นไปได้) ขออภัยสำหรับการอ่านกระทู้ แต่ต้องการให้แน่ใจว่าคำตอบที่ยอดเยี่ยมนี้ถูกต้อง 100% สำหรับมือใหม่ที่สับสนในอนาคตเช่นฉัน :)
errah

7
คำตอบนี้ล้าสมัยไปเล็กน้อย ดูคำตอบของฉันด้านล่าง
ZhongYu

1
ทำไมไม่ตั้งค่าสำหรับ example.com ให้พร้อมใช้งานสำหรับ www.example.com (เนื่องจากเป็นส่วนย่อย "www" ของ example.com หรือไม่
Nabeel Khan

Set-Cookie2 ล้าสมัยไปแล้ว ใช้ Set-Cookie ต่อไป
joeforker

122

คำตอบก่อนหน้านี้ล้าสมัยเล็กน้อย

RFC 6265เผยแพร่ในปี 2011 ตามมติของเบราว์เซอร์ในขณะนั้น ตั้งแต่นั้นมามีความซับซ้อนกับโดเมนต่อท้ายสาธารณะ ฉันเขียนบทความเพื่ออธิบายสถานการณ์ปัจจุบัน - http://bayou.io/draft/cookie.domain.html

ในการสรุปกฎที่ต้องปฏิบัติตามเกี่ยวกับโดเมนคุกกี้:

  • โดเมนกำเนิดของคุกกี้เป็นโดเมนของการร้องขอที่มีต้นกำเนิดที่

  • หากโดเมนต้นทางเป็น IP จะต้องไม่ตั้งค่าแอตทริบิวต์ของคุกกี้

  • หากไม่ได้ตั้งค่าแอตทริบิวต์โดเมนของคุกกี้คุกกี้จะใช้ได้กับโดเมนต้นทางเท่านั้น

  • หากตั้งค่าคุณสมบัติโดเมนของคุกกี้แล้ว

    • คุกกี้ใช้กับโดเมนนั้นและโดเมนย่อยทั้งหมด
    • โดเมนของคุกกี้จะต้องตรงกับหรือเป็นโดเมนหลักของโดเมนต้นทาง
    • โดเมนของคุกกี้ต้องไม่เป็น TLD ส่วนต่อท้ายสาธารณะหรือพาเรนต์ของส่วนต่อท้ายสาธารณะ

มันอาจเป็นได้ว่าคุกกี้สามารถใช้ได้กับโดเมนต้นทางเสมอ

โดเมนคุกกี้ไม่ควรมีจุดนำเช่นเดียวกับใน.foo.com- ใช้foo.com

ตัวอย่างเช่น,

  • x.y.z.comสามารถตั้งค่าโดเมนคุกกี้เพื่อตัวเองหรือพ่อแม่ x.y.z.com- y.z.com, z.com, แต่ไม่ใช่comซึ่งเป็นส่วนต่อท้ายสาธารณะ
  • คุกกี้กับโดเมน = y.z.comใช้ได้กับy.z.com, x.y.z.com, a.x.y.z.comฯลฯ

ตัวอย่างของคำต่อท้ายสาธารณะ - com, edu, uk, co.uk, blogspot.com,compute.amazonaws.com


5
@roelleor - เป็นวิธีอื่น ๆ rfc6265 ถูกเขียนขึ้นมาเพื่อสรุปว่าคุกกี้ได้รับการจัดการอย่างไรในทางปฏิบัติ :) ใช่แล้ว rfc นั้นเป็นภาพสะท้อนที่ถูกต้องแม่นยำของวิธีการทำงานของเบราว์เซอร์หลัก ๆ การทดสอบล่าสุดของฉันในเบราว์เซอร์ยืนยันว่า แม้ว่าพวกเขาอาจแตกต่างกันในกรณีมุมที่เกี่ยวข้องกับคำต่อท้ายสาธารณะ
ZhongYu

2
อะไรคือผลลัพธ์ของจุดนำ
UpTheCreek

3
@UpTheCreek - ตาม rfc6265 จุดนำควรถูกละเว้นโดยลูกค้า
ZhongYu

2
มันไม่แปลกที่x.y.z.comสามารถตั้งค่าคุกกี้เพื่อz.com?
Royi Namir

1
ดังนั้นหาก xyzcom สามารถตั้งค่าคุกกี้เป็น yzcom และคุกกี้ที่มีโดเมน yzcom สามารถใช้ได้กับ wyzcom ... นั่นหมายความว่าxyzcom สามารถตั้งค่าคุกกี้เป็น wyzcom ได้หรือไม่
Ioanna

9

สำหรับความคุ้มครองที่กว้างขวางตรวจทานเนื้อหาของRFC2965 แน่นอนว่าไม่ได้หมายความว่าเบราว์เซอร์ทั้งหมดจะทำงานในลักษณะเดียวกัน

อย่างไรก็ตามโดยทั่วไปกฎสำหรับเส้นทางเริ่มต้นหากไม่มีการระบุไว้ในคุกกี้คือเส้นทางใน URL ที่มีส่วนหัว Set-Cookie มาถึง ในทำนองเดียวกันค่าเริ่มต้นสำหรับโดเมนคือชื่อโฮสต์แบบเต็มใน URL ที่ Set-Cookie มาถึง

กฎการจับคู่สำหรับโดเมนนั้นต้องมีคุกกี้โดเมนเพื่อจับคู่โฮสต์ที่จะทำการร้องขอ คุกกี้สามารถระบุการจับคู่โดเมนที่กว้างขึ้นโดยรวม * ในแอตทริบิวต์โดเมนของ Set-Cookie (ส่วนนี้ซึ่งเบราว์เซอร์อาจแตกต่างกัน) การจับคู่เส้นทาง (สมมติว่าการจับคู่โดเมน) เป็นเรื่องง่ายที่เส้นทางที่ร้องขอต้องอยู่ในเส้นทางที่ระบุในคุกกี้ โดยทั่วไปแล้วคุกกี้เซสชันจะถูกตั้งค่าด้วย path = / หรือ path = / applicationName / ดังนั้นคุกกี้จะมีให้สำหรับคำขอทั้งหมดในแอปพลิเคชัน


การตอบสนองต่อการเพิ่ม:

  • คุกกี้สำหรับ. example.com จะพร้อมใช้งานสำหรับ www.example.com หรือไม่ ใช่
  • คุกกี้สำหรับ. example.com จะพร้อมใช้งานสำหรับ example.com หรือไม่ ไม่ทราบ
  • คุกกี้สำหรับ example.com จะพร้อมใช้งานสำหรับ www.example.com หรือไม่ ไม่ควร แต่ ... *
  • คุกกี้สำหรับ example.com จะพร้อมใช้งานสำหรับ anotherexample.com หรือไม่ ไม่
  • www.example.com จะสามารถตั้งค่าคุกกี้สำหรับ example.com ได้หรือไม่ ใช่
  • www.example.com จะสามารถตั้งค่าคุกกี้สำหรับ www2.example.com ได้หรือไม่ ไม่ (ยกเว้นผ่าน. example.com)
  • www.example.com จะสามารถตั้งค่าคุกกี้สำหรับ .com ได้หรือไม่ ไม่มี (ไม่สามารถตั้งค่าคุกกี้นี้สูงขึ้น namespace หรือคุณสามารถตั้งค่าหนึ่งสำหรับสิ่งที่ต้องการ .co.uk)

*ฉันไม่สามารถทดสอบนี้ในขณะนี้ แต่ฉันมีความเฉลียวว่าอย่างน้อย 7/6 จะรักษาเส้นทาง ราวกับว่ามันเป็น example.com.example.com


ฉันได้เพิ่มเคสที่น่าสนใจในคำถามของฉันแล้ว คุณอาจจะยกย่องบางสิ่งในนั้นได้ไหม?
Vilx-

8

RFC สุดท้าย (ที่สามเป็นอย่างแน่นอน) สำหรับปัญหานี้คือ RFC-6265 (เลิกใช้งาน RFC-2965 ซึ่งในทางกลับกันล้าสมัย RFC-2109)

ตามที่มันถ้าเซิร์ฟเวอร์ละเว้นแอตทริบิวต์โดเมนตัวแทนผู้ใช้จะกลับคุกกี้เฉพาะกับเซิร์ฟเวอร์กำเนิด (เซิร์ฟเวอร์ที่ได้รับอยู่ทรัพยากร) แต่ก็ยังเตือนว่าตัวแทนผู้ใช้ที่มีอยู่บางคนปฏิบัติต่อแอตทริบิวต์ที่ขาดหายไปของโดเมนราวกับว่ามีแอตทริบิวต์ของโดเมนอยู่และมีชื่อโฮสต์ปัจจุบัน (ตัวอย่างเช่นถ้าexample.comส่งกลับส่วนหัว Set-Cookie โดยไม่มีแอตทริบิวต์ของโดเมนตัวแทนผู้ใช้เหล่านี้จะ ส่งคุกกี้ไปที่ www.example.com อย่างผิดพลาดเช่นกัน)

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

ตัวอย่างเช่น:

  • คุณลักษณะคุกกี้Domain=.example.comเท่ากับDomain=example.com
  • คุกกี้ที่มีคุณสมบัติโดเมนดังกล่าวจะสามารถใช้ได้สำหรับexample.comและwww.example.com
  • คุกกี้ที่มีคุณสมบัติ Domain ดังกล่าวจะไม่สามารถใช้ได้สำหรับเว็บไซต์ example.com อื่น ๆ
  • การระบุแอตทริบิวต์ของคุกกี้เช่นDomain=www.example.comจะปิดทางสำหรับwww4.example.com

PS: จุลภาคต่อท้ายในแอตทริบิวต์โดเมนจะทำให้ตัวแทนผู้ใช้ที่จะละเว้น attribute = (


6

ฉันทดสอบทุกกรณีใน Chrome, Firefox, Safari ล่าสุดในปี 2019

การตอบสนองต่อการเพิ่ม:

  • คุกกี้สำหรับ. example.com จะพร้อมใช้งานสำหรับ www.example.com หรือไม่ ใช่
  • คุกกี้สำหรับ. example.com จะพร้อมใช้งานสำหรับ example.com หรือไม่ ใช่
  • คุกกี้สำหรับ example.com จะพร้อมใช้งานสำหรับ www.example.com หรือไม่ NOโดเมนที่ไม่มีไวด์การ์ดตรงกับตัวเองเท่านั้น
  • คุกกี้สำหรับ example.com จะพร้อมใช้งานสำหรับ anotherexample.com หรือไม่ NO
  • www.example.com จะสามารถตั้งค่าคุกกี้สำหรับ example.com ได้หรือไม่ NOจะสามารถตั้งค่าคุกกี้เป็น '.example.com' แต่ไม่ใช่ 'example.com'
  • www.example.com จะสามารถตั้งค่าคุกกี้สำหรับ www2.example.com ได้หรือไม่ NO แต่สามารถตั้งค่าคุกกี้สำหรับ. example.com ซึ่ง www2.example.com สามารถเข้าถึงได้
  • www.example.com จะสามารถตั้งค่าคุกกี้สำหรับ .com ได้หรือไม่ NO


3

มีกฎที่กำหนดว่าเบราว์เซอร์จะยอมรับส่วนหัวการตอบกลับของส่วนหัว (การเขียนคุกกี้ฝั่งเซิร์ฟเวอร์) เป็นกฎ / การตีความที่แตกต่างกันเล็กน้อยสำหรับชุดคุกกี้โดยใช้ Javascript (ฉันไม่ได้ทดสอบ VBScript)

จากนั้นมีกฎที่กำหนดว่าเบราว์เซอร์จะส่งคุกกี้พร้อมกับคำขอหน้าเว็บหรือไม่

มีความแตกต่างระหว่างเอนจิ้นเบราว์เซอร์หลัก ๆ เกี่ยวกับวิธีการจับคู่โดเมนและวิธีการตีความพารามิเตอร์ในค่าพา ธ คุณสามารถค้นหาหลักฐานเชิงประจักษ์ได้ในบทความว่าเบราว์เซอร์ที่แตกต่างกันจัดการคุกกี้ต่างกันอย่างไร


2

ฉันรู้สึกประหลาดใจที่ได้อ่านหัวข้อ 3.3.2 เกี่ยวกับการปฏิเสธคุกกี้:

http://tools.ietf.org/html/rfc2965

นั่นบอกว่าเบราว์เซอร์ควรปฏิเสธคุกกี้จาก xyzcom ด้วย domain .z.com เนื่องจาก 'xy' มีจุด ดังนั้นหากฉันไม่ตีความ RFC และ / หรือคำถามข้างต้นผิดอาจมีคำถามเพิ่ม:

คุกกี้สำหรับ. example.com จะพร้อมใช้งานสำหรับ www.yyy.example.com หรือไม่ เลขที่

คุกกี้จะถูกตั้งค่าโดยเซิร์ฟเวอร์ต้นทาง www.yyy.example.com ที่มีโดเมน. example.com จะมีค่าที่ส่งโดยตัวแทนผู้ใช้ไปยัง xxx.example.com หรือไม่ เลขที่


2
rfc นั้นล้าสมัยแล้ว RFC ใหม่ 6265 บนพื้นฐานของฉันทามติเบราว์เซอร์ที่ช่วยให้คุกกี้z.comจะถูกนำไปใช้z.comและทุกโดเมนย่อย
ZhongYu

1

จะwww.example.comสามารถตั้งค่าคุกกี้ได้.comหรือไม่

ไม่มี แต่อาจจะสามารถตั้งค่าคุกกี้สำหรับexample.com.fr example2.com.frFirefox ป้องกันสิ่งนี้โดยการดูแลรายการ TLDs: http://securitylabs.websense.com/content/Blogs/3108.aspx

เห็นได้ชัดว่า Internet Explorer ไม่อนุญาตให้โดเมนตัวอักษรสองตัวกับคุกกี้ชุดซึ่งผมคิดว่าอธิบายว่าทำไมจะเปลี่ยนเส้นทางไปo2.ie o2online.ieฉันมักจะสงสัยว่า


"com.fr" คือ konwn เป็น "ส่วนต่อท้ายสาธารณะ" โดเมนคุกกี้ไม่สามารถต่อท้ายสาธารณะได้ ดู rfc 6265 และ publicsuffix.org
ZhongYu

ใช่มันมีทางออก แต่มันก็ยุ่งเหยิงไปหมด การติดป้ายกำกับประเภทนี้ควรนำเข้าสู่ DNS ซึ่งไม่ได้ทำแบบเฉพาะกิจแยกกัน
TRiG

จริงและบางทีคุณอาจอ้างถึง "dbound" แต่นั่นอาจสร้างปัญหามากขึ้น เช่นการวางสิ่งที่ท้าทายสำหรับการใช้งานไคลเอนต์ http
ZhongYu

มันจะมีประโยชน์หากข้อมูลนี้ถูกเปิดเผยจากเบราว์เซอร์ไปยังจาวาสคริปต์ มิฉะนั้นเป็นไปไม่ได้ที่จะกำหนดทางโปรแกรมว่าคุณสามารถตั้งค่าคุกกี้ในระดับโดเมนได้หรือไม่ คุณไม่สามารถตรวจสอบรายการนั้นด้วยการโทรทุกครั้ง!
Dtipson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.