HTTPセマンティクス徹底解説:モダンWeb開発のためのRFC 9110マスターガイド
2022年、IETFは RFC 9110 を公開しました。これは、RFC 7231などの複数の古い規格を置き換え、HTTPセマンティクス に関する決定版となる文書です。HTTP/2やHTTP/3が登場し、データの転送方法(フレーミング)は進化しましたが、メソッド、ステータスコード、ヘッダーの意味、つまり「セマンティクス」は、今もなおWebの基盤であり続けています。
RFC 9110 (HTTPセマンティクス) とは?
RFC 9110は、ハイパーテキスト転送プロトコル (HTTP) の共通アーキテクチャを定義しています。これはHTTP/1.1、HTTP/2、HTTP/3といったプロトコルバージョンに依存しません。例えば、403 Forbidden の真の意味や、POST と PUT の動作の違いを知りたい場合、RFC 9110こそが信頼できる情報源となります。
以下の要素について、一貫した定義を提供します:
- リソース と URI (Uniform Resource Identifiers)。
- メッセージ(リクエストとレスポンス)。
- メソッド (GET, POST など)。
- ステータスコード (200, 404 など)。
- ヘッダーフィールド。
HTTPセマンティクスの核心原理
1. リクエストメソッドとべき等性 (Idempotency)
RFC 9110における最も重要な概念の一つは、安全 (Safe) なメソッドと べき等 (Idempotent) なメソッドの区別です。
| メソッド | 安全 | べき等 | 説明 |
|---|---|---|---|
| GET | はい | はい | 副作用なしでデータを取得します。 |
| HEAD | はい | はい | GETと同じですが、ボディを返しません。 |
| PUT | いいえ | はい | リソースを置換します。繰り返しても結果は変わりません。 |
| DELETE | いいえ | はい | リソースを削除します。 |
| POST | いいえ | いいえ | データを処理します。複数回のリクエストで複数のリソースが生成される可能性があります。 |
2. ステータスコードの分類
RFC 9110は、ステータスコードを5つのクラスに分類しています:
- 1xx (情報): リクエストを受け取り、処理を継続中。
- 2xx (成功): アクションが正常に受信、理解、受理された。
- 3xx (リダイレクト): リクエスト完了のために追加の操作が必要。
- 4xx (クライアントエラー): リクエストに誤りがあるか、実行できない。
- 5xx (サーバーエラー): サーバーが有効なリクエストの処理に失敗した。
実践的な活用シーン
RESTful API の設計
RFC 9110に従うことで、標準的なHTTPクライアントやキャッシュが期待通りに動作する、自己記述的なAPIを構築できます。例えば、リソース作成成功時に単なる 200 OK ではなく 201 Created を返すといった設計です。
キャッシュの最適化
RFC 9110は、Vary、ETag、Last-Modified ヘッダーの動作を定義しています。これらを正しく実装することで、CDNやブラウザが効率的にデータをキャッシュでき、サーバー負荷を軽減できます。
コンテンツネゴシエーション
クライアントが特定の形式(例:Accept: application/json)を要求し、サーバーが利用可能な最適な表現で応答する仕組みを可能にします。
比較:RFC 7231 vs. RFC 9110
RFC 9110はHTTPの仕組みを根本から変えたわけではありませんが、ドキュメントとしての質が大幅に向上しました:
- 統合: 複数の文書に分散していたセマンティクスが一つにまとまりました。
- 明確化: 認証や Range リクエスト(部分コンテンツ取得)などの曖昧だった点が整理されました。
- 抽象化: 「何を意味するか(セマンティクス)」と「どう運ぶか(HTTP/1.1 vs HTTP/3)」が明確に分離されました。
よくある質問 FAQ
Q: RFC 9110 は HTTP/1.1 専用ですか?
A: いいえ。RFC 9110は、HTTP/2やHTTP/3を含むすべてのHTTPバージョンに共通するセマンティクスを定義しています。
Q: POST と PUT の違いは何ですか?
A: RFC 9110によれば、PUT はべき等であり(特定のURIにあるリソースを置き換える)、POST はべき等ではありません(リソースに対して処理すべきデータを送信する)。
Q: 403 と 401 の使い分けは?
A: 401 Unauthorized は認証が必要で、失敗または未提供の場合に使用します。403 Forbidden はサーバーがリクエストを理解しているが、認可を拒否する場合(有効な資格情報があってもアクセス不可な場合など)に使用します。