「RESTful APIを作っている」と言えるエンジニアは多いが、「なぜRESTはステートレスでなければならないか」を根拠を持って説明できる人は少ない。
RESTは単なるAPI設計の流行ではなく、Webが爆発的に普及した理由に直結した設計思想だ。その背景を理解すると、日常のAPI設計の判断が変わる。
Webが普及した本当の理由
Webは1991年に誕生してから30年で17億人のユーザと2億台のサーバを抱える巨大システムになった。これほどのスケールを実現できた理由は、アーキテクチャの設計にある。
Webが登場する前にも、インターネットとハイパーメディアと分散システムはそれぞれ存在していた。しかし、それらは互いに統合されていなかった。
Web以前の分散システムの問題
RPC(Remote Procedure Call)
└── ほかのコンピュータの機能をローカルの関数のように呼び出す
→ 問題: ネットワークの不安定性・プラットフォーム依存・密結合
CORBA・DCOM
└── 分散オブジェクトへの進化
→ 問題: 複雑な仕様・ベンダーロックイン・スケールの難しさ
これらの技術はシステムの規模が小さいうちは動いたが、インターネット規模になると破綻した。
Webはこの問題をどう解いたか
Webは3つの技術を組み合わせて解決した。
- HTTP — シンプルで統一されたプロトコル
- URI — すべてのリソースに一意のアドレスを付与
- HTML(ハイパーメディア) — リンクでリソース同士をつなぐ
この組み合わせが「ステートレスで、キャッシュ可能で、統一インターフェースを持つ」Webを実現した。
RESTの誕生
REST(Representational State Transfer)は2000年、Roy Fieldingの博士論文で提唱されたアーキテクチャスタイルだ。
Fieldingは「なぜWebはこれほどスケールするのか」を分析し、Webの設計原則を体系化した。それがRESTだ。
RESTを構成する6つの制約
REST = ULCODC$SS
├── Uniform Interface(統一インターフェース)
├── Layered System(階層化システム)
├── Client/Server(クライアント/サーバ分離)
├── On-Demand Code(コードオンデマンド) ※省略可能
├── Stateless(ステートレスサーバ)
└── Cache(キャッシュ)
ステートレスが重要な理由
サーバがクライアントの状態(セッション)を保持しないことで:
- スケールが容易になる → どのサーバにリクエストを振っても同じ結果になる
- 可用性が上がる → サーバ障害時に別サーバへの切り替えが簡単
- 可視性が上がる → リクエスト1つで処理の内容が完結している
セッションをサーバに持つと、ユーザが「どのサーバに接続しているか」を固定しなければならない(スティッキーセッション)。これがスケールの障壁になる。
統一インターフェースが重要な理由
HTTPのGET・POST・PUT・DELETE・PATCHという少数のメソッドで、あらゆるリソース操作を表現する。
これにより:
- クライアントはどのサーバとも同じ方法で通信できる
- APIの仕様を学習するコストが下がる
- 中間コンポーネント(プロキシ・キャッシュ)がHTTPを理解できる
SOAP対RESTの戦い——なぜSOAPは負けたか
2000年代前半、WebサービスはSOAP(Simple Object Access Protocol)とRESTの2派に分かれていた。
SOAPとは
XMLを使ってRPCスタイルのリモート呼び出しを行うプロトコル。
<!-- SOAPリクエストの例 -->
<soap:Envelope>
<soap:Body>
<getUserById>
<id>123</id>
</getUserById>
</soap:Body>
</soap:Envelope>
「何でもPOSTでXMLを送る」スタイルで、HTTPをトランスポート層としてしか使っていない。GETもPUTもなく、すべてのリクエストが同じエンドポイントへのPOSTになる。
SOAPが敗れた理由
| 観点 | SOAP | REST |
|---|---|---|
| シンプルさ | 複雑(WSDL・WS-*の仕様が膨大) | シンプル(HTTPをそのまま使う) |
| キャッシュ | 不可能(すべてPOSTなのでキャッシュできない) | GETはキャッシュ可能 |
| 学習コスト | 高い | 低い(HTTPを知っていれば使える) |
| ブラウザ対応 | 難しい | 簡単 |
SOAPはHTTPの上にRPCの層を乗せることで、HTTPが持つキャッシュ・ステートレス・統一インターフェースという利点をすべて殺してしまった。Webのアーキテクチャに逆らった設計だったため、スケールしなかった。
RESTの誤解——「URIにCRUDを入れるな」は正しいか
「RESTful」を誤解しているコードをよく見る。
# ❌ RPCスタイル(URIに動詞を入れる)
POST /getUser
POST /createUser
POST /deleteUser
# ❌ 非REST(すべてのリソースをPOSTで操作)
POST /users/action?type=delete&id=123
# ✅ REST(HTTPメソッドで操作を表現)
GET /users/123 # 取得
POST /users # 作成
PUT /users/123 # 更新(全体)
PATCH /users/123 # 更新(一部)
DELETE /users/123 # 削除
「RESTとは何か」ではなく「HTTPメソッドをどう使うか」の問題として理解すると、設計の迷いが減る。
現場への応用
この歴史的背景を理解してから、設計判断が変わった点が2つある。
1. 「なぜPOSTではなくPUTを使うか」を説明できるようになった
「PUTはべき等(同じリクエストを何度送っても結果が同じ)だから、リトライが安全」という根拠で説明できる。冪等性の重要性はWebの設計思想に根ざしている。
2. ステートレス設計を意識するようになった
セッションに依存したAPIを作ると、水平スケールが難しくなる。認証状態はJWTトークンとしてクライアントに持たせ、サーバはステートレスに保つ設計を選ぶようになった。
まとめ
RESTはWebのアーキテクチャの分析から生まれた設計思想だ。ステートレス・統一インターフェース・キャッシュの制約は、Webがインターネット規模でスケールするために必要なものとして導き出された。
「なぜそう設計するか」の根拠を持つことで、チーム内の設計議論が変わる。
詳細はWebを支える技術で体系的に学べる。