Tại sao không thể sử dụng ổ cắm để nhận dạng cá nhân thay vì cookie?


17

Một câu hỏi khác được đặt ra liên quan đến việc sử dụng địa chỉ IP để xác định các khách hàng cá nhân. Tôi nghĩ rằng tôi hiểu tại sao một địa chỉ IP là không đủ. Nhưng những gì về ổ cắm, trong đó có nhiều thông tin hơn và, từ những gì tôi hiểu, là trạng thái? Không thể có khả năng được sử dụng thay cho cookie?


18
Ổ cắm này rất chắc chắn, nhưng http không giữ kết nối mở sau khi bạn đã tải xuống trang web. Nó đóng khoảng 15 giây sau khi toàn bộ trang web được tải xuống. đây là toàn bộ lý do bạn cần cookie để giữ trạng thái
MTilsted

41
Một ổ cắm không phải là một phần của dữ liệu. Bạn không thể gửi nó về. Câu hỏi của bạn không có ý nghĩa.
dùng207421

8
Nó giống như hỏi tại sao bạn không thể sử dụng động từ thay vì danh từ ...
Mehrdad

2
@EJP: Tôi đã trả lời theo giả định rằng OP có nghĩa là bộ tứ (source_ip, source_port, target_ip, target_port) thay vì đối tượng socket. Nhưng giải thích của bạn có ý nghĩa, quá.
Jörg W Mittag

Bạn có thể thử và bắt chước cách hoạt động của căn cứ hỏa lực để quản lý danh tính người dùng hoặc trạng thái mà không cần cookie hoặc phiên.
JeffO

Câu trả lời:


64

Một ổ cắm xác định một kết nối . Cookies thường được sử dụng để xác định người dùng . Nếu tôi mở hai tab trình duyệt tới SE.SE, tôi sẽ có hai kết nối và do đó có hai ổ cắm. Nhưng tôi muốn các thiết lập của tôi tồn tại trên cả hai. (Trên thực tế, thông thường, một trình duyệt mở nhiều ổ cắm cho một trang để tăng tốc thời gian tải trang; tôi tin rằng hầu hết các trình duyệt có giá trị tối đa mặc định trong khoảng từ 4 đến 10 ổ cắm trên mỗi trang.)

Và điều ngược lại cũng có thể xảy ra: nếu tôi đóng tab trình duyệt của mình, một người dùng khác trên máy có thể mở tab trình duyệt sang SE.SE và có thể nhận được cùng một bộ tứ (source_ip, source_port, target_ip, target_port), trong trường hợp đó , anh ấy sẽ nhận được tất cả các cài đặt của tôi.


Điều đáng chú ý là với http2 (và http pipelining) mà bạn có thể sẽ không có hai ổ cắm mở cho SE. Trình duyệt của bạn sẽ sử dụng lại cùng một ổ cắm. Bạn cần có các trình duyệt khác nhau đang chạy.
Matthew Steeples

3
Kiểm tra cục bộ tầm thường chỉ ra rằng Chrome không mở một ổ cắm trên mỗi tab - có thể là do chúng được đóng hộp cát và nó không muốn chia sẻ trạng thái giữa chúng - nhưng mỗi ổ cắm của mỗi tab dường như vẫn tồn tại và các yêu cầu có thể được đặt trong tab đó.
Vô dụng

1
Cũng đáng lưu ý rằng bạn cũng không biết những gì đang diễn ra ở phía sau. Nhiều bộ cân bằng tải sẽ chấm dứt kết nối người dùng và sau đó mở riêng cho các máy chủ phía sau có nghĩa là bạn có thể có nhiều người dùng chia sẻ một ổ cắm.
Dan

@Usless IIRC SE không sử dụng WebSockets hoặc bỏ phiếu dài (dự phòng) để tìm nạp các bản cập nhật (câu hỏi mới, chỉnh sửa, v.v.) trong trường hợp bạn đang thử nghiệm ở đây. Các trang web khác có thể hoạt động khác đi - không có nhiều điểm khiến ổ cắm mở vô thời hạn trên một trang web tĩnh.
Bob

Đúng vậy, tôi đã mất một vài lần cố gắng tìm một trang web thực sự tĩnh để kiểm tra. Do đó, Chrome mở nhiều ổ cắm trên mỗi tab và vẫn không sử dụng lại chúng giữa các tab, nhưng sẽ đóng chúng sau khi tab tải xong. Chúng dễ dàng được nhìn thấy bởi vì chúng dành quá nhiều thời gian trong TIME_WAIT.
Vô dụng

