質問: ステートレス、及びステートフルについて調べていたのですが、少々疑問があり質問させて貰いました。 こちらの記事では、ステートレス及びステートフルのメリット、デメリットについて以下のように記載されていました ``` **ステートフル** ステートフルなやり取りではサーバーはクライアントのセッション状態を保持している。 メリット ・やり取りが完結に済む ・それによりネットワークの帯域を節約できる デメリット ・クライアントの状態を都度把握しておかなければいけないのでクライアントが増えると負荷も増える ・サーバーを複数台設置する場合にはそれぞれのサーバー間でクライアントの状態を同期しなければいけない ・これらの理由によりスケールアウトには向かない **ステートレス** ステートレスなやり取りではサーバーはクライアントのセッション情報を保持しない。 メリット ・クライアントのリクエストは状態に依存せず、常にリソースに対する操作に必要十分な情報となる ・よってサーバーが増えてもそのままのリクエストでいつも同じリソースに対する操作ができる ・このためスケールアウトに向いている ・また処理がクライアントの状態に依らないので処理がシンプルになる デメリット ・やり取りが冗長になりがちである ・リソースへの操作が必要になる度にそのやり取りを繰り返す必要がある ・これによりネットワークの帯域を消費し、処理も遅くなる ・サーバーが状態を保持していないのでエラーが起きたときのハンドリングが複雑になりがちである ``` これらの情報を踏まえ何点かお聞きしたいことがあります。 仮に、認証機能を必要とする会員サイトでは、リクエストを送信する度に認証情報を付加しなければならない為、スケールアウトを必要としない小規模のサイトでは採用するメリットはあまりないのでしょうか? また、逆にTwitterなどの大規模サービスでは、スケールアウトが必須かと思いますが、基本的にRESTfulAPIでのステートレスな手法を採用するのが、当然との認識であっていますでしょうか...? どなたか、こちら2点の疑問点につきまして、ご助言の程頂けましたら幸いです。
回答: > > こちらの記事では、ステートレス及びステートフルのメリット、デメリットについて以下のように記載されていました > > > 質問者さんが参考にした「こちらの記事」ではセッションのことしか述べてませんが、セッションはステートレスである Web アプリのステートを保つ一つの方法というだけで、他にもいろいろ手段はあります。 なので、「ステートフル」=「セッション利用」ということではないです。 ステートを保つには、もともと HTTP 通信になら普通に利用できるクッキー、クエリ文字列、隠しフィールドなどの他に、アプリのフレームワークに備わった機能もあります。 例えば ASP.NET Core では以下の記事のような方法が使えます。 ASP.NET Core でのセッションと状態の管理 質問者さんの言うセッションはフレームワークに備わった機能で、必要に応じてサーバー側でユーザー固有の情報を保持しておき、クライアントにはユーザー固有のセッションクッキーを発行し、次回ユーザーがアクセスしてきた時送信されてくるクッキーを使ってユーザーを識別して、サーバーにあるセッション情報を取得して利用するというものです。(フレームワークによって多少実装は異なるかもしれません) それから、ユーザー認証にセッションは使わないフレームワークもあります。ASP.NET がそうです。独自にセッションを使う認証方式を実装することはできますが、普通はセッションは使いません。 上記のこと、特に「ステートフル」≠「セッション利用」、必ずしもセッションをユーザー認証に使うわけではない・・・ということ踏まえてもらったうえで・・・ > > 仮に、認証機能を必要とする会員サイトでは、リクエストを送信する度に認証情報を付加しなければならない為、スケールアウトを必要としない小規模のサイトでは採用するメリットはあまりないのでしょうか? また、逆にTwitterなどの大規模サービスでは、スケールアウトが必須かと思いますが、基本的にRESTfulAPIでのステートレスな手法を採用するのが、当然との認識であっていますでしょうか...? > > > 質問者さんの言う「スケールアウト」=「システムを構成するサーバーの台数を増やすことで、システムの処理能力を高める」ということですよね? であれば、それとセッション利用は関係ないと思います。セッションを使う場合「リクエストを送信する度に認証情報」はセッションクッキーなので、サーバー側が小規模・大規模とは関係ないはずです。(Web ファームでセッション情報をどこに保持するかという話もあるかもしれませんが、それはまた別な話) 「大規模サービス」=「RESTfulAPI」=「ステートレス」というのは何かの思い違いです。 「大規模サービス」でもユーザー認証は必要でしょうから、ユーザー認証にセッションを使っていれば「RESTfulAPIでのステートレスな手法を採用するのが、当然」ということはないです。