ウェブエンジニア問題集
第4章

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

10
この章の目次開く

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、というのが一般的な使い分けです。


DevToolsでヘッダーとCookieを確認する

リクエスト・レスポンスヘッダーの確認

NetworkタブでリクエストをクリックするとHeadersタブが開きます。ここで Request Headers(送信側)と Response Headers(受信側)の両方を確認できます。

実務で特にチェックする項目:

確認項目見るべきヘッダーよくある問題
認証トークンが送れているかAuthorizationトークンの付け忘れ、有効期限切れ
データ形式が正しいかContent-Typeapplication/json の付け忘れ
CORSが通っているかAccess-Control-Allow-Originオリジンの不一致
キャッシュが効いているかCache-Control, ETag古いデータが表示される

Cookieの確認

Chrome DevToolsの Application タブ → Cookies で、現在のドメインに保存されているCookieの一覧と、各セキュリティ属性を確認できます。

確認すべきポイント:

  • HttpOnly が付いているか(JavaScriptからアクセスできないようになっているか)
  • Secure が付いているか(HTTPS限定で送信されるか)
  • SameSite の値が適切か(CSRF対策が有効か)
  • Expires / Max-Age が適切か(セッション切れのタイミング)

curlでヘッダーを確認する

ブラウザを介さずにヘッダーを確認したいときは、curl -v が便利です。

# -v でリクエスト/レスポンスヘッダーを表示
curl -v https://api.example.com/users
 
# 特定のヘッダーを付けてリクエスト
curl -H "Authorization: Bearer YOUR_TOKEN" \
     -H "Content-Type: application/json" \
     https://api.example.com/users
 
# レスポンスヘッダーだけ確認(ボディは不要)
curl -I https://api.example.com/users
bash

curl -v の出力で > がリクエスト、< がレスポンスのヘッダーです。APIの動作確認やデバッグで頻繁に使います。


まとめ

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

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