🤔

(解説)ステートレスとステートフルについて

に公開

こんにちは!わたなべです!
今回はWebアプリケーション開発には欠かせないステートレスとステートフルについて解説します。

はじめに

Webアプリケーションを開発する際、必ず考えるべき重要な概念があります。それが「状態 (State)」です。

例えば、Webサイトにログインすると自分の名前が表示され続けたり、ショッピングカートの商品が保存され続けたりします。このように、ユーザーの操作や情報が継続して保持される仕組みを「状態」と呼びます。

ここでは、「ステートレス(状態を保持しない)」と「ステートフル(状態を保持する)」という二つの基本的な概念を学びましょう。

ステートレスとステートフルの違い

ステートレスとは?

ステートレスとは、サーバーがクライアントの状態を記憶しない仕組みのことです。サーバーはリクエストごとに必要な情報を毎回クライアントから受け取り、その情報だけで処理を行います。

特徴:

  • サーバーはリクエストごとに独立して処理を行う。
  • クライアントはリクエストごとにすべての必要な情報を送信する必要がある。
  • シンプルでスケールしやすい。

ステートレス

ステートフルとは?

ステートフルとは、サーバーがクライアントの状態を記憶し、それを活用して処理を行う仕組みのことです。例えばログイン情報やショッピングカートの中身をサーバー側で管理します。

特徴:

  • サーバーが状態を管理するため、クライアントは最低限の情報だけを送ればよい。
  • クライアント側の処理やデータが軽量になる。
  • 状態管理のための仕組みが必要で、スケーラビリティが難しくなることがある。

ステートフル

状態管理の仕組み

セッション(サーバーで状態を保持)

セッションとは、サーバーがユーザーの状態を管理・保存する仕組みです。ユーザーがログインするとサーバーはセッションIDを発行し、クライアントはそれをCookieなどに保存します。次回以降のリクエストでは、このセッションIDをサーバーに送り、サーバーはそれに基づいてユーザーを識別します。

トークン(クライアントで状態を保持)

トークンとは、ユーザー情報を含むデータをクライアント側で持つ仕組みです。サーバーはリクエストごとにトークンを受け取り、その内容を検証してユーザーを識別します。代表的なトークンにはJWT(JSON Web Token)があります。

状態の置き場所によるメリット・デメリット

方式 メリット デメリット
クライアントに状態を保持(トークン) サーバーがシンプルでスケールしやすい 改ざんリスクがある
サーバーに状態を保持(セッション) クライアントが軽量でセキュア サーバー管理が複雑でスケールが難しい

状態管理方式の選び方

サービスを設計する際に以下のポイントを考えましょう。

  1. シンプルさとスケーラビリティを優先したいか? → ステートレス(トークン方式)
  2. クライアントの処理を軽くし、複雑な操作をサーバー側で管理したいか? → ステートフル(セッション方式)
筆者の意見

筆者の意見では、最近の流行りは RESTful API を利用したステートレスな設計で、PaaSを利用したマイクロサービス化に伴いスケーラブルな設計が多くなってきていると思います。

一方で、クライアント・サーバー間の双方向で通信を行うなど複雑な操作を行う場合はステートフルにする必要があるので、必要に応じてステートフルを取り入れるような設計が良いかと思います。

まとめ & チェックリスト

  • 状態とは「ユーザーや操作内容を保持・管理する情報」のこと。
  • ステートレスは「サーバーが状態を覚えない仕組み」。
  • ステートフルは「サーバーが状態を覚える仕組み」。
  • 状態の管理方法には、セッション(サーバー)とトークン(クライアント)がある。
  • 状態の置き場所は、サービスの要件に応じて適切に選択する。

これらの基本を押さえて、セキュアなWebアプリケーションを開発していきましょう!

Discussion