Чому не можна використовувати розетки для ідентифікації осіб замість файлів cookie?


17

Було задано ще одне питання щодо використання IP-адрес для ідентифікації окремих клієнтів. Я думаю, я розумію, чому IP-адреса недостатня. А як щодо сокета, який має більше інформації і, наскільки я розумію, є репутацією? Чи не може це потенційно використовуватись замість файлу cookie?


18
Розетка є станом, але http не залишає відкритим з'єднання після завантаження веб-сторінки. Він закривається приблизно через 15 секунд після завантаження всієї веб-сторінки. це вся причина, що для збереження стану вам потрібні файли cookie
— MTilsted

41
Розетка не є частиною даних. Ви не можете надіслати його. Ваше запитання не має сенсу.
— користувач207421

8
Це як запитати, чому ви не можете використовувати дієслова замість іменників ...
— user541686

2
@EJP: Я відповів, припускаючи, що ОП означає (source_ip, source_port, target_ip, target_port) чотириразовий замість об'єкта socket. Але ваше тлумачення теж має сенс.
— Йорг W Міттаг

Ви можете спробувати наслідувати спосіб роботи firebase для керування ідентичністю штату чи користувача без файлів cookie чи сеансу.
— JeffO

Відповіді:


64

Сокет ідентифікує з'єднання . Файли cookie зазвичай використовуються для ідентифікації користувача . Якщо я відкрию два вкладки браузера для SE.SE, у мене будуть два з'єднання і, отже, два сокети. Але я хочу, щоб мої налаштування зберігалися в обох. (Насправді, як правило, веб-переглядач відкриває кілька розеток для однієї сторінки, щоб пришвидшити час завантаження сторінки; я вважаю, що більшість браузерів мають максимальне значення за замовчуванням між 4 та 10 сокетами на сторінку.)

І може статися навпаки: якщо я закрию вкладку браузера, інший користувач на машині може відкрити вкладку браузера для SE.SE і може отримати той самий чотириразовий (source_ip, source_port, target_ip, target_port), і в цьому випадку , він отримає всі мої налаштування.


Варто зазначити, що з http2 (та http-pipelining) у вас, ймовірно, не буде відкрито двох розеток для SE. Ваш браузер повторно використовувати той самий сокет. Вам потрібно мати різні веб-переглядачі.
— Метью Степлз

3
Найпростіша локальна перевірка показує , що Chrome робить тримати один сокет відкриті на вкладку - ймовірно , тому , що вони пісочницю і він не хоче , щоб частка держава між ними - але сокетом кожної вкладки, здається, бути стійкими і запити, ймовірно , конвеєрна в цій вкладці.
— Марно

1
Варто також зазначити, що ви також не знаєте, що відбувається на задньому кінці. Багато балансирів навантаження припиняють підключення користувачів, а потім відкривають власні сервери на задньому кінці, що означає, що у вас може бути декілька користувачів, які діляться одним сокетом.
— Dan

@Useless IIRC SE використовує або WebSockets, або тривалі опитування (резервне копіювання) для отримання оновлень (нові запитання, редагування тощо), якщо ви тестуєте тут. Інші сайти можуть поводитись інакше - не так багато сенсу тримати розетку відкритою на невизначений час на статичному сайті.
— Боб

Щоправда, мені знадобилося кілька спроб знайти справді-статичний сайт, щоб перевірити. Для цього, Chrome відкриває кілька гнізд на одну вкладку, і до сих пір не використовувати їх між вкладками, але робить їх закрити , як тільки вкладка по закінченні завантаження. Вони легко помітні, хоча проводять так довго в TIME_WAIT.
— Марно

20

TCP-розетки розроблені так, щоб вони були надійними, тому загалом вони використовуються для ідентифікації сеансів. Такі протоколи, як SSH та ftp, роблять саме це.

HTTP розроблений таким, що не має статусу, і кожне з'єднання асоціюється лише з ресурсом для завантаження. Після завантаження ресурсу сокет TCP, на який їде запит HTTP, закривається. Первісна причина цього - простота. Але побічним ефектом є те, що сервери HTTP, що працюють на сучасних веб-сайтах, можуть обробляти набагато більше користувачів, ніж сервери на базі сокетів, як SSH або ftp.

Тому сокети не можна використовувати, оскільки HTTP закриє сокет після завантаження веб-сторінки.

Звичайно, сказати, що HTTP закриє сокет на ресурс, це надто спрощує речі, оскільки HTTP має такі функції, як конвеєрне з'єднання та стійкі з'єднання, які можуть завантажувати кілька ресурсів у сокет. Але це лише оптимізація. Після того, як все завантажено, ваш браузер закриє сокет через деякий час.

HTTP спочатку був розроблений як простий протокол для завантаження HTML-файлів. Старі браузери також можуть завантажувати HTML-файли з інших протоколів, таких як Gopher та ftp. Таким чином, не було жодної причини робити HTTP статним, оскільки HTML-файли - це просто прості текстові файли.

Після введення веб-форм і HTML-сторінок можуть надсилати дані назад на веб-сторінки сервера, для яких потрібні сеанси. Таким чином, файли cookie були створені для повторного введення стану в протокол без стану, який передається через стаціонарний рівень передачі, який передається через мережевий рівень без стану. Таким чином, повні шари додатків:

  • Ethernet, Wifi тощо = без громадянства
  • IP = без громадянства
  • TCP = видатний
  • HTTP = стан без громадянства
  • HTTP + файли cookie = великі

У наші дні у нас є веб-розетки, які можуть зберігати один відкритий сокет від вашої веб-сторінки до сервера. Отже, за допомогою веб-сокетів ви можете знову використовувати сокети для ідентифікації користувача, оскільки сам веб-сокет є стаціонарним. Але в більшості випадків вам все одно знадобиться cookie для головної сторінки html, що завантажує javascript, що запускає websocket.


4
"HTTP-сервери, що працюють на сучасних веб-сайтах, можуть обробити набагато більше користувачів, ніж сервери на базі сокет, як SSH або ftp" [потрібна цитата]
— el.pescado

6
@ el.pescado: Це просто логічно. Оскільки сервери на основі сокетів підтримують пряме з'єднання, тому сервери на основі сокетів обмежені максимальною кількістю дескрипторів файлів, які ви можете відкрити (а на деяких ОС-розетках конкурують з жорстким диском для дескрипторів файлів). Якщо вам не потрібно підтримувати зв’язок живим, то ваш ліміт - це просто пропускна здатність. Зауважте, що обмеження пропускної здатності - це та сама погода, якщо ви постійно підтримуєте з'єднання. Сучасні сервери HTTP можуть обробляти мільйони запитів в секунду. Якщо їм потрібно буде зберегти ці мільйони розеток, поки ви читаєте веб-сторінку, сервер загине
— slebetman

6
+1 для "Таким чином, файли cookie були створені для повторного введення стану до протоколу без стану, який передається через стабільний рівень передачі, який передається через мережевий рівень без стану". Це прекрасно
— Відновіть Моніку - dirkk

Мені сподобалась ця відповідь. Це вирізає право до основи проблеми.
— Jim W

@slebetman HTTP - сервери є сокет на основі. Усі вони є. За визначенням. І файли cookie не роблять HTTP-серверів гідними. Насправді за визначенням їх немає, саме тому файли cookie кожен раз передаються клієнтом.
— Майлз Рут
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.