Skip to content

HTTP プロトコル:フロントエンドとバックエンドの「通信言語」

🎯 核心問題

HTTP はどのように動作するのか? これは「二人はどうやって会話するのか?」と尋ねるようなものです。言語、文法、会話ルールを決める必要があります。HTTP はフロントエンドとバックエンドの間の「会話プロトコル」です。


0. HTTP の本質

HTTP(HyperText Transfer Protocol、ハイパーテキスト転送プロトコル)は、フロントエンドとバックエンドの通信の基盤プロトコルです。

0.1 会話に例える

会話要素HTTP 対応説明
言語HTTP プロトコル双方が理解できる言語
文法リクエスト/レスポンス形式どのように「話す」か
流れリクエスト-レスポンスモデル一問一答
終了切断TCP 接続のクローズ

1. HTTP の発展の歴史

HTTP は 1991 年の誕生以来、何度も大きなアップグレードを経てきました。

🌐HTTP Protocol Demo
📤HTTP request
GET/api/users/123HTTP/1.1
Host:api.example.com
User-Agent:Mozilla/5.0
Accept:application/json
Authorization:Bearer xxx
TCP connection
📥HTTP response
HTTP/1.1200OK
Content-Type:application/json
Content-Length:156
Cache-Control:max-age=3600
{ "id": 123, "name": "Alice", "email": "alice@example.com" }

1.1 バージョン比較

バージョン核心的な改善典型的な特徴
HTTP/0.91991GET のみサポートプレーンテキスト、リクエストのみ、レスポンスヘッダーなし
HTTP/1.01996POST/HEAD 追加リクエストごとに TCP 接続
HTTP/1.11997持続的接続Keep-Alive、1 接続で複数リクエスト
HTTP/22015多重化バイナリフレーム、ヘッダー圧縮
HTTP/32022QUIC ベースUDP 転送、ヘッドオブラインブロッキングの解決

💡 なぜ HTTP/2 が必要なのか?

HTTP/1.1 は持続的接続をサポートしていますが、リクエストは直列に送信する必要があります(前のリクエストのレスポンスが返ってから次のリクエストを送信)。HTTP/2 は多重化によってこの問題を解決し、複数のリクエストを同時に送信できます。


2. HTTP リクエストの構造

2.1 リクエストライン

http
GET /api/users/123 HTTP/1.1

3 つの部分を含みます:

  • メソッド:GET、POST、PUT、DELETE など
  • URL:リクエストするリソースパス
  • バージョン:HTTP/1.1 または HTTP/2

2.2 リクエストヘッダー

http
Host: api.example.com
User-Agent: Mozilla/5.0
Accept: application/json
Authorization: Bearer xxx
Content-Type: application/json
Content-Length: 45

よく使われるリクエストヘッダー:

ヘッダー説明
Hostサーバードメインapi.example.com
User-Agentクライアント情報Mozilla/5.0
Accept受け入れるレスポンスタイプapplication/json
Authorization認証情報Bearer token
Content-Typeリクエストボディのタイプapplication/json

2.3 リクエストボディ

json
{
  "name": "田中",
  "email": "tanaka@example.com"
}

POST、PUT、PATCH メソッドのみリクエストボディがあります。


3. HTTP レスポンスの構造

3.1 ステータスライン

http
HTTP/1.1 200 OK

3 つの部分を含みます:

  • バージョン:HTTP/1.1
  • ステータスコード:200、404、500 など
  • ステータステキスト:OK、Not Found など

3.2 レスポンスヘッダー

http
Content-Type: application/json
Content-Length: 156
Cache-Control: max-age=3600
Set-Cookie: session=xxx; HttpOnly

よく使われるレスポンスヘッダー:

ヘッダー説明
Content-Typeレスポンスボディのタイプapplication/json
Content-Lengthレスポンスボディのサイズ156
Cache-Controlキャッシュ戦略max-age=3600
Set-CookieCookie の設定session=xxx

3.3 レスポンスボディ

json
{
  "code": 0,
  "data": {
    "id": 123,
    "name": "田中"
  }
}

4. HTTP メソッド詳細

メソッド用途リクエストボディ冪等性安全性
GETリソースの取得なしありあり
POSTリソースの作成ありなしなし
PUT全量更新ありありなし
PATCH部分更新ありなしなし
DELETEリソースの削除なしありなし
HEADヘッダーの取得なしありあり
OPTIONSサポートメソッドの問い合わせなしありあり

4.1 GET vs POST

特性GETPOST
パラメータの位置URL クエリパラメータリクエストボディ
キャッシュキャッシュ可能デフォルトでキャッシュ不可
ブックマークブックマークに追加可能不可
履歴ブラウザ履歴に保存保存されない
データ長制限あり(URL 長)制限なし
セキュリティパラメータが URL に見えるパラメータはリクエストボディ内

