この記事の要点
• HTTPはクライアントとサーバー間でデータをやり取りするアプリケーション層プロトコル
• リクエスト/レスポンスはリクエストライン・ヘッダー・ボディの3要素で構成
• HTTPはステートレスな設計のため、前回の通信内容を保持しない
HTTPとは
HTTP(Hypertext Transfer Protocol)は、WebブラウザとWebサーバー間でHTMLや画像、JSONなどのデータを送受信するためのプロトコルです。TCP/IPモデルのアプリケーション層に位置し、通常はポート80(HTTP)または443(HTTPS)を使用します。
プロトコルとは: コンピュータ間の通信ルールのことです。HTTPはWebの標準プロトコルとして、1991年に初めて文書化されました。
HTTPの位置付け
HTTPは以下のレイヤー構造の上位に位置します:
| レイヤー | プロトコル | 役割 |
|---|---|---|
| アプリケーション層 | HTTP / HTTPS | Webコンテンツの送受信 |
| トランスポート層 | TCP | 信頼性のあるデータ転送 |
| インターネット層 | IP | パケットの宛先指定 |
| リンク層 | Ethernet / Wi-Fi | 物理的なデータ転送 |
ポイント: HTTPはTCPの上で動作するため、パケットの順序保証と再送制御が自動的に行われます。
HTTPメッセージの構造
HTTPの通信は、クライアントからのリクエストとサーバーからのレスポンスの2種類のメッセージで構成されます。どちらも以下の3要素を持ちます:
リクエストの構造
GET /api/users/123 HTTP/1.1
Host: api.example.com
User-Agent: Mozilla/5.0
Accept: application/json
Authorization: Bearer eyJhbGc...
| 要素 | 説明 | 例 |
|---|---|---|
| リクエストライン | メソッド・URI・HTTPバージョン | GET /api/users/123 HTTP/1.1 |
| ヘッダー | メタデータ(ホスト名、認証情報など) | Host: api.example.com |
| ボディ | 送信データ(POSTやPUTで使用) | {"name": "John"} |
レスポンスの構造
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 45
Cache-Control: max-age=3600
{"id": 123, "name": "John", "role": "admin"}
| 要素 | 説明 | 例 |
|---|---|---|
| ステータスライン | HTTPバージョン・ステータスコード・説明 | HTTP/1.1 200 OK |
| ヘッダー | メタデータ(Content-Type、キャッシュ設定など) | Content-Type: application/json |
| ボディ | 実際のデータ(HTML、JSON、画像など) | {"id": 123, ...} |
ステートレス性
HTTPはステートレス(状態を持たない)プロトコルです。各リクエストは独立しており、サーバーは前回のリクエスト内容を保持しません。
ステートレスの特徴
メリット:
- サーバーのメモリ負荷が少ない
- スケーラビリティが高い(どのサーバーでも処理可能)
- シンプルな設計
デメリット:
- ログイン状態などを保持できない
- 毎回、認証情報の送信が必要
状態管理の仕組み
ステートレス性を補うため、以下の技術が使われます:
| 手法 | 説明 |
|---|---|
| Cookie | ブラウザに情報を保存し、毎回送信 |
| Session | サーバー側でセッションIDをキーに状態を保存 |
| JWT(トークン) | 署名付きトークンをクライアントが保持 |
# Cookieを使った状態管理の例
GET /dashboard HTTP/1.1
Cookie: session_id=abc123xyz
実践メモ: 現代のWebアプリでは、ステートレスなJWTトークンを使った認証が主流になっています。
HTTP/1.1の特徴
現在広く使われているHTTP/1.1(1997年リリース)の主要機能:
持続的接続(Keep-Alive)
Connection: keep-alive
1つのTCP接続で複数のリクエスト/レスポンスを処理できます。接続の確立コストを削減し、パフォーマンスが向上します。
パイプライン化
複数のリクエストをレスポンスを待たずに送信できます(ただし、実装が複雑で広く使われていません)。
チャンク転送エンコーディング
Transfer-Encoding: chunked
サイズが事前にわからないデータを分割して送信できます。
ホストヘッダー必須
Host: www.example.com
1つのIPアドレスで複数のドメインをホスティング(仮想ホスト)できるようになりました。
注意: HTTP/1.1にはヘッダーの重複やHead-of-Line Blockingといった制約があります。これらはHTTP/2やHTTP/3で改善されています。
HTTPとHTTPSの違い
| 項目 | HTTP | HTTPS |
|---|---|---|
| ポート | 80 | 443 |
| 暗号化 | なし | TLS/SSL |
| セキュリティ | 盗聴・改ざんリスク | 通信内容を保護 |
| 証明書 | 不要 | SSL/TLS証明書が必要 |
| SEO | 影響なし | Googleが評価 |
ポイント: 現代のWebサイトでは、HTTPS化が標準です。ブラウザもHTTPサイトに「安全ではありません」警告を表示します。
リクエスト/レスポンスの実例
GETリクエスト(データ取得)
GET /api/products?category=books&limit=10 HTTP/1.1
Host: api.example.com
Accept: application/json
User-Agent: curl/7.68.0
POSTリクエスト(データ送信)
POST /api/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
Content-Length: 45
{"name": "Alice", "email": "alice@example.com"}
レスポンス
HTTP/1.1 201 Created
Content-Type: application/json
Location: /api/users/456
Content-Length: 78
{"id": 456, "name": "Alice", "email": "alice@example.com", "created_at": "2026-05-02T10:00:00Z"}
よくある質問
Q1: HTTPとHTMLの違いは?
- HTTP: 通信プロトコル(通信ルール)
- HTML: マークアップ言語(文書の記述形式)
Q2: HTTPはなぜTCPを使うのか? TCP は信頼性のある通信を保証するためです。パケットの順序や到達を保証する必要があるため、UDPではなくTCPが使われます(ただし、HTTP/3ではQUICプロトコル上で動作)。
Q3: HTTP/1.1とHTTP/2の違いは? HTTP/2はバイナリフレーム化、多重化、ヘッダー圧縮などで大幅に性能が向上しています(詳細は別記事で解説)。
まとめ
HTTPはシンプルでステートレスな設計により、Webの爆発的な成長を支えてきました。リクエスト/レスポンスの基本構造を理解することは、Web開発の第一歩です。
関連記事
- HTTPメソッド - GET / POST / PUT / DELETE / PATCH の使い分け
- HTTPステータスコード - 1xx〜5xxの意味と使い分け
- HTTPヘッダー入門 - リクエスト/レスポンスヘッダーの全体像
参考リソース
- MDN - An overview of HTTP
- RFC 9110 - HTTP Semantics
- RFC 9112 - HTTP/1.1
- W3C - HTTP - Hypertext Transfer Protocol