1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

第6章|今さら学ぶ「HTTP基礎」

1
Last updated at Posted at 2026-02-19

第6章|今さら学ぶ「HTTP基礎」

📚 シリーズ目次はこちら → 「今さら学ぶ」シリーズ — はじめに
🗺️ KnowledgeNoteの設計を確認 → 設計マップ

この章でわかること

  • GET / POST / PATCH / DELETE の役割と使い分け
  • ステータスコードの意味 — 200, 302, 404, 500 は何を伝えているか
  • CookieとSessionの仕組みと違い
  • HTTPがわかると、Railsのルーティングやコントローラの理解が深まる理由

🏠 たとえ話で掴む「HTTP」

HTTP (HyperText Transfer Protocol)は、ブラウザとサーバが会話するための「共通語」です。

これを 図書館の窓口業務 にたとえて整理します。

図書館に行くと、窓口にはいくつかの業務があります。「本を借りたい」「新しい本を寄贈したい」「借りた本の情報を変えたい」「本を返却したい」。それぞれ対応する手続きが決まっています。

図書館の窓口 HTTPメソッド やること
「この本を見せてください」 GET データを取得する(見るだけ)
「新しい本を寄贈します」 POST 新しいデータを作成する
「この本の情報を修正してください」 PATCH 既存データの一部を更新する
「この本を除籍してください」 DELETE データを削除する

図書館の窓口で「見せてください」と言ったのに勝手に本を処分されたら困ります。HTTPも同じで、 メソッドごとに「やっていいこと」が決まっています

そして窓口の係員(サーバ)は、手続きが終わると結果を伝えます。「はい、この本です(200 OK)」「その本はありません(404 Not Found)」「内部でトラブルが起きました(500 Internal Server Error)」。これが ステータスコード です。


HTTPとは何か — 技術的な定義

プロトコルとしてのHTTP

HTTPは アプリケーション層のプロトコル(通信規約) です。ブラウザ(クライアント)がサーバにリクエストを送り、サーバがレスポンスを返す「リクエスト/レスポンス型」の通信モデルで設計されています。

Webの発明者ティム・バーナーズ=リーが1991年に最初のバージョンを設計し、現在広く使われているのはHTTP/1.1とHTTP/2です。URLを入力してページが表示されるまでの通信は、すべてこのHTTPの仕組みで動いています。

HTTPの3つの重要な特徴

① ステートレス(状態を持たない):サーバは1回のリクエスト/レスポンスが終わると、その通信の記憶を保持しません。2回目のリクエストは1回目と無関係に処理されます。この制約がCookieやSessionが必要になる理由です。

② テキストベース(HTTP/1.1まで):リクエストもレスポンスもテキスト形式で構成されます。そのため、開発者ツールやcurlコマンドで中身を直接確認できます。

③ メソッドで操作の種類を指定する:GET(取得)、POST(作成)、PATCH(更新)、DELETE(削除)のように、リクエストに「何をしたいか」を明示します。これがRailsのRESTfulルーティングの土台になっています。


📬 HTTPメソッド — 4つの窓口業務

GET — 「見せてください」

GET は「データをください」というリクエストです。ブラウザでURLを入力したり、リンクをクリックしたりするとGETリクエストが送られます。

GET /articles/1 HTTP/1.1
Host: knowledgenote.example.com

GETの重要なルールは、 サーバのデータを変更しない こと。何回アクセスしても同じ結果が返ってくるべきです(これを 冪等性(べきとうせい) と言います)。

# routes.rb — GETリクエストの定義
resources :articles, only: [:index, :show]
# GET /articles     → articles#index(記事一覧を見る)
# GET /articles/1   → articles#show(記事1件を見る)

POST — 「新しく作ってください」

POST は「新しいデータを作ってください」というリクエストです。フォームの送信ボタンを押したときなどに使われます。

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

article[title]=Ruby入門&article[body]=Rubyとは...

POSTは リクエストのボディ(本体)にデータを含めて送信 します。GETとの大きな違いは、URLにデータが表示されないことです。

# routes.rb — POSTリクエストの定義
resources :articles, only: [:create]
# POST /articles   → articles#create(記事を新規作成する)

PATCH — 「一部を修正してください」

PATCH は「既存データの一部を更新してください」というリクエストです。

PATCH /articles/1 HTTP/1.1
Host: knowledgenote.example.com

article[title]=Ruby入門(改訂版)

💡 PUT と PATCH の違い: PUTは「全体を置き換える」、PATCHは「一部を修正する」という意味です。Railsでは PATCH が標準で使われます。

DELETE — 「削除してください」

DELETE は「このデータを削除してください」というリクエストです。

DELETE /articles/1 HTTP/1.1
Host: knowledgenote.example.com

KnowledgeNoteでの4メソッドの対応

HTTPメソッド URL Railsのアクション やること
GET /articles articles#index 記事一覧を表示
GET /articles/1 articles#show 記事1件を表示
GET /articles/new articles#new 作成フォームを表示
POST /articles articles#create 記事を作成
GET /articles/1/edit articles#edit 編集フォームを表示
PATCH /articles/1 articles#update 記事を更新
DELETE /articles/1 articles#destroy 記事を削除