💡 GET/POST を使うタイミング

  • GET:検索、データ取得
  • POST:作成、データ送信
  • PUT:全量更新(リソース全体を置換)
  • PATCH:部分更新(指定フィールドのみ変更)
  • DELETE:リソースの削除

5. HTTP ステータスコード

5.1 ステータスコードの分類

分類説明典型的なステータスコード
2xx成功200 OK、201 Created、204 No Content
3xxリダイレクト301 恒久的、302 一時的、304 未変更
4xxクライアントエラー400 パラメータエラー、401 未認証、404 存在しない
5xxサーバーエラー500 内部エラー、503 利用不可

5.2 よく使われるステータスコード

ステータスコード説明使用シーン
200 OKリクエスト成功GET、PUT リクエスト成功
201 Created作成成功POST リソース作成成功
204 No Content内容なしDELETE 削除成功
301 Moved Permanently恒久的リダイレクトURL が恒久的に変更
302 Found一時的リダイレクトURL が一時的に変更
304 Not Modified未変更キャッシュ有効
400 Bad Requestパラメータエラーリクエストパラメータ形式エラー
401 Unauthorized未認証ログインが必要
403 Forbidden権限なしログイン済みだが権限不足
404 Not Found存在しないリソースが存在しない
500 Internal Server Error内部エラーサーバー異常
503 Service Unavailable利用不可サーバーメンテナンス中または過負荷

6. HTTPS:安全な HTTP

6.1 HTTP vs HTTPS

特性HTTPHTTPS
プロトコルTCPTCP + SSL/TLS
ポート80443
データ平文転送暗号化転送
証明書不要SSL 証明書が必要
パフォーマンスやや速いやや遅い(ハンドシェイクのオーバーヘッド)
SEO影響なし検索エンジンが優先的に収集

6.2 HTTPS のワークフロー

  1. Client Hello:クライアントがサポートする暗号スイートを送信
  2. Server Hello:サーバーが証明書と選択した暗号スイートを返す
  3. 証明書検証:クライアントがサーバー証明書の有効性を検証
  4. 鍵交換:非対称暗号でセッション鍵を交換
  5. 暗号化通信:セッション鍵を使用して対称暗号通信

💡 HTTPS の利点

  • 盗聴防止:データが暗号化され、第三者が読み取れない
  • 改ざん防止:データの完全性チェック
  • なりすまし防止:SSL 証明書でサーバー身元を検証

7. HTTP キャッシュ機構

7.1 キャッシュヘッダー

ヘッダー説明
Cache-Controlキャッシュ戦略max-age=3600
ETagリソースバージョン番号"33a64df551425fcc"
Last-Modified最終更新日時Wed, 21 Oct 2015 07:28:00 GMT

7.2 キャッシュ戦略

強キャッシュ

http
Cache-Control: max-age=3600

3600 秒以内、ブラウザは直接キャッシュを使用し、リクエストを送信しません。

条件付きキャッシュ

http
ETag: "33a64df551425fcc"

ブラウザが If-None-Match を送信し、サーバーが 304(未変更)または 200(変更済み)を返します。


8. よくある質問

8.1 GET と POST の本質的な違い

誤解:GET と POST の違いはパラメータの位置だけ。

真実

  • GET は冪等で、複数回リクエストしても結果は同じ
  • POST は非冪等で、複数回リクエストすると複数のリソースが作成される可能性がある
  • GET はキャッシュ可能、POST はデフォルトでキャッシュ不可
  • GET はブックマークに保存可能、POST は不可

8.2 HTTP/1.1 のヘッドオブラインブロッキング

問題:HTTP/1.1 は持続的接続をサポートしていますが、リクエストは直列に送信する必要があります。前のリクエストの応答が遅いと、後続のリクエストもすべて待たされます。

解決策

  • HTTP/2 の多重化
  • ドメインシャーディング(複数ドメインで複数接続を確立)
  • 接続プール(同時接続数を制限)

8.3 HTTP/2 の利点

特性HTTP/1.1HTTP/2
転送形式テキストバイナリフレーム
多重化非対応対応
ヘッダー圧縮なしHPACK アルゴリズム
サーバープッシュ非対応対応

用語早見表

用語英語説明
HTTPHyperText Transfer Protocolハイパーテキスト転送プロトコル
HTTPSHTTP SecureHTTP + SSL/TLS
TCPTransmission Control Protocol伝送制御プロトコル
SSL/TLSSecure Sockets Layerセキュアソケットレイヤー
冪等性Idempotent複数回リクエストしても結果が同じ
持続的接続Keep-Alive1 つの TCP 接続で複数リクエストを送信
多重化Multiplexing複数リクエストを同時に送信
ヘッドオブラインブロッキングHead-of-Line Blocking前のリクエストが後続のリクエストをブロックすること