1.

HTTP プロトコル完全ガイド

編集
この記事の要点
  • HTTP (Hyper Text Transfer Protocol) は Web の基本プロトコル。TCP/80、HTTPS は TCP/443
  • メソッドは GET / POST / PUT / DELETE / PATCH / HEAD / OPTIONS。冪等性 (idempotent) が REST 設計の鍵
  • ステータスコードは 1xx 情報 / 2xx 成功 / 3xx リダイレクト / 4xx クライアントエラー / 5xx サーバエラー
  • ヘッダで Content-Type / Authorization / Cookie / Cache-Control / CORS 等を交渉
  • HTTP/1.1 (テキスト)HTTP/2 (バイナリ・多重化)HTTP/3 (QUIC/UDP) と進化中

HTTP の基本

HTTP (Hyper Text Transfer Protocol) は、Web ブラウザと Web サーバの間でリソース (HTML / 画像 / JSON 等) をやりとりするためのプロトコル。リクエスト / レスポンス型のステートレスプロトコルで、1990 年に Tim Berners-Lee が考案、現在は HTTP/1.1 (RFC 9112) / HTTP/2 (RFC 9113) / HTTP/3 (RFC 9114) が標準。

項目HTTPHTTPS
ポート80/tcp443/tcp (HTTP/3 は 443/udp)
暗号化無しTLS
URL スキームhttp://https://

リクエスト / レスポンスのフォーマット

# リクエスト
GET /api/users/1 HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (...)
Accept: application/json
Authorization: Bearer eyJhbGc...

# レスポンス
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 47
Cache-Control: max-age=60
Date: Wed, 11 Jun 2026 00:00:00 GMT

{"id":1,"name":"Alice","email":"a@example.com"}

HTTP メソッド

メソッド用途SafeIdempotentボディ
GETリソース取得×
HEADヘッダのみ取得×
POST新規作成・任意処理××
PUT全置換 / 作成×
PATCH部分更新××
DELETE削除××/○
OPTIONS許可メソッド確認 (CORS preflight)×
CONNECTHTTPS プロキシトンネル×××
TRACE診断用 (通常無効化推奨)×

Safe: 副作用がない / Idempotent: 何度実行しても結果が同じ。REST API 設計の核となる概念です。

ステータスコード

分類意味代表例
1xx情報100 Continue / 101 Switching Protocols (WebSocket)
2xx成功200 OK / 201 Created / 204 No Content
3xxリダイレクト301 Moved Permanently / 302 Found / 304 Not Modified / 307 / 308
4xxクライアントエラー400 Bad Request / 401 Unauthorized / 403 Forbidden / 404 Not Found / 409 Conflict / 422 Unprocessable / 429 Too Many Requests
5xxサーバエラー500 Internal Server Error / 502 Bad Gateway / 503 Service Unavailable / 504 Gateway Timeout

代表的なヘッダ

カテゴリヘッダ用途
コンテンツContent-Typeボディの MIME (例: application/json)
Content-Lengthボディサイズ (byte)
Content-Encoding圧縮形式 (gzip / br / zstd)
認証AuthorizationBearer xxx / Basic xxx
WWW-Authenticate401 時にクライアントへ要求方式を提示
セッションCookieクライアント→サーバへ Cookie 送信
Set-Cookieサーバ→クライアントへ Cookie 発行
キャッシュCache-Controlno-store / max-age=60 / public
ETagリソース版識別子(条件付き GET)
Last-Modified最終更新日時
CORSOriginリクエスト元オリジン
Access-Control-Allow-Originサーバが許可するオリジン
Access-Control-Allow-Methods許可メソッド

HTTP/1.1 vs HTTP/2 vs HTTP/3