この7つのパターンが、Railsの resources で自動生成されるルートの全体像です(→ 第10章で詳しく扱います)。


📊 ステータスコード — サーバからの返事

HTTPリクエストを受け取ったサーバは、必ず ステータスコード という3桁の数字を返します。これは窓口の係員からの返事です。

覚えておくべきコード

コード 意味 図書館のたとえ Railsでの場面
200 OK 成功 「はい、この本です」 ページの正常表示
201 Created 作成成功 「寄贈ありがとうございます。登録しました」 API で新規作成成功時
302 Found リダイレクト 「その本は3階に移動しました。そちらへどうぞ」 redirect_to
400 Bad Request リクエストが不正 「申請書の書き方が間違っています」 パラメータ不正
401 Unauthorized 認証が必要 「利用者カードを見せてください」 未ログイン
403 Forbidden アクセス禁止 「この本は閲覧制限があります」 権限不足
404 Not Found 見つからない 「その本は当館にはありません」 存在しないURL
422 Unprocessable Content 処理不能 「申請内容に不備があります」 バリデーションエラー
500 Internal Server Error サーバエラー 「すみません、こちらのシステムに障害が…」 アプリのバグ

ステータスコードの法則

百の位で大まかな意味がわかります。

百の位 意味 ひとこと
1xx 情報 「処理中です」(あまり見かけない)
2xx 成功 「うまくいきました」
3xx リダイレクト 「別の場所に移動してください」
4xx クライアントエラー 「あなた(ブラウザ)側の問題です」
5xx サーバエラー 「こちら(サーバ)側の問題です」

Railsでのステータスコード指定

Railsでは、ステータスコードをシンボルで指定できます。

# コントローラでの使用例
def create
  @article = current_user.articles.build(article_params)

  if @article.save
    redirect_to @article, notice: "記事を投稿しました"
    # ↑ 302リダイレクトが自動で返される
  else
    render :new, status: :unprocessable_entity
    # ↑ 422を返す(バリデーションエラー)
    # ※ シンボル名は旧称(Unprocessable Entity)由来。正式名は RFC 9110 で Unprocessable Content に改称済み
  end
end
# よく使うシンボル一覧
status: :ok                      # 200
status: :created                 # 201
status: :no_content              # 204
status: :found                   # 302(redirect_toのデフォルト)
status: :not_found               # 404
status: :unprocessable_entity    # 422
status: :internal_server_error   # 500

🍪 CookieとSession — 名札と受付名簿

HTTPには大きな特徴があります。それは ステートレス(状態を持たない) ということです。

サーバは1回のリクエストが終わると、「さっきのリクエストを誰が送ったか」を忘れてしまいます。図書館のたとえでいうと、窓口の係員が10秒ごとに記憶喪失になるようなものです。

しかし実際のWebアプリでは「ログイン状態を維持する」「カートの中身を覚える」など、ユーザーの状態を保持する必要があります。そこで使われるのが CookieSession です。

Cookie — 利用者が持つ「名札」

Cookie(クッキー) は、サーバがブラウザに渡す小さなデータです。利用者が首から下げる名札のようなものです。

【仕組み】
1. 初回アクセス → サーバが「名札」を渡す(Set-Cookie ヘッダー)
2. 2回目以降 → ブラウザが毎回「名札」を見せる(Cookie ヘッダー)
3. サーバは名札を見て「ああ、さっきの人ね」と認識する
# サーバからブラウザへ(レスポンス)
Set-Cookie: user_name=tanaka; Path=/; HttpOnly

# ブラウザからサーバへ(次回のリクエスト)
Cookie: user_name=tanaka

Cookieの特徴は、 ブラウザ(利用者側)に保存される ことです。そのため、利用者が中身を見たり改ざんしたりできます。パスワードなどの秘密情報を直接入れてはいけません。WebのセキュリティリスクとCSRFについては(→ 第20章で詳しく扱います)。

Session — サーバ側の「受付名簿」

Session(セッション) は、サーバ側にデータを保存する仕組みです。図書館の受付カウンターの裏にある名簿のようなものです。

【仕組み】
1. ログイン成功 → サーバが受付名簿に記録し、「整理番号」だけをCookieで渡す
2. 2回目以降 → ブラウザは「整理番号」だけ見せる
3. サーバは整理番号で名簿を引き、「この人はログイン済みの田中さんだ」と認識する

Cookieとの違いは、 実際のデータはサーバ側に保管されている こと。ブラウザに渡すのは「セッションID」という整理番号だけです。

CookieとSessionの使い分け

