質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.51%

ステートフル及びステートレスに向いているサービスとは

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 174

score 39

ステートレス、及びステートフルについて調べていたのですが、少々疑問があり質問させて貰いました。
こちらの記事では、ステートレス及びステートフルのメリット、デメリットについて以下のように記載されていました

**ステートフル**
ステートフルなやり取りではサーバーはクライアントのセッション状態を保持している。

メリット
・やり取りが完結に済む
・それによりネットワークの帯域を節約できる

デメリット
・クライアントの状態を都度把握しておかなければいけないのでクライアントが増えると負荷も増える
・サーバーを複数台設置する場合にはそれぞれのサーバー間でクライアントの状態を同期しなければいけない
・これらの理由によりスケールアウトには向かない


**ステートレス**
ステートレスなやり取りではサーバーはクライアントのセッション情報を保持しない。

メリット
・クライアントのリクエストは状態に依存せず、常にリソースに対する操作に必要十分な情報となる
・よってサーバーが増えてもそのままのリクエストでいつも同じリソースに対する操作ができる
・このためスケールアウトに向いている
・また処理がクライアントの状態に依らないので処理がシンプルになる

デメリット
・やり取りが冗長になりがちである
・リソースへの操作が必要になる度にそのやり取りを繰り返す必要がある
・これによりネットワークの帯域を消費し、処理も遅くなる
・サーバーが状態を保持していないのでエラーが起きたときのハンドリングが複雑になりがちである


これらの情報を踏まえ何点かお聞きしたいことがあります。
仮に、認証機能を必要とする会員サイトでは、リクエストを送信する度に認証情報を付加しなければならない為、スケールアウトを必要としない小規模のサイトでは採用するメリットはあまりないのでしょうか?
また、逆にTwitterなどの大規模サービスでは、スケールアウトが必須かと思いますが、基本的にRESTfulAPIでのステートレスな手法を採用するのが、当然との認識であっていますでしょうか...?

どなたか、こちら2点の疑問点につきまして、ご助言の程頂けましたら幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2021/10/15 10:00

    質問者さん、その後無言ですか、追加の質問に回答したのでそれに対するフィードバックを書きましょう。解決したならクローズしてください。役に立たなかったならどこがダメだったか書くと望む回答により近いものが出てくるかも。とにかく無言で放置は NG です。

    キャンセル

  • jjj001

    2021/10/15 10:15

    ちょっと仕事で返せなかったです。今、返信します!

    キャンセル

  • SurferOnWww

    2021/10/15 16:04

    解決したならクローズしてください。

    キャンセル

回答 1

checkベストアンサー

+2

こちらの記事では、ステートレス及びステートフルのメリット、デメリットについて以下のように記載されていました

質問者さんが参考にした「こちらの記事」ではセッションのことしか述べてませんが、セッションはステートレスである Web アプリのステートを保つ一つの方法というだけで、他にもいろいろ手段はあります。

なので、「ステートフル」=「セッション利用」ということではないです。

ステートを保つには、もともと HTTP 通信になら普通に利用できるクッキー、クエリ文字列、隠しフィールドなどの他に、アプリのフレームワークに備わった機能もあります。

例えば ASP.NET Core では以下の記事のような方法が使えます。

ASP.NET Core でのセッションと状態の管理
https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/app-state?view=aspnetcore-5.0

質問者さんの言うセッションはフレームワークに備わった機能で、必要に応じてサーバー側でユーザー固有の情報を保持しておき、クライアントにはユーザー固有のセッションクッキーを発行し、次回ユーザーがアクセスしてきた時送信されてくるクッキーを使ってユーザーを識別して、サーバーにあるセッション情報を取得して利用するというものです。(フレームワークによって多少実装は異なるかもしれません)

それから、ユーザー認証にセッションは使わないフレームワークもあります。ASP.NET がそうです。独自にセッションを使う認証方式を実装することはできますが、普通はセッションは使いません。

上記のこと、特に「ステートフル」≠「セッション利用」、必ずしもセッションをユーザー認証に使うわけではない・・・ということ踏まえてもらったうえで・・・

仮に、認証機能を必要とする会員サイトでは、リクエストを送信する度に認証情報を付加しなければならない為、スケールアウトを必要としない小規模のサイトでは採用するメリットはあまりないのでしょうか? また、逆にTwitterなどの大規模サービスでは、スケールアウトが必須かと思いますが、基本的にRESTfulAPIでのステートレスな手法を採用するのが、当然との認識であっていますでしょうか...?

質問者さんの言う「スケールアウト」=「システムを構成するサーバーの台数を増やすことで、システムの処理能力を高める」ということですよね?

であれば、それとセッション利用は関係ないと思います。セッションを使う場合「リクエストを送信する度に認証情報」はセッションクッキーなので、サーバー側が小規模・大規模とは関係ないはずです。(Web ファームでセッション情報をどこに保持するかという話もあるかもしれませんが、それはまた別な話)

「大規模サービス」=「RESTfulAPI」=「ステートレス」というのは何かの思い違いです。

「大規模サービス」でもユーザー認証は必要でしょうから、ユーザー認証にセッションを使っていれば「RESTfulAPIでのステートレスな手法を採用するのが、当然」ということはないです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/10/15 10:19

    ご返信ありがとうございます。
    返信遅くなって申し訳ないです!
    認証の部分に関しまして、セッションを使用したケースの方がスケールアウトしづらいが、処理が早い、REST APIを使用した方が、データを多くサーバー側へ送る為、処理が遅いといった勘違いがあったのですが、2つのケースに関していうと、あまり変わらないということですね。
    詳細に教えて頂き、助かりました。
    ありがとうございました。

    キャンセル

  • 2021/10/15 11:33

    認証、セッション、RESTful、ステートフル/ステートレス、認証クッキー、ベアラトークン、スケールアウト等々が具体的にどういうことか整理できてないままゴッチャに考えているような気がするのですが。

    認証は、よくある Web サイト(ここ Teratail も)ではクッキーベースが多いですが、Web API (RESTful 含む)ではセキュリティ上ベアラトークンベースにすることが多いようです。

    クッキーベースの認証にはセッションを使うことがあるようですが、トークンベースでセッションを使うことはないはずです。

    そのあたりが整理できてないからいろいろ誤解しているような気がするのですが・・・

    キャンセル

  • 2021/10/15 23:50 編集

    ありがとうございます!
    トークン認証が採用されているサイトってあまりないのですかね...?
    クッキーベースは確かに多い気がします。
    今、トークンについて調べているのですが、少々複雑ですね...
    ここら辺は、ある程度理解できるまでは調べる必要がありそうですね...

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る