HTTP の基本
Web 通信のプロトコル。メソッド・URL・ヘッダー・ボディのリクエストを送り、 ステータス・ヘッダー・ボディのレスポンスが返る。 HTTP/1.1 → 2 → 3 と進化してきた。
メソッド
| メソッド | 用途 | idempotent | safe |
|---|---|---|---|
GET | 取得 | ○ | ○ |
HEAD | ヘッダーのみ取得 | ○ | ○ |
POST | 作成・任意の操作 | × | × |
PUT | 置換(idempotent) | ○ | × |
PATCH | 部分更新 | ×(実装次第) | × |
DELETE | 削除 | ○ | × |
OPTIONS | 許可メソッド確認・CORS preflight | ○ | ○ |
TRACE | 診断(普通使わない) | ○ | ○ |
CONNECT | プロキシ確立(HTTPS) | × | × |
- safe — サーバの状態を変えない
- idempotent — 何度送っても同じ結果(リトライ可能)
ステータスコード
| レンジ | 意味 |
|---|---|
| 1xx | Informational — 100 Continue / 101 Switching Protocols / 103 Early Hints |
| 2xx | Success — 200 OK / 201 Created / 204 No Content / 206 Partial Content |
| 3xx | Redirect — 301 永続 / 302 一時 / 303 See Other / 304 Not Modified / 307 / 308 |
| 4xx | Client Error — 400 / 401 / 403 / 404 / 405 / 409 / 410 / 413 / 415 / 422 / 429 |
| 5xx | Server Error — 500 / 502 / 503 / 504 |
覚えておくと便利なステータス
- 204 No Content — 成功・本文なし(DELETE 後など)
- 304 Not Modified — キャッシュ有効(ETag マッチ)
- 401 Unauthorized — 認証必要
- 403 Forbidden — 権限なし
- 404 Not Found — リソース不在
- 409 Conflict — 衝突(楽観ロック等)
- 410 Gone — 永続的に消滅
- 422 Unprocessable Entity — バリデーションエラー
- 429 Too Many Requests — レート制限
- 502 Bad Gateway — 上流サーバから不正な応答
- 503 Service Unavailable — メンテ・過負荷
- 504 Gateway Timeout — 上流タイムアウト
主要なヘッダー
リクエスト側
Host— ドメインUser-Agent— クライアント情報Accept— 受信したい Content-Type(application/json等)Accept-Language— 希望言語Accept-Encoding— gzip / br 等Authorization— 認証(Bearer .../Basic ...)Cookie— セッションContent-Type— ボディの形式Content-Length— バイト数Origin— クロスオリジンの起点Referer— 直前のページIf-None-Match— ETag によるキャッシュ確認If-Modified-Since— 日付ベースのキャッシュ確認Range— 部分取得(動画等)
レスポンス側
Content-Type— ボディの形式Content-Length— バイト数Content-Encoding— 圧縮(gzip / br)Cache-Control— キャッシュ制御ETag— リソースの版識別子Last-Modified— 更新日時Set-Cookie— Cookie 設定Location— リダイレクト先Access-Control-Allow-*— CORSStrict-Transport-Security— HTTPS 強制Content-Security-Policy— CSPX-Frame-Options— iframe 制御Server-Timing— サーバ処理時間Retry-After— 429 / 503 でいつ再試行可能か
HTTP バージョン
HTTP/1.1
- テキストプロトコル
- 1接続で1リクエストずつ(pipelining はほぼ動かない)
- 多数同時接続に弱い
HTTP/2
- バイナリ・多重化(1接続で並列)
- ヘッダー圧縮(HPACK)
- サーバプッシュ(廃止傾向)
- 1ホストあたり1接続が原則 → ドメインシャーディング不要に
HTTP/3 (QUIC)
- UDP ベース。TCP のヘッドオブラインブロッキングを解消
- 0-RTT 再接続が速い
- ネットワーク切替(Wi-Fi → 4G)でも接続維持
- 主要 CDN・ブラウザで対応済み
HTTPS / TLS
- HTTP に TLS(暗号化)を被せたもの
- TLS 1.3 がデフォルト(高速ハンドシェイク)
- 証明書: Let's Encrypt(無料)/ ZeroSSL / 商用 CA
- HSTS(
Strict-Transport-Security)で HTTPS 強制 - 混在コンテンツ(HTTPS ページから HTTP リソース)はブロックされる
リダイレクト
| コード | 意味 |
|---|---|
| 301 | 恒久。SEO 移転に |
| 302 | 一時(メソッド変更可。曖昧で非推奨) |
| 303 | See Other(POST 後 GET) |
| 307 | 一時、メソッド維持 |
| 308 | 恒久、メソッド維持 |
条件付きリクエスト
ETag / Last-Modified を使い、変更がなければ 304 で本文を返さない。 通信量と時間を節約。
GET /style.css HTTP/1.1
If-None-Match: "abc123"
→ 304 Not Modified (変更なし)
→ 200 OK + ETag: "def456" (変更あり)
圧縮
- gzip — 古くからの定番
- br(Brotli) — Google 製、より圧縮率が高い
- zstd — 高速・新しい
- クライアントが
Accept-Encodingで対応を伝え、サーバが選ぶ
Range(部分取得)
動画のシーク、レジューム、巨大ファイルの分割取得に。
GET /video.mp4
Range: bytes=1024-2047
→ 206 Partial Content
Content-Range: bytes 1024-2047/8192
Content-Type の主要
application/json— JSONtext/html— HTMLtext/css/application/javascriptimage/png/image/jpeg/image/webp/image/avifapplication/x-www-form-urlencoded— フォーム送信(標準)multipart/form-data— ファイルアップロードtext/event-stream— Server-Sent Eventsapplication/octet-stream— バイナリ汎用
HTTP の検査ツール
- Chrome DevTools / Network タブ — 全部見える
- curl — CLI で叩く
- HTTPie — curl の使いやすい代替
- Postman / Insomnia / Hoppscotch — GUI
- Wireshark / Charles / mitmproxy — パケット観察
curl の例
curl -i https://example.com # ヘッダー込み
curl -X POST -d '{"a":1}' -H "Content-Type: application/json" url
curl -H "Authorization: Bearer xxx" url
curl -L https://... # リダイレクト追従
curl -o file.zip https://... # 保存
curl --http3 https://... # HTTP/3 強制