【初心者向け】HTTP通信の基本をシンプルに理解しよう

こんにちは！今回はWebの基盤となるHTTP通信について、できるだけわかりやすく解説します。難しい用語は極力避けて、イメージしやすいように説明していきます。

## HTTPとは？

HTTP（HyperText Transfer Protocol）は、インターネット上でWebサイトの情報をやりとりするための約束事（プロトコル）です。

**簡単に言うと：**
- WebブラウザとWebサーバーが「会話」するための言語
- この「会話」のルールを決めたもの

## 1. リクエストとレスポンス

HTTPの通信は常に「質問と回答」のようなやりとりです。

### リクエスト（Request）
あなたが使っているブラウザ（Chrome、Safari等）が、Webサーバーに対して「〇〇が欲しい」「△△の情報を送るよ」と伝えること。

**例えば：**
- 「https://example.com」にアクセスするとき
- ブラウザ：「example.comというページを見せてください」（リクエスト）

### レスポンス（Response）
サーバーがブラウザからの要求に対して「はい、どうぞ」「ごめん、それはないよ」などと答えること。


## 2. HTTPメソッド（特にGETとPOST）

リクエストを送るとき、「どんな種類の頼みごとか」を示すのがHTTPメソッドです。

### GETメソッド
「情報を**取得したい**」ときに使う方法。

**特徴：**
- URLに情報が含まれる（クエリパラメータ）
- ブラウザの履歴に残る
- ブックマークできる
- 文字数制限がある
- キャッシュされやすい

**例：** 検索やページ閲覧
```
https://search.example.com/?query=猫の画像&page=1
```

### POSTメソッド
「情報を**送信したい**」ときに使う方法。

**特徴：**
- 情報が本文（Body）に含まれる（URLには見えない）
- ブラウザの履歴に残らない
- ブックマークできない
- 文字数制限が実質ない
- 基本的にキャッシュされない

**例：** ログイン、フォーム送信（一方通行的）

```
POST /login HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded

username=tanaka&password=secret123
```

## 3. ステータスコード

サーバーからのレスポンスには「処理の結果」を表す3桁の数字（ステータスコード）が含まれます。

### 主なステータスコード

#### 2xx（成功）
- **200 OK**：リクエスト成功！求めていた情報をお届けします
- **201 Created**：新しいリソースを作成しました

#### 3xx（リダイレクト）
- **301 Moved Permanently**：このURLは引っ越しました。新しいURLに行ってください
- **302 Found**：一時的に別のURLに行ってください
- **304 Not Modified**：前回取得した時から変更ないよ（キャッシュを使っていいよ）

#### 4xx（クライアントエラー）
- **400 Bad Request**：リクエストの形式が間違ってます
- **401 Unauthorized**：認証が必要です（ログインしてね）
- **403 Forbidden**：アクセス権限がありません（入っちゃダメ）
- **404 Not Found**：お探しのページは見つかりません（存在しない）

#### 5xx（サーバーエラー）
- **500 Internal Server Error**：サーバー内部でエラーが発生しました
- **503 Service Unavailable**：サービスが一時的に利用できません（混雑中/メンテナンス中）

## 4. メッセージヘッダー

HTTPのリクエストとレスポンスには、本文とは別に「ヘッダー」と呼ばれる追加情報が含まれます。

### 主なリクエストヘッダー

- **User-Agent**：「私はこういうブラウザです」と伝える
  ```
  User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
  ```

- **Accept**：「こういう形式のデータが欲しいです」と伝える
  ```
  Accept: text/html, application/xml, image/*
  ```

- **Cookie**：以前サーバーからもらったCookieを送り返す
  ```
  Cookie: session_id=abc123; preference=darkmode
  ```

- **Authorization**：認証情報を送る
  ```
  Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
  ```

### 主なレスポンスヘッダー

- **Content-Type**：「これはこういう種類のデータですよ」と伝える
  ```
  Content-Type: text/html; charset=UTF-8
  ```

- **Set-Cookie**：ブラウザに保存してほしいCookieを送る
  ```
  Set-Cookie: session_id=abc123; Path=/; Expires=Wed, 09 Jun 2021 10:18:14 GMT
  ```

- **Cache-Control**：キャッシュの方法を指定
  ```
  Cache-Control: max-age=3600, public
  ```

- **Content-Length**：コンテンツのサイズを示す
  ```
  Content-Length: 48576
  ```

