web-dev-qa-db-ja.com

ステートレスサーバーはどのように機能しますか?

私はこれを理解しようとします。通常、ユーザーがシステムにログインするたびに、サーバー側がセッションを作成し、ユーザークライアント側はCookieを作成します。ステートレスサーバーサイド、ステートフルクライアントサイドについて人々が話すとき、それらはどういう意味ですか?サーバー側はセッションキープユーザーを使用する必要はありませんか?ユーザーをチェックするためにクライアント側でのみCookieを使用しますか?サーバーを変更しても、ユーザーはそれに気付かず、サービスの使用を再開できますか?

これを行うためにspring-securityを構成する方法は?

29
cometta

サーバー間でユーザーを追跡することは、真のステートレスサーバー側にとっては注意が必要です。ほとんどの場合、ログインが例外であるようなステートレスサーバーです。ただし、ステートレスサーバーの大きな問題は、クラスタリングが非常に簡単になるため、水平方向に拡張できることです。

Javaでは、Cookieを使用して認証情報を保存するか、分散ハッシュを使用してステートレスにすることができます。一般に、人々はmemcacheのようなものの使用を受け入れ、状態はWebサーバーの外部に保存されるため、ステートレスであると言います。これにより、ユーザーはファーム内の任意のWebサーバーを使用しながら、安全に認証されます。 Javaには、Springで使用できる分散ハッシュ実装がたくさんあるので、これを行うためにmemcacheを使用する必要はありません。

もう1つのオプションは、Cookieを使用して、HMACと呼ばれる暗号化された安全なハッシュチケットを保存することです。 Cookieを使用すると、セッションの使用が回避されるため、Webサーバーはステートレスになります。 HMACを使用すると、サードパーティが偽造または作成することはできず、自分から発信されたことが保証されているデータのブロックに署名できます。これにより、ユーザーを認証するために外部サーバーリソース(キャッシュ)が不要になるため、拡張性が向上しますが、セキュリティ上の懸念事項に注意する必要があります。参考までに、Googleはこの手法を使用して水平方向にスケーリングします。 1つのHMACは、SHA1や他の暗号化ハッシュとは異なります。それらには、ファーム内の各サーバーに存在する必要がある秘密鍵が必要です。また、誰かがファイルを入手した場合にサーバーに安全に保存されるように、対称暗号化キーで保護する必要があります。また、HMAC情報は平文で保存されるため、ユーザー名または電子メールをCookieに入れることができますが、実際の暗号化ハッシュは誰でも利用できます。誰かがそのCookieを入手した場合、そのユーザーになりすますことができます。そのため、HMACは通常、特定の期間のみ有効です。その後、有効期限が切れるため、誰かがそれらを入手した場合、そのアカウントに永久にアクセスすることはできません。

したがって、HMACにはこの弱点があり、どのアプリケーションで使用するかについて注意する必要があります。Paypalがこのスキームを使用するのは本当に悪い考えです。私がしなければならないのは、安全なCookieを取得してからすべての資金を私に転送することだけだからです。大きな利点は、アプリが本当にステートレスであることです。

最後のオプションは、Javaセッションを分散ハッシュに格納することです。 PHPおよびその他のプラットフォームは、セッションをデータベース、poor mans分散キャッシュにダンプするか、memcacheにダンプします。 Javaを使用すると、同じことができます。セッションオブジェクトを分散キャッシュに入れることもできます。このオプションは、「クールになり、セッションに好きなものをダンプできるようになり、ステートレスになる」と人々が考えるため、支持されなくなりました。ただし、すべての分散キャッシュと同様に、転送速度、レプリケーション時間、およびペイロードサイズに制限があります。これは、JavaまたはMemcacheに当てはまります。セッションを小さくしてください。これはうまく機能します。すべてをセッションに投入すると、単一のサーバーで発生するスケーリングの問題にすぐに戻ります。そして実際には、グリッドコンピューティングが単一のサーバーよりも悪い場合があるため、サーバーをステートフルにした場合よりもおそらく悪いでしょう。

更新:これを行うために使用できるJava分散キャッシュライブラリのリストは次のとおりです。

http://www.manageability.org/blog/stuff/distributed-cache-Java

37
chubbsondubs

ステートレスサービスは、アプリケーションサーバーにデータを保存しないサービスです。データベースに対してデータの読み取りまたは書き込みを行い、値を返す(または返さない)と、その後、タスク自体に関する情報はすべて忘れられます。

ステートフルサービスは、トランザクションを実行するために使用されます。これは、先行するタスクの結果に依存する一連のタスクです。最も簡単な例は、ショッピングカートに商品を集めるウェブストアで注文を送信することです。チェックアウト時に、アカウントデータを1ページに入力して保存し、請求先住所を入力して保存してから、ご注文を確認し、取引を完了してください。各ステップは前のステップの成功した結果に依存し、これらのステップの最後の1つが完了するか、トランザクションがキャンセルされるまでデータを保持する必要があります。その場合、アカウントの残高を元の状態に戻すためにロールバックが必要です。チェックアウトする前でした。

ほとんどの場合、トランザクションは両方の方法で実装できますが、ステートレスサービスを使用する場合は、クライアントアプリケーションがタスクの適切な順序と完了を処理するか、他の方法でタスクを保存する必要があります。トランザクション情報を正しく処理し、ロールバックを管理します。あなたがそれを呼んだように、それはステートフルクライアント側になります。

ただし、これはすべて非常に一般的であり、セキュリティやセッションの処理は、これらの各ケースで考慮する必要があります。セッション情報を使用してステートレスサービス呼び出しを認証することができます。たとえば、セッションID、ユーザーID、またはその他のセキュリティトークンをビジネスデータに添付することにより、各呼び出しを個別に認証する必要があります。

17
weltraumpirat