HTTP

HTTPとは

HTTP(HyperText Transfer Protocol)は、ブラウザとサーバーの間でデータをやり取りするための通信プロトコル(約束事)です。Webページの表示もAPI通信も、すべてHTTPの「リクエストとレスポンス」で成り立っています。

GET /index.html HTTP/1.1      ← リクエスト(これをください)
Host: example.com

HTTP/1.1 200 OK               ← レスポンス(どうぞ)
Content-Type: text/html

<html>...</html>

HTTPが決めているのはやり取りの意味だけです。運ぶのは下位の [[TCP/IP]]、相手の居場所を調べるのは [[DNS]]、盗聴や改ざんを防ぐのは [[HTTPS・TLS]]。この分業により、意味を変えずに運び方だけを速くする進化ができました。

やり取りを構成する部品

  • メソッド — 何をしたいか。GET(取得)/ POST(送信)/ PUT(更新)/ DELETE(削除)。GET・PUT・DELETE は何度送っても結果が変わらず、安全な再送の土台です([[冪等性]])
  • URL(パス) — どのリソースに対しての操作か
  • ヘッダー — 指示とメタ情報。文字コードの宣言([[文字コードと文字化け]])、キャッシュ指示([[HTTPキャッシュ]])、[[認証と認可]] のトークン、Cookie など
  • ボディ — 運ぶ中身そのもの。[[HTML]] や [[JSON]] が代表です
  • ステータスコード — レスポンスにだけある部品。4xx なら送った側、5xx なら受けた側に原因がある、という切り分けが最初の使いどころです([[HTTPステータスコード]])

ステートレスという性質

HTTPはステートレスで、サーバーは前のリクエストを覚えていません。この一点が周辺技術の存在理由を説明します。ログイン状態を保つ [[セッション管理]] と [[WebストレージとCookie]]、必要な情報を毎回のリクエストに含める [[REST API]] の設計は、いずれも「覚えていない」ことへの答えです。

ただし弱点ではありません。どのサーバーが処理してもよいので [[ロードバランサ]] で横に並べられ、どのリクエストも自己完結しているので途中に立つ [[CDN]] がキャッシュから代わりに返せます。

バージョンの進化

バージョン特徴
HTTP/1.11接続で1リクエストずつ。長年の標準
HTTP/21接続で複数リクエストを多重化。高速化
HTTP/3TCPではなくQUIC(UDPベース)を使用

書き方はどれも同じで、アプリのコードを変える必要はありません。詳しくは [[HTTP/2とHTTP/3]] へ。

HTTPから広がる地図

呼び出す・設計する — ブラウザから呼ぶ [[fetchと非同期通信]]、設計スタイルの [[REST API]]。別解が [[GraphQL]] と [[gRPC]]、運用では [[APIバージョニング]]・[[レートリミット]]・[[冪等性]] が効きます。

安全にする — 通信路を暗号化する [[HTTPS・TLS]]、ブラウザに防御を指示する [[セキュリティヘッダー(CSP・HSTS)]]、別オリジンで出会う [[CORS]]、アプリの穴を塞ぐ [[Webセキュリティ]]。

速くする — 通信を省く [[HTTPキャッシュ]]、配信元を近づける [[CDN]]、運び方を変える [[HTTP/2とHTTP/3]]。全体像は [[Webパフォーマンス最適化]] です。

往復の型を変える — 双方向につなぎ続けるなら、HTTP から切り替える [[WebSocket]]。呼ぶ向きを逆にして、サーバー側から通知を送りつけるのが [Webhook]

下の層と通り道を見る — 運び役の [[TCP/IP]]、宛先を解決する [[DNS]]、サービスを区別する [[ポート番号]]、層で整理する [[OSI参照モデル]]。途中に立つのが [[リバースプロキシ]] と [[Webサーバーとアプリケーションサーバー]]、生の通信を覗くのが [[パケットキャプチャ]] です。

初学者向けポイント

  • リクエスト/レスポンス型: クライアントが尋ね、サーバーが答える。逆方向は基本ない
  • 開発者ツールの「Network」タブで生のHTTP通信を観察できる。最高の教材

関連技術とのつながり

  • [[TCP/IP]] — HTTPを運ぶ下位のプロトコル
  • [[HTTPS・TLS]] — HTTPを暗号化して安全にしたもの
  • [[REST API]] — HTTPの仕組みに沿ったAPI設計
  • [[HTTPステータスコード]] — レスポンスの結果を伝える3桁の数字
Q: HTTPの通信モデルとして正しいのはどれ?
- [x] クライアントが尋ね、サーバーが答えるリクエスト/レスポンス型
- [ ] サーバーが常にクライアントへ一方的に送り続ける配信型
- [ ] クライアント同士が直接データを交換するP2P型
解説: HTTPはリクエスト/レスポンス型で、サーバーからクライアントへの逆方向の通信は基本ありません。

Q: HTTPメソッドとその操作の組み合わせで正しいのはどれ?
- [ ] GET = 削除
- [ ] POST = 取得
- [x] DELETE = 削除
- [ ] PUT = 送信
解説: メソッドは操作の種類を表し、GETは取得、POSTは送信、PUTは更新、DELETEは削除です。

Q: HTTP/3の特徴として記事で挙げられているのはどれ?
- [ ] 1接続で1リクエストずつ処理する
- [ ] 1接続で複数リクエストを多重化する
- [x] TCPではなくQUIC(UDPベース)を使用する
解説: 1接続1リクエストはHTTP/1.1、多重化はHTTP/2の特徴で、HTTP/3はQUICを使います。

Q: HTTPが「ステートレス」であることの帰結として、本文が挙げているのはどれ?
- [ ] 通信内容が自動的に暗号化される
- [x] ログイン状態を保つにはセッション管理などの別の仕組みが要る
- [ ] 同じURLには一度しかアクセスできない
解説: サーバーは前のリクエストを覚えていないため、状態はCookieやトークンで持ち回ります。一方で状態を持たないからこそ、ロードバランサやCDNで横に並べやすくなります。