1. ホーム
  2. rest

[解決済み] RESTアプリケーションはステートレスであることが前提である場合、セッションはどのように管理するのですか?

2022-03-16 14:13:56

質問

ちょっと教えてほしいことがあるんです。RESTとRESTfulアプリケーションの構築について読んでいます。wikipediaによると、RESTそのものは次のように定義されています。 表現型状態遷移 . したがって、私はこのステートレスな ごちゃごちゃ というようなことを、みんなが言い続けている。

wikipediaより。

<ブロッククオート

クライアントは、ある特定の時点で、以下のいずれかの状態に移行することができます。 アプリケーションの状態、または静止状態です。静止状態のクライアントは、以下のことが可能です。 ユーザーと対話することはできますが、負荷は発生せず、クライアントごとの サーバ群やネットワーク上のストレージに保存される。

セッション/アプリケーションレベルのデータストアを使うなということなのでしょうか?

例えば、ページングリクエストを投稿の中に隠す代わりに、リクエストのページ番号をGET URIの一部にすることです。 私には理にかなっていると思います。しかし、それはただ単に言い過ぎただけのような気がします。 クライアントごとのデータなし (セッションデータ)をサーバーサイドに保存してはいけません。

メッセージのキューがあり、ユーザーがメッセージを読みたいと思ったとき、それを読みながら、セッションの間、特定の送信者のメッセージをブロックしたいとしたらどうでしょうか。これをサーバ側に保存して、ユーザがブロックしていないメッセージ(またはメッセージID)だけをサーバが送信するようにするのは理にかなっていると思いませんか?

新しいメッセージリストを要求するたびに、ブロックするメッセージ送信者の全リストを送信しなければならないのでしょうか?私に関係するメッセージリストは、そもそも一般に利用可能なリソースでもないでしょうし、そうあるべきでもないでしょう...。

もう一度言いますが、これを理解しようとしただけです。誰か お願い を明確にする。


更新しました。

スタックオーバーフローの質問で、なかなかたどり着けない答えがあるのを発見しました。 RESTで状態を管理する方法 これによると、重要なのはクライアントの状態である が必要です。 はすべてリクエストごとに転送される......。うぐぐ...オーバーヘッドが多いような...。これで良いのでしょうか?

解決方法は?

根本的な説明をします。

<ブロッククオート

サーバーにクライアントセッションの状態がない。

ステートレスというのは サーバー に関するいかなる状態も保存しません。 クライアントセッション をサーバ側で実行します。

クライアントセッション はクライアントに保存されます。サーバーがステートレスであることは、すべてのサーバーがいつでもどのクライアントにもサービスを提供できることを意味します。 セッションアフィニティ または スティッキーセッション . 関連するセッション情報は、クライアントに保存され、必要に応じてサーバーに渡されます。

これは、ウェブサーバーが通信する他のサービスが、ショッピングカートのようなビジネスオブジェクトに関する状態を維持することを妨げるものではありません。

その クライアントの アプリケーションの状態は、決してサーバーに保存されるべきではありません。 クライアント を、それを必要とするすべての場所に送信します。

そこで ST REST から来る。 状態遷移 . サーバーに状態を保存させるのではなく、状態を転送するのです。 これが、数百万人の同時ユーザーにスケールアップする唯一の方法です。 何百万ものセッションは、何百万ものセッションだからです。

セッション管理の負荷はすべてのクライアントで償却され、クライアントはセッションの状態を保存し、サーバーは何桁も多くのクライアントにステートレスでサービスを提供することができるのです。

と思うようなサービスでも だけ 数万人規模の同時接続ユーザーを必要とする場合でも、サービスをステートレス化する必要があります。数万人というのは、やはり数万人であり、それに伴う時間的、空間的コストが発生します。

ステートレスは、HTTPプロトコルとWeb全般が動作するように設計されており、全体的にシンプルな実装です。また、多くのセッション状態を維持するためのサーバー側ロジックの代わりに、単一のコードパスを持っています。

非常に基本的な実装の原則があります。

これらは実装ではなく原則であり、これらの原則をどのように満たすかは様々です。

要約すると 五大原則 となります。

  1. すべての「モノ」にIDを付与する
  2. モノとモノをつなげる
  3. 標準的なメソッドを使用する
  4. 複数の表現を持つリソース
  5. ステートレスで通信する

RESTには、認証や認可に関するものはありません。 ディセンション .

なぜなら、RESTfulなリクエストとそうでないリクエストを認証することに何の違いもないからです。認証はRESTfulの議論とは無関係です。

特定の要件に応じたステートレス・アプリケーションを作成する方法を説明する、は 広すぎる StackOverflowのために。

RESTに関連する認証と認可の実装はさらにそうです 広すぎる と、様々な実装のアプローチがインターネット上で一般に詳しく説明されています。

これに関するヘルプ/情報を求めるコメントには、次のようなフラグを付けるだけでよいでしょう。 不要になったもの .