8

関連するいくつかの Web アプリのクライアントが独自の認証状態を保持するようにします。これにより、クラスタ ノード間のセッション レプリケーションが不要になるため、スケーラビリティが向上します。また、Java サーブレットや PHP などのさまざまなサーバー テクノロジの統合が容易になります。

私の計画は次のとおりです。

  1. クライアント認証後に、ユーザー名とセッション有効期限を使用して、署名および暗号化された Cookie を設定します。
  2. クライアントがリクエストを送信すると、サーバーは Cookie を復号化して検証し、Cookie の値に応じてアクセスを許可または拒否します。
  3. セッションの有効期限は、Cookie をリセットすることで更新されます。

セッションを使用するすべてのサーバーは、Cookie メカニズムと復号化キーを知っているだけで済みます。関連項目:クライアント層のセッション状態

このアプローチは大丈夫ですか?アプリケーションに対して透過的になるように、サーブレットコンテナ/アプリケーションサーバーに統合することは可能でしょうか? たとえば、サーブレットは HttpServletRequest#getRemoteUser() を使用できる必要があります。これは可能ですか?それとも、Spring Security のようなコンテナー レベルより上のものが必要でしょうか? クライアント側のセッション管理用の既存のライブラリはありますか?

4

6 に答える 6

8

良い考えではありません。セッションの有効期限やユーザー名などの重要なデータを完全にクライアント側に保存することは、暗号化されているかどうかに関係なく、IMO としては危険すぎます。概念自体が技術的に安全であっても (私は暗号化の専門家ではないため、詳しくはお答えできません)、暗号化キーを取得するだけで、サーバーを危険にさらすことなく侵入を容易にすることができます。

キーを手に入れた誰かが自由にセッション Cookie を生成し、任意のユーザーになりすますことができます。これは、従来のセッションの概念が防止するように設計されています。

この問題には、より優れたスケーラブルなソリューションがあります。たとえば、関連するすべてのサーバーとサービスがポーリングできる中央セッション検証インスタンスをセットアップしてみませんか? Web を見回してください。お客様のニーズに対応する既製のソリューションがあると 100% 確信しています。

于 2010-01-25T10:29:03.517 に答える
3

これにより、クラスタ ノード間のセッション レプリケーションが不要になるため、スケーラビリティが向上します。

まず、HTTP セッションを使用しても、HTTP セッション状態レプリケーションを使用している場合でも、実際にはスケーリングが妨げられません (ちなみに、一部のメカニズムは他のメカニズムよりもスマートです。たとえば、WebLogic のメモリ内レプリケーションには大きなオーバーヘッドがありません)。第二に、本当に必要ですか?ほとんどのアプリケーション (大部分) は、セッションのレプリケーションを必要としません。第三に、私は正しく理解していますか? HTTP セッションをまったく使用しない予定ですか?

(...) クライアント認証後に、ユーザー名とセッション有効期限を使用して、署名および暗号化された Cookie を設定します。

これをしないでください!サーバーが使用するユーザー名やその他の重要なデータを Cookie に保存しないでください。これは非常に悪い考えです。誰かがあなたのシステムがどのように機能するかを理解し、それを破壊するのは時間の問題であることを実際に認める必要があります (特にあなたの Cookie がクリブ攻撃の候補である場合)。つまり、実際には、サーバー側のセッションにデータを保存し、Cookie に ID のみを保存する必要があります。実際に機能しているように。これははるかに安全です。

このアプローチは大丈夫ですか?

いいえ。また、相互運用可能なシングル サインオンには必要ありません(これを構築しようとしている場合)。さまざまなテクノロジのライブラリを備えたCAS Jasigなどの集中認証ソリューションを使用するだけです。

于 2010-01-25T11:31:07.520 に答える
1

状態サーバー (クラスター内のすべてのノードによって既知であり、すべてのユーザーのセッション データを維持するサーバー) を使用することにより、クラスター環境でのデータの重複を回避できます。ユーザーがリクエストを実行するたびに、セッション ID を含む Cookie がアプリケーション サーバーに送信されます。これは、状態サーバーからセッションを取得する必要があります。これは asp.net 開発では可能ですが、Java がこのアプローチをどれほど簡単にサポートするかはわかりません。

于 2010-01-25T10:56:17.013 に答える
1

これは実際にはセッションの実装方法ではありません。Cookie 自体は、セッション自体のデータを保持する必要はありません。これは単なる参照です。

Cookie が保持するのは通常Session ID、サーバー上のデータにリンクされる です。

他のサーバーがアクセスするための中央データ セッション サーバーがない場合は、取得することをお勧めします :)。

于 2010-01-25T10:32:04.527 に答える
0

ペッカが言ったように、良い考えではありません。機密セッション データを使用して Cookie を傍受することができます。SSL を使用していても、fiddler2 を使用することでトラフィックを復号化できます

于 2010-01-25T16:06:57.187 に答える