Cookie(名札) Session(受付名簿)
データの保存場所 ブラウザ(利用者側) サーバ側
改ざんリスク あり(利用者が変更可能) 低い(サーバで管理)
データ量の制限 4KB程度 サーバの容量次第
使いどころ 言語設定、テーマの好み ログイン状態、ユーザーID
# Railsでのセッション操作
class SessionsController < ApplicationController
  def create
    user = User.find_by(email_address: params[:email_address])

    if user&.authenticate(params[:password])
      session[:user_id] = user.id   # セッションにユーザーIDを保存
      redirect_to root_path, notice: "ログインしました"
    else
      flash.now[:alert] = "メールアドレスまたはパスワードが間違っています"
      render :new, status: :unprocessable_entity
    end
  end

  def destroy
    session.delete(:user_id)        # セッションからユーザーIDを削除
    redirect_to root_path, notice: "ログアウトしました"
  end
end

💡 Rails 8 のセッション管理
Rails 8 の組み込み認証では、セッション情報を sessions テーブルでDB管理します。これにより「どの端末からログインしているか」を一覧でき、個別のセッションを無効化(ログアウト)することもできます(→ 第21章で詳しく扱います)。


🔄 リクエストとレスポンスの全体像

第0章で学んだ「宅配ピザ」の流れを、HTTP用語で改めて整理します。

ブラウザ                              サーバ
┌──────────┐                    ┌──────────────┐
│          │  ── リクエスト ──>  │              │
│          │  GET /articles/1   │  ルーティング │
│          │  Cookie: session=  │  ↓            │
│          │  abc123            │  コントローラ │
│          │                    │  ↕(C↔M)     │
│          │                    │  モデル+DB   │
│          │                    │  ↓(C経由)   │
│          │  <── レスポンス ──  │  ビュー       │
│          │  HTTP/1.1 200 OK   │              │
│          │  Content-Type:     │              │
│          │  text/html         │              │
│          │                    │              │
│          │  <html>...</html>  │              │
└──────────┘                    └──────────────┘

リクエストの中身

GET /articles/1 HTTP/1.1          ← リクエストライン(メソッド + URL + HTTPバージョン)
Host: knowledgenote.example.com   ← ヘッダー(宛先)
Accept: text/html                 ← ヘッダー(どの形式で返してほしいか)
Cookie: _session_id=abc123        ← ヘッダー(セッション情報)

レスポンスの中身

HTTP/1.1 200 OK                   ← ステータスライン(結果)
Content-Type: text/html           ← ヘッダー(返すデータの種類)
Set-Cookie: _session_id=abc123    ← ヘッダー(Cookieを設定)

<html>                            ← ボディ(実際のデータ)
  <body>
    <h1>Ruby入門</h1>
    ...
  </body>
</html>

🛠️ KnowledgeNoteでの具体例

KnowledgeNoteの「いいねボタン」を押したときのHTTP通信を追ってみます。

1. ユーザーが「❤️ いいね」ボタンを押す

2. ブラウザがリクエストを送る
   POST /likes HTTP/1.1
   Cookie: _session_id=abc123
   article_id=1

3. サーバ(Rails)が処理する
   - ルーティング → LikesController#create
   - セッションから current_user を特定
   - Like.create!(user: current_user, likeable: article)

4. サーバがレスポンスを返す
   HTTP/1.1 200 OK
   Content-Type: text/vnd.turbo-stream.html
   (Turbo Streamsでいいねボタンを更新するHTMLの断片)

5. ブラウザが画面を部分更新(ページ全体の再読み込みなし)

HTTPの基礎がわかっていると、Turbo Streams(→ 第19章)のような仕組みも「HTTPリクエスト/レスポンスの応用」として理解できます。


💼 面接で聞かれたら?

Q:GETとPOSTの違いを説明してください。

「GETはサーバからデータを取得するリクエストで、データを変更しません。パラメータはURLに含まれます。POSTは新しいデータを作成するリクエストで、データはリクエストボディに含めて送信します。GETは何度実行しても同じ結果を返すべきですが、POSTは実行のたびに新しいデータが作られるので、結果が変わります。」

深掘りされたら:

  • 「ステータスコード404と500の違いは?」→ 404はクライアント側の問題で、リクエストしたリソースが存在しない状態。500はサーバ側の問題で、アプリのバグや障害が原因。404は正常な動作(存在しないURLへのアクセス)だが、500は異常事態。
  • 「CookieとSessionの違いは?」→ Cookieはブラウザ側にデータを保存する仕組み。Sessionはサーバ側にデータを保存し、ブラウザにはセッションIDだけを渡す。秘密情報はSessionで管理する。

🔗 もっと深く知りたい人へ(1次情報リンク)


まとめ

  • ✅ HTTPはブラウザとサーバの「共通語」。GET(見る)/ POST(作る)/ PATCH(直す)/ DELETE(消す)の4メソッドが基本
  • ✅ ステータスコードはサーバからの返事。2xx=成功、3xx=リダイレクト、4xx=クライアントエラー、5xx=サーバエラー
  • ✅ HTTPはステートレス(状態を持たない)。状態の保持にはCookieとSessionを使う
  • ✅ Cookieはブラウザ側に保存(名札)、Sessionはサーバ側に保存(受付名簿)
  • ✅ HTTPの基礎がわかると、Railsのルーティング・コントローラ・Turbo Streamsの理解が深まる

📚 シリーズ目次:「今さら学ぶ」シリーズ — はじめに

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?