Cookieの代わりにソケットを使用して個人を識別できないのはなぜですか?


17

IPアドレスを使用して個々のクライアントを識別することに関して別の質問がありました。IPアドレスが不十分な理由は理解できたと思います。しかし、より多くの情報があり、私が理解していることから、ステートフルなソケットはどうですか?クッキーの代わりに使用される可能性はありませんか?


18
ソケットはステートフルですが、Webページをダウンロードした後、httpは接続を開いたままにしません。Webページ全体がダウンロードされてから約15秒後に閉じます。これが、状態を維持するためにCookieが必要な理由です。
MTilsted17年

41
ソケットはデータの一部ではありません。送信することはできません。あなたの質問は意味がありません。
user207421

8
名詞の代わりに動詞を使用できない理由を尋ねるようなものです
...- Mehrdad

2
@EJP:OPはソケットオブジェクトではなく(source_ip、source_port、target_ip、target_port)の4倍を意味するという仮定の下で回答しました。しかし、あなたの解釈も理にかなっています。
ヨルグWミットタグ

Cookieやセッションなしで状態またはユーザーIDを管理するためのfirebaseの動作を模倣することができます。
-JeffO

回答:


64

ソケットは接続を識別します。Cookieは通常、ユーザーを識別するために使用されます。2つのブラウザタブをSE.SEに開くと、2つの接続、つまり2つのソケットができます。しかし、両方の設定を維持したいです。(実際、通常、ブラウザーはページのロード時間を短縮するために1ページに複数のソケットを開きます。ほとんどのブラウザーには、ページあたり4〜10ソケットのデフォルトの最大値があると思います。)

また、反対のことが起こります。ブラウザタブを閉じると、マシンの別のユーザーがブラウザタブをSE.SEに開いて、(source_ip、source_port、target_ip、target_port)の同じ4倍を取得する場合があります。 、彼は私のすべての設定を取得します。


http2(およびhttpパイプライン)を使用すると、おそらく2つのソケットがSEに開かれないことに注意してください。ブラウザは同じソケットを再利用します。別のブラウザを実行する必要があります。
マシュースティープルズ

3
些細なローカルチェックは、Chrome タブごとに1つのソケットを開いたままにしていることを示します-おそらくそれらはサンドボックス化されており、それらの間で状態を共有したくないためです-しかし、各タブのソケットは永続的であるようで、リクエストはおそらくそのタブ内でパイプライン処理されます。
役に立たない

1
また、バックエンドで何が起こっているのかもわからないことにも注意してください。多くのロードバランサーはユーザー接続を終了し、バックエンドサーバーに対して独自に開きます。つまり、単一のソケットを共有する複数のユーザーがいる可能性があります。
ダン

@Useless IIRC SEは、ここでテストしている場合に備えて、WebSocketまたはロングポーリング(フォールバック)を使用して更新(新しい質問、編集など)を取得します。他のサイトは異なる動作をする可能性があります-静的サイトでソケットを無期限に開いたままにすることはあまり意味がありません。
ボブ

確かに、チェックするために本当に静的なサイトを見つけるのに数回の試みが必要でした。そのため、Chromeはタブごとに複数のソケットをオープンし、まだタブの間にそれらを再利用しませんが、ないタブが完成ロードをいったんクローズして。ただし、TIME_WAITに非常に長い時間がかかるため、簡単に表示されます。
役に立たない

20

TCPソケットはステートフルになるように設計されているため、一般にセッションの識別に使用されます。SSHやftpなどのプロトコルはまさにこれを行います。

HTTPはステートレスになるように設計されており、各接続はダウンロードされるリソースにのみ関連付けられています。リソースがダウンロードされると、HTTP要求が乗るTCPソケットが閉じられます。この最初の理由は単純さでした。しかし、副作用は、最新のWebサイトを実行しているHTTPサーバーが、SSHやftpなどのソケットベースのサーバーよりもはるかに多くのユーザーを処理できることです。

したがって、HTTPはWebページのダウンロード後にソケットを閉じるため、ソケットは使用できません。

もちろん、HTTPにはパイプラインやソケットごとに複数のリソースをダウンロードできる永続的な接続などの機能があるため、HTTPがリソースごとにソケットを閉じると言うのは単純化されます。しかし、それはただの最適化です。すべてがダウンロードされた後、ブラウザはタイムアウト後にソケットを閉じます。

HTTPは元々、HTMLファイルをダウンロードするための単純なプロトコルとして設計されました。古いブラウザは、Gopherやftpなどの他のプロトコルからHTMLファイルをダウンロードすることもできます。HTMLファイルは単なるテキストファイルであるため、HTTPをステートフルにする理由はありませんでした。

Webフォームが導入され、HTMLページがセッションを必要とし始めたサーバーWebページにデータを送り返すことができます。したがって、ステートレスネットワーク層を介して送信されるステートフル転送層を介して送信されるステートレスプロトコルに状態を再導入するために、Cookieが作成されました。したがって、完全なアプリケーション層は次のとおりです。

  • イーサネット、Wifiなど=ステートレス
  • IP =ステートレス
  • TCP =ステートフル
  • HTTP =ステートレス
  • HTTP + Cookie =ステートフル

最近では、Webページからサーバーへの単一のオープンソケットを保持できるwebsocketがあります。したがって、websocket自体はステートフルであるため、websocketでは再びソケットを使用してユーザーを識別することができます。ただし、ほとんどの場合、websocketを開始するJavaScriptをロードするメインHTMLページ用のCookieが必要になります。


4
「最新のWebサイトを実行しているHTTPサーバーは、SSHやftpなどのソケットベースのサーバーよりもはるかに多くのユーザーを処理できます」[要出典]
-el.pescado

6
@ el.pescado:論理的です。ソケットベースのサーバーはライブ接続を維持するため、ソケットベースのサーバーは、開くことができるファイル記述子の最大数に制限されます(一部のOSでは、ソケットはファイル記述子についてハードディスクと競合します)。接続を維持する必要がない場合、制限は帯域幅だけです。帯域幅の制限は、接続を維持するかどうかと同じ天気であることに注意してください。最新のHTTPサーバーは、1秒あたり数百万のリクエストを処理できます。あなたがウェブページを読んでいる間にそれらの数百万のソケットを維持する必要がある場合、サーバーは死ぬでしょう
slebetman

6
「したがって、ステートレスネットワーク層を介して送信されるステートフル転送層を介して送信されるステートレスプロトコルに状態を再導入するために、Cookieが作成されました」。それは美しいです
モニカーを復活-dirkk

この答えが気に入りました。それは問題の核心に直結します。
ジムW

@slebetman HTTPサーバーソケットベースです。それらはすべてです。定義により。また、CookieはHTTPサーバーをステートフルにしません。実際、定義上はそうではないため、Cookieは毎回クライアントによって転送されます。
マイルルーティング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.