## 実際のHTTPリクエスト・レスポンス例

### リクエストの例（Google検索）

```
GET /search?q=HTTP通信基本 HTTP/1.1
Host: www.google.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
Accept: text/html,application/xhtml+xml,application/xml
Accept-Language: ja,en-US;q=0.7,en;q=0.3
Cookie: NID=511=qIX2s9jJQwsUb9hMm9gHXhsC5WFtK7lkxc4CJP0;
Connection: keep-alive
```

### レスポンスの例

```
HTTP/1.1 200 OK
Date: Mon, 08 Apr 2024 12:34:56 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 45238
Cache-Control: private, max-age=0
Set-Cookie: 1P_JAR=2024-04-08-12; expires=Wed, 08-May-2024 12:34:56 GMT; path=/; domain=.google.com

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>HTTP通信基本 - Google 検索</title>
    ...
```

## まとめ

HTTP通信は基本的には：

1. **ブラウザがサーバーにリクエスト**
   - GETやPOSTなどのメソッドを使う
   - 様々なヘッダー情報を含む

2. **サーバーがブラウザにレスポンス**
   - ステータスコードで結果を伝える
   - ヘッダー情報と実際のコンテンツを返す

この仕組みがWebサイトを閲覧したり、オンラインショッピングをしたり、SNSに投稿したりする際の基盤となっています。

HTTP通信は一見複雑ですが、基本は「お願い」と「応答」のシンプルなやりとりです。基本情報技術者試験でも頻出の内容なので、ぜひ理解しておきましょう！

# 基本情報技術者試験によく出題されるHTTP問題集
以下に基本情報技術者試験でよく出題されるHTTP通信に関する問題を5つ挙げます。実際の試験対策に役立ててください。
### 問題1: HTTPメソッド
Webフォームからユーザー情報を送信する際に、URLにパラメータを表示させたくない場合に適切なHTTPメソッドはどれか。

GET
POST
PUT
HEAD

<details>
<summary>解答</summary>
<strong>2. POST</strong><br>
POSTメソッドでは送信データが本文（Body）に含まれ、URLには表示されません。GETメソッドではURLのクエリパラメータとして情報が送信されるため、URLに表示されてしまいます。
</details>

### 問題2: HTTPステータスコード
ユーザーがアクセスしようとしたWebページが存在しない場合、サーバから返されるHTTPステータスコードとして適切なものはどれか。

200
302
404
500

<details>
<summary>解答</summary>
<strong>3. 404</strong><br>
404 Not Foundは、リクエストされたリソースがサーバー上に存在しないことを示すステータスコードです。
</details>

### 問題3: セキュアな通信
HTTPSプロトコルの説明として正しいものはどれか。

HTTPSはHTTPよりも高速な通信が可能なプロトコルである
HTTPSはHTTPにセキュリティ機能を追加したプロトコルである
HTTPSは画像や動画を効率的に転送するために開発されたプロトコルである
HTTPSはIPv6に対応するために開発されたHTTPの後継プロトコルである

<details>
<summary>解答</summary>
<strong>2. HTTPSはHTTPにセキュリティ機能を追加したプロトコルである</strong><br>
HTTPSはHTTPにSSL/TLSによる暗号化層を追加したプロトコルで、通信内容の盗聴や改ざんを防ぐために使用されます。
</details>

### 問題4: HTTPヘッダー
Webサーバーがクライアントに対して「このコンテンツはHTMLです」と伝えるために使用するHTTPレスポンスヘッダーはどれか。

User-Agent
Content-Type
Authorization
Cookie

<details>
<summary>解答</summary>
<strong>2. Content-Type</strong><br>
Content-Typeヘッダーは、送信されるデータの種類（MIMEタイプ）を指定します。HTMLの場合は通常「text/html」となります。
</details>

### 問題5: キャッシュ制御
Webブラウザに対して「このコンテンツはキャッシュせずに毎回サーバーから取得すること」を指示するHTTPヘッダーとして適切なものはどれか。

Cache-Control: no-cache, no-store
Expires: 0
Content-Length: 0
Connection: keep-alive

<details>
<summary>解答</summary>
<strong>1. Cache-Control: no-cache, no-store</strong><br>
Cache-Controlヘッダーの「no-cache, no-store」は、ブラウザにコンテンツをキャッシュしないように指示し、毎回サーバーから新しいコンテンツを取得させます。
</details>