項目HTTP/1.1HTTP/2HTTP/3
RFC9112 (旧 2616)9113 (旧 7540)9114
形式テキストバイナリフレームバイナリフレーム
多重化不可(1 接続 1 リクエスト)1 TCP 接続で多重ストリームQUIC ストリーム多重化
ヘッダ圧縮無しHPACKQPACK
サーバプッシュ無しあり (近年は非推奨)あり
下層TCPTCP + TLS★ UDP + QUIC + TLS 1.3
ハンドシェイクTCP 3way + TLS同上1-RTT (0-RTT も可)
HOL ブロッキングあり (パイプライン不完全)あり (TCP 層)★ 無し (ストリーム独立)

curl での操作例

# GET
curl -i https://example.com/

# POST JSON
curl -X POST https://example.com/api/users \
     -H 'Content-Type: application/json' \
     -H 'Authorization: Bearer XYZ' \
     -d '{"name":"Alice"}'

# ヘッダのみ
curl -I https://example.com/

# HTTP/2 / HTTP/3 を強制
curl --http2 https://example.com/
curl --http3 https://example.com/

# 詳細ログ
curl -v https://example.com/

# Cookie 保存・送信
curl -c jar.txt -b jar.txt https://example.com/

# ファイルアップロード
curl -F 'file=@./report.pdf' https://example.com/upload

# プロキシ経由
curl -x http://proxy:8080 https://example.com/

# 自己署名証明書許容 (デバッグ用)
curl -k https://localhost:8443/

wget の例

wget https://example.com/file.zip
wget -O - https://example.com/api | jq .         # 標準出力
wget --mirror --convert-links https://example.com/   # サイト全体取得

関連ツール

ツール用途
curl / wgetCLI HTTP クライアント
HTTPiehttp GET example.com。色付き・JSON 自動整形
Postman / InsomniaGUI API クライアント
Chrome DevTools / Firefox DevToolsNetwork タブで HTTP 観測
WiresharkHTTP/1.1 (平文) や HTTP/2 の解析
mitmproxyHTTP プロキシで中身改変 / 観測

REST API と HTTP

REST (Representational State Transfer) は HTTP のセマンティクスを最大限活用した API 設計スタイル。

操作メソッドURL 例ステータス
一覧取得GET/api/users200
個別取得GET/api/users/1200 / 404
作成POST/api/users201 (Location ヘッダ)
全置換PUT/api/users/1200 / 204
部分更新PATCH/api/users/1200 / 204
削除DELETE/api/users/1204

CORS (Cross-Origin Resource Sharing)

ブラウザは Same-Origin Policy で異なるオリジンへの JS リクエストを制限。CORS はサーバが「このオリジンからは許可」とヘッダで宣言する仕組み。

# Preflight (OPTIONS リクエスト、ブラウザが自動送信)
OPTIONS /api/data HTTP/1.1
Origin: https://app.example.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: Authorization, Content-Type

# 許可レスポンス
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://app.example.com
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Authorization, Content-Type
Access-Control-Max-Age: 86400

FAQ

Q: HTTP/2 と HTTPS は必須セット?
A: 仕様上は HTTP/2 でも平文可ですが、ブラウザは HTTPS 必須。現実は「HTTP/2 = HTTPS 上」で運用されています。HTTP/3 は仕様上 HTTPS のみ。

Q: 302 と 307 の違いは?
A: 302 はクライアントによってメソッドが GET に変えられがち(歴史的バグ)、307/308 はメソッドを変えずにリダイレクト。新規実装は 307/308 推奨。301 と 308 は永続、302 と 307 は一時。

Q: REST と GraphQL の違いは?
A: REST は HTTP メソッド + URL でリソースを表現。GraphQL は単一エンドポイントにクエリ言語で取得項目を指定。HTTP の冪等性メリットは REST 寄り、過剰取得回避は GraphQL 寄り。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. HTTP
  2. HTTPS
  3. DNS
  4. FTP
  5. TFTP
  6. DHCP
  7. SMTP
  8. SNMP
  9. POP3
  10. Telnet
  11. NTP
  12. SSH

最近更新/作成されたページ