web-dev-qa-db-ja.com

Webアプリのユーザー数を制限しますか?

従来のクライアントサーバーソフトウェアを(PHPを使用して)Webベースのバージョンに変換する方法を検討するように求められました。
管理からの最初の質問の1つは、同時実行ユーザーの数をどのように制限するかでした。現在、すべてのクライアントがアプリの実行時に接続するライセンスマネージャーによって処理されます。

私のイニシャルの考え:

  • サーバーで開いているセッションの数を確認します(ログインしている有効なユーザーのみ)。
  • 各ログイン/ログアウトをDBテーブルに記録し、それらをカウントします。

Webアプリにログインできる同時ユーザーの数を制限する標準/ベストプラクティスの方法はありますか?

6
SteB

これには非常に非常に注意してください。アイドルセッションタイムアウトがあり、それが何であるかを確認してください。それを文書化します。構成可能も素晴らしいでしょう。

これがWeb上で危険である理由は、セッションのライフサイクルが見かけほど単純ではないためです。人々はハッピーパスに基づいてセッションを評価する傾向があります。ユーザーがログインしてからログアウトします。

しかし、考慮すべきいくつかの事柄:

  1. セッションはいつ始まりますか?ログイン時にセッションが開始されません。最初のHTTPリクエストから始まります。最初にアクセスしたページがログインの場合でも、100人のユーザーがサイトにアクセスしたが、ログインせずにそのままにしておくとどうなりますか?本質的に「失われた」100個のセッションがあります。
  2. ユーザーがログアウトせず、単にブラウザを閉じるとどうなりますか?
  3. ユーザーは2つの異なるHTTPセッションから同じユーザーアカウントにログインできますか?そうでない場合、既存のセッションがアクティブでなくなったらどうなるでしょうか。ユーザーがログインしてブラウザを閉じ、ブラウザを再度起動した場合、Webサーバーでの以前のセッションが「タイムアウト」するまでログインできません。

私はこれらの懸念のいくつかが処理されるのを見ました。できます。しかし、それは複雑なので、警告されます。

データベースアプローチでログインとログアウトのカウントを選択しても、同じ問題がいくつか発生します。ユーザーがログアウトせず、セッションがタイムアウトした場合はどうなりますか?これはJava EEでSessionBindingListenerを定義することで解決されたので、セッションがタイムアウトしたときにデータベースにアクセスしてログインを無効にできます。 PHPが同じことを実行できるかどうかはわかりません。 PHPコードはHTTPリクエストが着信したときにのみ呼び出されるため、実行できるとは思えません。しかし、私はPHPの専門家ではありません。

12
Brandon

これを実装する方法は、セッションの開始時ではなく、ユーザーが最初にアプリケーションにログインしたときです。

私が採用するアプローチは、認証された各ユーザーのHTTPリクエストで更新されるスライディングトークンです。

CRONジョブを作成するか、各リクエストでスクリプトを呼び出して、期限切れのトークンをデータベースからすばやく削除できます。

これにより、接続する一意のユーザーごとにセッションが開始されるので、セッションとは別にログインを操作できます。また、ユーザーに基づいてトークンを操作し、各ユーザーに複数のログインを許可することもできます。もちろん、これは必須ではないかもしれませんが、少なくとも同じユーザーが2台のWebブラウザーで1台のマシンにログインすると、1つのライセンスとしてカウントされます。

これを企業内に展開する場合は、コードの難読化を調べて改ざん/表示を防止することもできます。

1
Sam