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.1 | 1接続で1リクエストずつ。長年の標準 |
| HTTP/2 | 1接続で複数リクエストを多重化。高速化 |
| HTTP/3 | TCPではなく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で横に並べやすくなります。