HTTP プロトコルを一言でいうと
HTTP は
「ブラウザ(クライアント)と Web サーバーが会話するための“決まりごと(プロトコル)”」
です。
ブラウザが「このページください」「このデータください」とお願いを送り、
サーバーが「はい、これが結果です」と返事をする。
この“お願い”と“返事”の形式やルールを決めているのが HTTP です。
Java で Web アプリを書くということは、
この HTTP の世界に、自分のアプリを参加させることだと思ってください。
HTTP の基本構造:リクエストとレスポンス
リクエストは「お願いの手紙」
ブラウザがサーバーに送るのが HTTP リクエストです。
中身はざっくり言うと「どの URL に」「どんな操作を」「どんな条件で」したいか、という情報です。
典型的なリクエストはこんな形をしています。
GET /users?id=1 HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 ...
Accept: text/html
一行目が特に重要で、ここに
メソッド(GET)
パス(/users)
HTTP のバージョン(HTTP/1.1)
が書かれています。
その下には、追加情報(ヘッダ)が続きます。Host はどのホスト名に対するリクエストか、User-Agent はどんなブラウザか、Accept はどんな形式のレスポンスを受け取りたいか、
などを伝えています。
POST などでフォームや JSON を送るときは、
この下に「ボディ」と呼ばれる本体データが付きます。
レスポンスは「返事の手紙」
サーバーがブラウザに返すのが HTTP レスポンスです。
典型的なレスポンスはこんな形です。
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 1234
<html>...</html>
一行目には
HTTP のバージョン(HTTP/1.1)
ステータスコード(200)
ステータスメッセージ(OK)
が書かれています。
ステータスコードは特に重要で、
200 は「成功」
404 は「見つからない」
500 は「サーバー内部エラー」
といった意味を持ちます。
その下にはヘッダが続き、Content-Type で「中身の種類(HTML / JSON / 画像など)」Content-Length で「データの長さ」
などを伝えます。
空行のあとに、実際の中身(HTML や JSON)がボディとして続きます。
HTTP メソッド:何をしたいのかを表す
代表的なメソッド
HTTP メソッドは、「この URL に対して何をしたいか」を表す動詞です。
特に Web アプリでよく使うのは次の 4 つです。
GET
「データを取得したい」
例:ユーザー一覧を取得、詳細を表示
POST
「新しいデータを作りたい」
例:ユーザー登録、フォーム送信
PUT
「既存データを置き換えたい」
DELETE
「データを削除したい」
Java(Spring)では、これらをアノテーションで表現します。
@GetMapping("/users")
public List<UserResponse> list() { ... }
@PostMapping("/users")
public UserResponse create(@RequestBody UserRequest request) { ... }
Javaここで、@GetMapping は HTTP の GET に対応し、@PostMapping は HTTP の POST に対応しています。
HTTP のメソッドを正しく使うことは、
RESTful な API 設計の土台になります。
HTTP は「ステートレス」である
ステートレスとは何か
HTTP は「ステートレスなプロトコル」と言われます。
これは、
「サーバーは“前回のリクエストの状態”を覚えていない」
という意味です。
毎回のリクエストは、
それ単体で完結している前提です。
例えば、
1 回目のリクエストでログインして
2 回目のリクエストでマイページを表示する
という流れがあったとしても、
HTTP 自体は「この 2 つのリクエストが同じユーザーから来ている」とは知りません。
じゃあ、ログイン状態はどうやって覚えるのか?
ここで登場するのが、
クッキー(Cookie)やセッション(Session)です。
サーバーは、
ログイン成功時に「セッション ID」を発行し、
それをクッキーとしてブラウザに渡します。
ブラウザは、
次回以降のリクエストにそのクッキーを自動で付けて送ります。
サーバーは、
そのクッキーを見て「このリクエストは誰のものか」を判断します。
つまり、
HTTP 自体はステートレスだけれど、
その上に「状態管理の仕組み(セッションなど)」をアプリ側で乗せている、
という構造になっています。
HTTP バージョンのざっくりした違い
HTTP/1.1 の世界
長らく標準だったのが HTTP/1.1 です。
1 本の TCP 接続で、
リクエストとレスポンスを順番にやり取りします。
同時にたくさんのリソース(画像、CSS、JS)を読み込むときは、
複数の接続を張ったり、
ブラウザ側で工夫したりしていました。
Java の多くの Web フレームワークやサーバーは、
今でも HTTP/1.1 を基本として動いています。
HTTP/2 / HTTP/3 の世界(ざっくり)
HTTP/2 では、
1 本の接続の中で複数のリクエストを同時に流せるようになり、
ページの読み込みが高速になりました。
HTTP/3 では、
TCP ではなく QUIC(UDP ベース)を使うことで、
さらに接続の確立や再送の効率が良くなっています。
ただし、
Java で Web アプリを書くときに、
最初からこれらの詳細を意識する必要はあまりありません。
「HTTP にはバージョンがあって、
新しいほど“同じことをもっと効率よくやっている”」
くらいの理解で十分です。
Java 開発者視点での「HTTP プロトコル概要」
フレームワークが隠してくれているが、頭の中には持っておく
Spring Boot などを使うと、
HTTP の生のリクエスト・レスポンスを直接扱うことはほとんどありません。
@GetMapping@PostMapping@RequestParam@RequestBody@ResponseBody
といったアノテーションを付けるだけで、
フレームワークが HTTP の細かい部分をよしなに処理してくれます。
それでも、頭の中には
「ブラウザが HTTP リクエストを送ってくる」
「サーバーはステータスコードとヘッダとボディを返す」
「メソッド(GET/POST など)と URL で“何をしたいか”を表現する」
という HTTP の基本イメージを持っておくことが大事です。
デバッグやトラブルシュートで効いてくる
「画面が真っ白で何も出ない」
「API を叩いたら 404 が返ってくる」
「CORS エラーが出る」
こういったときに、
HTTP のリクエストとレスポンスを実際に見て、
どの URL に
どのメソッドで
どんなヘッダとボディで
どんなステータスコードとレスポンスが返ってきているか
を確認できると、
原因にたどり着くスピードが一気に上がります。
初心者がまず押さえるべき HTTP のイメージ
あなたの言葉で整理すると、こうなります。
HTTP は、
ブラウザ(クライアント)とサーバーが
リクエスト(お願い)とレスポンス(返事)をやり取りするためのルール。
リクエストには
メソッド(GET/POST など)
URL(パス)
ヘッダ
ボディ(必要なら)
があり、
レスポンスには
ステータスコード(200/404/500 など)
ヘッダ
ボディ(HTML や JSON)
がある。
HTTP 自体はステートレスだが、
クッキーやセッションを使って「ログイン状態」などをアプリ側で管理している。
Java で Web アプリを書くときは、
フレームワークが HTTP の細部を隠してくれるが、
この全体像を頭に入れておくと、
設計もデバッグも一段やりやすくなる。
もしよければ、
実際にブラウザの開発者ツールを開いて、
「ネットワーク」タブでリクエストとレスポンスを眺めてみてほしい。
気になる画面を一つ決めて、
「この画面の裏でどんな HTTP が飛んでいるか」を一緒に読み解いていくと、
HTTP の理解が一気にリアルになるから。