20

Ổ cắm TCP được thiết kế để có trạng thái vì vậy nói chung chúng được sử dụng để xác định các phiên. Các giao thức như SSH và ftp thực hiện chính xác điều này.

HTTP được thiết kế để không trạng thái và mỗi kết nối chỉ được liên kết với một tài nguyên sẽ được tải xuống. Sau khi tài nguyên được tải xuống ổ cắm TCP, yêu cầu HTTP sẽ được đóng lại. Lý do ban đầu cho điều này là sự đơn giản. Nhưng tác dụng phụ là các máy chủ HTTP chạy các trang web hiện đại có thể xử lý nhiều người dùng hơn nhiều so với các máy chủ dựa trên socket như SSH hoặc ftp.

Vì vậy, các socket không thể được sử dụng vì HTTP sẽ đóng socket sau khi tải xuống trang web.

Tất nhiên, việc nói HTTP sẽ đóng ổ cắm trên mỗi tài nguyên là quá đơn giản vì HTTP có các tính năng như đường ống và các kết nối liên tục có thể tải xuống nhiều tài nguyên trên mỗi ổ cắm. Nhưng đó chỉ là tối ưu hóa. Sau khi mọi thứ đã tải xuống, trình duyệt của bạn sẽ đóng ổ cắm sau một khoảng thời gian chờ.

HTTP ban đầu được thiết kế như một giao thức đơn giản để tải xuống các tệp HTML. Các trình duyệt cũ cũng có thể tải xuống các tệp HTML từ các giao thức khác như Gopher và ftp. Như vậy, không có lý do gì để tạo trạng thái HTTP vì các tệp HTML chỉ là các tệp văn bản đơn giản.

Khi các biểu mẫu web được giới thiệu và các trang HTML có thể gửi dữ liệu trở lại các trang web của máy chủ bắt đầu cần phiên. Do đó, cookie được tạo để giới thiệu lại trạng thái cho giao thức không trạng thái được truyền qua lớp chuyển trạng thái được truyền qua lớp mạng không trạng thái. Vì vậy, các lớp ứng dụng đầy đủ là:

  • Ethernet, Wifi, vv = không trạng thái
  • IP = không quốc tịch
  • TCP = trạng thái
  • HTTP = không trạng thái
  • HTTP + cookie = trạng thái

Ngày nay, chúng tôi có các ổ cắm web có thể giữ một ổ cắm mở duy nhất từ ​​trang web của bạn đến máy chủ. Vì vậy, với websockets, bạn có thể sử dụng lại socket để xác định người dùng bởi vì websocket tự nó là trạng thái. Nhưng trong hầu hết các trường hợp, bạn vẫn sẽ cần một cookie cho trang html chính tải javascript để khởi động websocket.


4
"Máy chủ HTTP chạy các trang web hiện đại có thể xử lý nhiều người dùng hơn nhiều so với các máy chủ dựa trên ổ cắm như SSH hoặc ftp" [cần dẫn nguồn]
el.pescado

6
@ el.pescado: Nó chỉ hợp lý. Do các máy chủ dựa trên ổ cắm giữ kết nối trực tiếp, do đó, các máy chủ dựa trên ổ cắm bị giới hạn ở số lượng mô tả tệp tối đa bạn có thể mở (và trên một số ổ cắm hệ điều hành cạnh tranh với đĩa cứng cho mô tả tệp). Nếu bạn không cần duy trì kết nối thì giới hạn của bạn chỉ là băng thông. Lưu ý rằng giới hạn băng thông có giống với thời tiết bạn giữ kết nối còn sống hay không. Các máy chủ HTTP hiện đại có thể xử lý hàng triệu yêu cầu mỗi giây. Nếu họ cần giữ hàng triệu ổ cắm đó trong khi bạn đọc một trang web thì máy chủ sẽ chết
slebetman

6
+1 cho "Do đó, cookie được tạo để giới thiệu lại trạng thái cho giao thức không trạng thái được truyền qua lớp chuyển trạng thái được truyền qua lớp mạng không trạng thái". Thật đẹp
Phục hồi Monica - dirkk

Tôi thích câu trả lời này. Nó cắt đúng vào cốt lõi của vấn đề.
Jim W

@slebetman HTTP server được ổ cắm-based. Tất cả bọn họ là. Theo định nghĩa. Và cookie không làm cho máy chủ HTTP trở nên trạng thái. Trong thực tế theo định nghĩa chúng không phải, đó là lý do tại sao các cookie được chuyển bởi khách hàng mỗi lần.
Miles Rout
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.