HTTP は WWW でブラウザとサーバが HTML・画像・API レスポンスをやり取りするテキストベース通信プロトコル。トランスポートには TCP (HTTP/3 では QUIC = UDP) を使い、その上にリクエスト / レスポンス構造を載せる。HTTPS はこれを TLS で暗号化し、盗聴・改ざん・なりすましを同時に防ぐ。本稿はメッセージ構造・メソッド・ステータス・ヘッダ・Cookie・HTTP/1.x〜3 の進化・TLS ハンドシェイク・代表的なセキュリティ落とし穴までを通しで整理する。
HTTP の基本構造 #
HTTP は ステートレスなリクエスト・レスポンス型 のプロトコル。クライアントが要求を送り、サーバが応答を返す。この 1 往復を HTTP トランザクション と呼ぶ。サーバ側は基本的に過去のリクエストを覚えていない (= ステートレス)。状態を引き継ぐには Cookie / セッション / JWT などで補う。
通信内容はテキストベースの HTTP メッセージで、リクエスト行 / ステータス行 → ヘッダ → 空行 → ボディ の 4 ブロック構造。HTTP/2 以降はバイナリフレームに分割されるが、論理構造は変わらない。
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html,*/*
Cookie: session=abc123
# ↑ 空行で区切ってボディ (GET なので無し)- リクエストライン — メソッド (
GET) / パス (/index.html) / プロトコルバージョン (HTTP/1.1) - ヘッダ —
名前: 値の形式で複数行。Host/User-Agent/Accept/Cookie/Authorizationなど - 空行 — ヘッダとボディの境界
- ボディ —
POST/PUTなどで送るデータ本体 (フォーム / JSON)
HTTP/1.1 200 OK
Date: Sun, 17 May 2026 00:00:00 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 1234
Set-Cookie: session=abc123; Secure; HttpOnly; SameSite=Lax
# ↓ 空行のあとボディ
<html>
...
</html>自分で送ってみる — メソッドとパスを入れて送信すると、サーバがステータスコード付きでレスポンスを返す流れを再現できる。/admin は 403、存在しないパスは 404、/old は 301 を返す。
HTTP メソッド #
| メソッド | 用途 | ボディ | 冪等性 |
|---|---|---|---|
| GET | リソース取得 | なし | あり |
| POST | 新規作成 / 任意処理 | あり | なし |
| PUT | リソース全体置換 | あり | あり |
| PATCH | リソース部分更新 | あり | なし |
| DELETE | リソース削除 | 任意 | あり |
| HEAD | ヘッダのみ取得 (GET のメタ情報版) |
なし | あり |
| OPTIONS | サポートメソッド問い合わせ (CORS プリフライトで多用) | なし | あり |
冪等性 (idempotency) があるメソッドは「同じリクエストを何度送っても結果が変わらない」性質を持ち、ネットワーク失敗時に安全にリトライできる。POST は冪等でないため、二重送信防止 (Idempotency Key ヘッダや UI 側でのボタン無効化) の設計が必要になる。
ステータスコード #
3 桁の数字で、先頭の数字が大分類を示す。
| 系統 | 意味 | 代表例 |
|---|---|---|
| 1xx | 情報 | 100 Continue / 101 Switching Protocols |
| 2xx | 成功 | 200 OK / 201 Created / 204 No Content |
| 3xx | リダイレクト | 301 Moved Permanently / 302 Found / 304 Not Modified |
| 4xx | クライアント側エラー | 400 Bad Request / 401 Unauthorized / 403 Forbidden / 404 Not Found / 429 Too Many Requests |
| 5xx | サーバ側エラー | 500 Internal Server Error / 502 Bad Gateway / 503 Service Unavailable / 504 Gateway Timeout |
401 Unauthorized は「認証していない」 (= ログインしろ)。403 Forbidden は「認証はしているが権限がない」 (= ログインしてもダメ)。API 設計では権限不足を 404 で返して存在自体を隠す流派もある。
重要な HTTP ヘッダ #
セキュリティ・パフォーマンスに直結するヘッダを列挙する。
リクエスト側:
Host— 仮想ホスト識別。1 つの IP で複数ドメインを区別するUser-Agent— クライアント識別。WAF や bot 検知の判定材料Cookie— 過去にサーバからSet-Cookieで受け取った値を毎回送信Authorization—Basic/Bearer <token>などの認証情報Referer— 直前のページ URL (タイポではない、仕様で定着)
レスポンス側:
Set-Cookie— クライアントにクッキーを発行Content-Type— MIME タイプ (例:application/json; charset=UTF-8)Cache-Control— キャッシュ動作の指定 (no-store/max-age=3600)Strict-Transport-Security(HSTS) — 強制的に HTTPS で接続させるContent-Security-Policy(CSP) — スクリプト読み込み元を制限し、XSS を抑制X-Frame-Options/CSP: frame-ancestors— クリックジャッキング対策
Cookie とセッション #
HTTP はステートレスなので、ログイン状態などを維持するには Cookie を使う。Set-Cookie で発行し、クライアントは以降のリクエストの Cookie ヘッダで送り返す。
セッションハイジャックを防ぐため、現代では以下の属性を必ず付与する。
| 属性 | 意味 |
|---|---|
Secure |
HTTPS でのみ送信。HTTP 経由では送らない |
HttpOnly |
JavaScript の document.cookie から読み取れない。XSS で盗まれにくい |
SameSite=Lax / Strict |
別オリジンからのリクエストでは送信しない。CSRF 対策 |
Expires / Max-Age |
セッション Cookie か永続 Cookie かを制御 |
Set-Cookie: session=abc123; Secure; HttpOnly; SameSite=Lax; Max-Age=3600; Path=/
# Secure → HTTPS のみ送信
# HttpOnly → JS から読めない (XSS 緩和)
# SameSite=Lax → CSRF 緩和 (別オリジンから自動送信されない)HTTP のバージョン進化 #
| バージョン | 年 | 特徴 |
|---|---|---|
| HTTP/1.0 | 1996 | リクエストごとに TCP 接続を張る (重い) |
| HTTP/1.1 | 1997 | Keep-Alive で接続再利用、パイプライン (実用化は限定的) |
| HTTP/2 | 2015 | バイナリフレーム、多重化 で 1 接続で並列リクエスト、ヘッダ圧縮 (HPACK) |
| HTTP/3 | 2022 | QUIC (UDP ベース) でハンドシェイクを最小化、パケットロス時の HoL ブロッキング解消 |
HTTP/1.1 ではリクエストが順番待ちで詰まる。HTTP/2 は多重化でアプリ層の HoL を緩和したが、TCP の順序保証で 1 パケット欠損が後続全部を止める TCP 層 HoL が残った。HTTP/3 は QUIC が UDP 上にストリーム独立した多重化を実装することで、トランスポート層の HoL ブロッキングも解消する。
HTTPS と TLS ハンドシェイク #
HTTPS = HTTP + TLS (Transport Layer Security)。TLS は次の 3 つを同時に達成する。
- 暗号化 — 通信内容を第三者から見えなくする (機密性)
- 改ざん検知 — メッセージ認証コードで内容の改ざんを検知 (完全性)
- サーバ認証 — 証明書でサーバが本物だと確認 (真正性)
TLS 1.3 のハンドシェイクは 4 段階で完結する。
TLS 1.2 までは 2 往復必要だったが、TLS 1.3 では 1 往復 (1-RTT)、再接続なら 0-RTT で済む。
サーバ証明書は 認証局 (CA) が発行する。クライアントは OS / ブラウザに同梱されたルート CA の公開鍵で証明書チェーン (サーバ証明書 → 中間 CA → ルート CA) を検証し、信頼できる場合のみ TLS 接続を完成させる。
| 種別 | 検証内容 | 例 |
|---|---|---|
| DV (Domain Validation) | ドメイン所有のみ確認 | Let's Encrypt など無料発行 |
| OV (Organization Validation) | 組織実在性も確認 | 主要商用 CA |
| EV (Extended Validation) | より厳格な実在性確認 | 旧緑バー表示は現在廃止 |
セキュリティ上の落とし穴 #
サーバ管理者・開発者の観点で注意したい代表例。
- MITM (中間者攻撃) — 公衆 Wi-Fi などで攻撃者が経路に割り込み、リクエストを盗聴・改ざん。HTTPS と正しい証明書検証で防ぐ
- SSL Stripping — HTTPS リダイレクトを攻撃者がブロックし、HTTP に降格させて盗聴。HSTS (
Strict-Transport-Security) を返すことで以降ブラウザが HTTPS を強制 - HSTS Preload — Chrome / Firefox 等が同梱するプリロードリストにドメインを登録すると、初回アクセスから HTTPS 強制
- Mixed Content — HTTPS ページが HTTP リソース (画像 / スクリプト) を読み込むと TLS の保護が崩れる。
upgrade-insecure-requestsCSP ディレクティブで自動 HTTPS 化 - Cookie 属性の不備 —
Secure/HttpOnly/SameSiteを付け忘れるとセッションハイジャック / XSS / CSRF のリスク - 証明書ピン留めの罠 — 厳格にピン留めしすぎると CA 更新時に通信不能。HPKP (HTTP Public Key Pinning) は廃止された
- TLS 実装のバグ — Heartbleed (CVE-2014-0160) 等。OpenSSL を最新に保つことが防御の前提
ペネトレーションテストでは Burp Suite や mitmproxy で TLS 通信を 手元のローカル CA で復号して中身を確認する手法が定番。これは「証明書検証を一時的に緩める」操作で、本番運用では絶対に行わないこと。検証用 VM / 隔離環境でのみ使い、終わったらローカル CA をシステムから削除する。