เหตุใดจึงไม่สามารถใช้ซ็อกเก็ตเพื่อระบุตัวบุคคลแทนคุกกี้ได้


17

อีกคำถามที่ถูกถามเกี่ยวกับการใช้ที่อยู่ IP เพื่อระบุลูกค้ารายบุคคล ฉันคิดว่าฉันเข้าใจว่าทำไมที่อยู่ IP ไม่เพียงพอ แต่สิ่งที่เกี่ยวกับซ็อกเก็ตซึ่งมีข้อมูลเพิ่มเติมและจากสิ่งที่ฉันเข้าใจคือ stateful? ไม่สามารถใช้แทนคุกกี้ได้ใช่ไหม


18
ซ็อกเก็ตเป็นสถานะเต็ม แต่ http ไม่เปิดการเชื่อมต่อหลังจากที่คุณดาวน์โหลดเว็บเพจ จะปิดประมาณ 15 วินาทีหลังจากดาวน์โหลดหน้าเว็บทั้งหมด นี่คือเหตุผลทั้งหมดที่คุณต้องการใช้คุกกี้เพื่อรักษาสถานะไว้
MTilsted

41
ซ็อกเก็ตไม่ใช่ข้อมูล คุณไม่สามารถส่งได้ คำถามของคุณไม่สมเหตุสมผล
user207421

8
มันเหมือนกับถามว่าทำไมคุณไม่สามารถใช้คำกริยาแทนคำนาม ...
user541686

2
@EJP: ฉันตอบภายใต้สมมติฐานว่า OP หมายถึง quadruple (source_ip, source_port, target_ip, target_port) แทนการใช้วัตถุซ็อกเก็ต แต่การตีความของคุณก็สมเหตุสมผลเช่นกัน
Jörg W Mittag

คุณสามารถลองและเลียนแบบวิธีการทำงานของ firebase ในการจัดการสถานะหรือข้อมูลประจำตัวผู้ใช้โดยไม่ต้องมีคุกกี้หรือเซสชัน
JeffO

คำตอบ:


64

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

และสิ่งที่ตรงกันข้ามอาจเกิดขึ้นได้เช่นกัน: ถ้าฉันปิดแท็บเบราว์เซอร์ของฉันผู้ใช้รายอื่นในเครื่องอาจเปิดแท็บเบราว์เซอร์ไปที่ SE.SE และอาจได้รับสี่เท่าเดิม (source_ip, source_port, target_ip, target_port) เขาจะได้รับการตั้งค่าทั้งหมดของฉัน


เป็นที่น่าสังเกตว่าด้วย http2 (และ http pipelining) ที่คุณอาจไม่มีซ็อกเก็ตสองตัวที่เปิดให้ SE เบราว์เซอร์ของคุณจะใช้ซ็อกเก็ตเดียวกันอีกครั้ง คุณต้องมีเบราว์เซอร์ที่ต่างกันทำงานอยู่
แมทธิวยอดแหลม

3
ตรวจสอบท้องถิ่นเล็ก ๆ น้อย ๆ ที่บ่งชี้ว่า Chrome จะเก็บหนึ่งซ็อกเก็ตเปิดต่อแท็บ - อาจจะเป็นเพราะพวกเขากำลัง sandboxed และไม่ต้องการรัฐแบ่งระหว่างพวกเขา - แต่ซ็อกเก็ตของแต่ละแท็บน่าจะเป็นแบบถาวรและการร้องขออาจจะไปป์ไลน์ภายในแท็บนั้น
ไร้ประโยชน์

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

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

จริงอยู่ที่ฉันพยายามค้นหาไซต์ที่มีความเสถียรอย่างแท้จริงเพื่อตรวจสอบ ในการนี้ Chrome จะเปิดซ็อกเก็ตหลายแท็บต่อแท็บและยังไม่สามารถใช้ซ้ำได้ระหว่างแท็บ แต่จะปิดได้เมื่อแท็บเสร็จสิ้นการโหลด มองเห็นได้ง่ายเพราะใช้เวลานานใน TIME_WAIT
ไร้ประโยชน์

20

ซ็อกเก็ต TCP ได้รับการออกแบบให้มีสถานะดังนั้นโดยทั่วไปจะใช้เพื่อระบุเซสชัน โปรโตคอลเช่น SSH และ ftp ทำสิ่งนี้ทุกประการ

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

ดังนั้นไม่สามารถใช้ซ็อกเก็ตได้เนื่องจาก HTTP จะปิดซ็อกเก็ตหลังจากดาวน์โหลดหน้าเว็บ

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

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

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

  • อีเธอร์เน็ต, Wifi ฯลฯ = ไร้สัญชาติ
  • IP = ไร้สัญชาติ
  • TCP = สภาวะ
  • HTTP = ไร้สัญชาติ
  • HTTP + cookies = stateful

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


4
"เซิร์ฟเวอร์ HTTP ที่ใช้งานเว็บไซต์ที่ทันสมัยสามารถรองรับผู้ใช้มากกว่าเซิร์ฟเวอร์ที่ใช้ซ็อกเก็ตอย่าง SSH หรือ ftp" [อ้างจำเป็น]
el.pescado

6
@ el.pescado: มันสมเหตุสมผลนะ เนื่องจากเซิร์ฟเวอร์ที่ใช้ซ็อกเก็ตยังคงรักษาการเชื่อมต่ออยู่ดังนั้นเซิร์ฟเวอร์ที่ใช้ซ็อกเก็ตจึง จำกัด จำนวนไฟล์ตัวอธิบายไฟล์สูงสุดที่คุณสามารถเปิดได้ หากคุณไม่ต้องการเชื่อมต่ออย่างต่อเนื่องข้อ จำกัด ของคุณคือแบนด์วิดท์ โปรดทราบว่าขีด จำกัด แบนด์วิดท์เป็นสภาพอากาศเดียวกับที่คุณคงการเชื่อมต่อไว้หรือไม่ เซิร์ฟเวอร์ HTTP สมัยใหม่สามารถรองรับคำขอนับล้านต่อวินาที หากพวกเขาต้องการเก็บซ็อคเก็ตนับล้านขึ้นในขณะที่คุณอ่านเว็บเพจเซิร์ฟเวอร์จะตาย
2017

6
+1 สำหรับ "ดังนั้นคุกกี้จึงถูกสร้างขึ้นเพื่อแนะนำสถานะใหม่ให้กับโปรโตคอลไร้สัญชาติที่ส่งผ่านเลเยอร์การถ่ายโอนแบบ stateful ที่ส่งผ่านเลเยอร์เครือข่ายไร้สัญชาติ" สวยงามมาก
Reinstate Monica - dirkk

ฉันชอบคำตอบนี้ มันตัดสิทธิ์ของหลักของปัญหา
Jim W

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