ウェブエンジニア問題集

ヘッダーとCookie — リクエスト/レスポンスに含まれる情報

HTTPリクエストとレスポンスは、ボディ(本文)だけでなく ヘッダー という付加情報を持っています。認証トークン、コンテンツの形式、キャッシュの制御、Cookieなど、HTTP通信の重要な制御情報はすべてヘッダーでやりとりされます。

この章では、主要なHTTPヘッダーの役割と、Web開発で特に重要な Cookie の仕組みを整理します。

学習者学習者

ログイン状態ってどうやって覚えてるの?Cookie って聞くけど、仕組みがピンとこない…。


HTTPメッセージの構造

リクエストもレスポンスも、スタートライン + ヘッダー + 空行 + ボディ という共通の構造です。

POST /api/users HTTP/1.1          ← スタートライン(メソッド、パス、バージョン)
Host: api.example.com             ← ヘッダー(複数行)
Content-Type: application/json
Authorization: Bearer eyJhbG...
                                  ← 空行(ヘッダーとボディの区切り)
{"name": "Alice"}                 ← ボディ

レスポンスも同様です。

HTTP/1.1 200 OK                   ← スタートライン(バージョン、ステータスコード)
Content-Type: application/json
Set-Cookie: session=abc123

{"id": 1, "name": "Alice"}

よく使うリクエストヘッダー

計画を立てている男性のイラスト
ヘッダー役割
Hostリクエスト先のホスト名api.example.com
Content-Typeボディのデータ形式application/json
Authorization認証情報Bearer eyJhbG...
Accept受け取りたいレスポンスの形式application/json
User-Agentクライアントの情報ブラウザ名やバージョン
Cookie保存済みCookieの送信session=abc123

Content-Typeの重要性

Content-Type はサーバーが「ボディをどう解釈するか」を決めるヘッダーです。これが間違っていると、サーバーがボディを正しくパースできません。

// JSON形式で送る場合
Content-Type: application/json

// フォームデータで送る場合
Content-Type: application/x-www-form-urlencoded

// ファイルアップロードの場合
Content-Type: multipart/form-data

よく使うレスポンスヘッダー

ヘッダー役割
Content-Typeレスポンスのデータ形式application/json; charset=utf-8
Set-CookieCookieの設定session=abc123; HttpOnly; Secure
Cache-Controlキャッシュの制御max-age=3600
Locationリダイレクト先/api/users/42
Access-Control-Allow-OriginCORS許可https://example.com

キャッシュ制御

Cache-Control ヘッダーは、ブラウザや中間プロキシに「このレスポンスをどの程度キャッシュしていいか」を指示します。

// 1時間キャッシュしてよい
Cache-Control: max-age=3600

// キャッシュしてはいけない
Cache-Control: no-store

// キャッシュしてよいが、使う前に再検証すること
Cache-Control: no-cache
ディレクティブ意味
max-age=NN秒間キャッシュしてよい
no-store一切キャッシュしない
no-cacheキャッシュするが毎回再検証
privateブラウザのみキャッシュ可(CDNは不可)
publicCDNを含めキャッシュ可

Cookieの仕組み

Cookie は、サーバーがブラウザに「この値を覚えておいて、次のリクエストで送り返して」と依頼する仕組みです。HTTPは本来ステートレス(状態を持たない)ですが、Cookieによって「ログイン状態」のような状態管理が可能になります。

Cookieの流れ

  1. サーバーがレスポンスに Set-Cookie ヘッダーを含める
  2. ブラウザがその値を保存する
  3. 以降、同じドメインへのリクエストに Cookie ヘッダーとして自動送信する

Cookieのセキュリティ属性

Cookieには付加属性があり、セキュリティ上の制御に使います。

Set-Cookie: session=abc123; HttpOnly; Secure; SameSite=Lax; Path=/; Max-Age=86400
属性意味設定しないリスク
HttpOnlyJavaScriptからアクセスできないXSSでCookieを盗まれる
SecureHTTPS接続でのみ送信平文HTTP経由で盗聴される
SameSiteクロスサイトリクエストでの送信を制御CSRF攻撃を受けやすい
Path指定パス以下でのみ送信不要な範囲にCookieが飛ぶ
Max-Age有効期限(秒数)ブラウザ終了時に消える

SameSiteの3つの値

挙動
Strict他サイトからのリクエストにはCookieを送らない
Lax他サイトからのGETリクエスト(リンククリック)には送る
None常に送る(Secure 属性が必須)

CookieとlocalStorageの使い分け

ブラウザでデータを保存する方法はCookieだけではありません。よく比較されるのが localStorage です。

CookielocalStorage
サーバーへの送信自動で送信される送信されない
容量約4KB約5MB
有効期限設定可能永続(手動削除まで)
JavaScriptHttpOnlyで保護可常にアクセス可能
用途セッション管理、認証UI設定、一時データ

セッション管理にはCookie(HttpOnly)、UIの状態保持にはlocalStorage、というのが一般的な使い分けです。


まとめ

  • HTTPメッセージは スタートライン + ヘッダー + ボディ で構成される
  • Content-Type はボディの解釈方法を伝える重要なヘッダー
  • Cache-Control でキャッシュの有無と期間を制御する。no-cacheno-store の意味は違う
  • Cookie はサーバーがブラウザに状態を保持させる仕組み。セッション管理の基盤
  • セッションCookieには HttpOnly + Secure + SameSite を必ず設定する

次の章では、Web APIの設計パターンとして最も普及している REST API の考え方と命名規則を見ていきます。