WebブラウザやAPIクライアントがサーバーと通信するとき、そのHTTPリクエストには多数のリクエストヘッダーが付加されています。
Accept・User-Agent・Authorization・Content-Typeなど、それぞれのヘッダーは異なる役割を持ち、適切に設定することでWebサービスやAPIの動作が正しく機能します。
本記事では、HTTPリクエストヘッダーの主な種類とそれぞれの使い方・設定方法について詳しく解説します。
フロントエンド開発・バックエンド開発・API設計など幅広い場面で役立つ知識ですので、ぜひ最後まで読んでみてください。
HTTPリクエストヘッダーは目的別に分類して理解することが重要(結論)
それではまず、HTTPリクエストヘッダーの全体像と分類方法について解説していきます。
HTTPリクエストヘッダーは数多く存在しますが、目的別に分類することで体系的に理解しやすくなります。
| 分類 | 主なヘッダー | 役割 |
|---|---|---|
| コンテンツ交渉 | Accept・Accept-Language・Accept-Encoding | 受け入れ可能な形式を伝える |
| 認証・認可 | Authorization・Cookie・Proxy-Authorization | 認証情報を伝える |
| クライアント情報 | User-Agent・Referer・Origin | クライアントの情報を伝える |
| ボディ情報 | Content-Type・Content-Length・Content-Encoding | リクエストボディの属性を伝える |
| 接続制御 | Connection・Keep-Alive・Host | 接続の制御方法を指定する |
| キャッシュ制御 | Cache-Control・If-Modified-Since・If-None-Match | キャッシュの動作を制御する |
HTTPリクエストヘッダーを正しく理解することは、Web開発・API設計・セキュリティ設計の基礎となります。フロントエンドでfetch APIを使う際も、バックエンドでAPI認証を実装する際も、必ずリクエストヘッダーの知識が必要になります。
コンテンツネゴシエーション関連ヘッダー
コンテンツネゴシエーションとは、クライアントとサーバーが通信可能なコンテンツの種類・言語・エンコーディングを調整する仕組みです。
Acceptヘッダーはクライアントが受け入れ可能なMIMEタイプを指定します。
# ブラウザが送る典型的なAcceptヘッダー
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
# REST APIクライアントが送るAcceptヘッダー
Accept: application/json
# Accept-Language:受け入れ可能な言語を指定
Accept-Language: ja,en-US;q=0.9,en;q=0.8
# Accept-Encoding:受け入れ可能な圧縮形式を指定
Accept-Encoding: gzip, deflate, br
q=の値(Quality Value)は0〜1の優先度を表し、指定しない場合はデフォルトで1.0(最高優先度)となります。
Accept-Encodingでbrを指定するとBrotli圧縮が使われ、gzipより高い圧縮率でデータ転送量を削減できます。
認証関連のリクエストヘッダーの詳細
続いては、認証・認可に関わるリクエストヘッダーの詳細と使い方を確認していきます。
現代のWebサービス・APIにとって認証ヘッダーの正しい実装は最も重要な要件の一つです。
Authorizationヘッダーの各認証スキーム
Authorizationヘッダーにはいくつかの認証スキームがあります。
【Bearer認証(JWT・OAuthトークン)】
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9…
→ OAuth 2.0・JWTを使ったAPIに最も広く使われる
【Basic認証】
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
→ ユーザー名:パスワードをBase64エンコードしたもの
→ Base64は暗号化でないため必ずHTTPS必須
【Digest認証】
Authorization: Digest username=”user”, realm=”example.com”, nonce=”abc123″…
→ Basic認証より安全だが現代ではあまり使われない
【APIキー認証(慣習的な形式)】
Authorization: ApiKey your_api_key_here
X-API-Key: your_api_key_here ← カスタムヘッダーを使う場合もある
Bearer認証はRFC 6750で定義されており、OAuth 2.0と組み合わせてAPIの標準的な認証方式となっています。
Basic認証はパスワードがBase64エンコードされているだけで暗号化ではないため、HTTPS通信でのみ使用することが絶対条件です。
CookieヘッダーとセッションIDの送信
Cookieヘッダーはブラウザが自動的に付加するヘッダーで、同一ドメインに設定されたすべての有効なCookieが含まれます。
Cookie: session_id=s%3AkV8xN2r9; csrf_token=abc123; user_lang=ja
Cookieには以下の属性でセキュリティを強化できます。
HttpOnly属性はJavaScriptからCookieにアクセスできなくしてXSS攻撃対策になります。
Secure属性はHTTPS通信でのみCookieを送信させる設定です。
SameSite属性はクロスサイトリクエストでのCookie送信を制限しCSRF対策になります。
クライアント情報・ボディ関連ヘッダーの詳細
続いては、クライアント情報とリクエストボディに関連する重要なヘッダーについて確認していきます。
Refererヘッダー
Refererヘッダーはリクエストを行った直前のページのURLを伝えるフィールドです。
Referer: https://www.example.com/page1
サーバーはRefererを使ってどこから来たユーザーかを把握したり、画像などのリソースへの直接アクセスを制限(ホットリンク防止)したりできます。
なお「Referer」はRFC策定時のスペルミスで正しくは「Referrer」ですが、後方互換性のためそのままの表記が使われています。
Content-LengthとTransfer-Encoding
Content-Lengthはリクエストボディのバイト数を指定するヘッダーです。
Content-Length: 1234
# POSTリクエストでJSONを送る場合の組み合わせ例
POST /api/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
Content-Length: 42
Authorization: Bearer token123
{“name”: “Tanaka”, “email”: “t@example.com”}
Transfer-Encoding: chunkedを使う場合はContent-Lengthを省略でき、データをチャンク(断片)に分けて送信できます。
大きなファイルのアップロードやストリーミング送信に有用です。
If-Modified-SinceとIf-None-Match(条件付きリクエスト)
条件付きリクエストヘッダーはキャッシュの効率化に使われます。
# If-Modified-Since:指定日時以降に変更があった場合のみ取得
If-Modified-Since: Tue, 21 May 2024 07:00:00 GMT
# If-None-Match:ETagが変わっていた場合のみ取得
If-None-Match: “abc123etag”
コンテンツが変更されていない場合、サーバーは304 Not Modifiedを返してボディを省略します。
これにより不要なデータ転送を防いでWebサイトの表示を高速化できます。
実践的なHTTPリクエストヘッダーの設定方法
続いては、様々な開発環境・ツールでのHTTPリクエストヘッダーの設定方法を確認していきます。
curlコマンドでのヘッダー設定
curlはHTTPリクエストをコマンドラインから送るツールで、APIのテストによく使われます。
# -Hオプションでヘッダーを指定
curl -X POST https://api.example.com/data \
-H “Content-Type: application/json” \
-H “Authorization: Bearer your_token_here” \
-H “Accept: application/json” \
-d ‘{“key”: “value”}’
# レスポンスヘッダーも表示する
curl -v https://api.example.com/data
# ヘッダーのみ表示(ボディなし)
curl -I https://www.example.com
Postmanでのヘッダー設定
PostmanはAPI開発・テストに広く使われるGUIツールです。
「Headers」タブでキーと値のペアを追加するだけで任意のリクエストヘッダーを設定できます。
「Authorization」タブではBearer Token・Basic Auth・OAuth 2.0などの認証設定をGUIで簡単に行えます。
PostmanのCollection機能を使うと共通のヘッダー(Authorizationなど)をすべてのリクエストに自動付加でき、API開発・テストの効率が大幅に向上します。
Axiosでのデフォルトヘッダー設定
import axios from ‘axios’;
// すべてのリクエストに共通ヘッダーを設定
axios.defaults.headers.common[‘Authorization’] = ‘Bearer ‘ + token;
axios.defaults.headers.post[‘Content-Type’] = ‘application/json’;
// 特定のリクエストにのみヘッダーを設定
axios.get(‘https://api.example.com/data’, {
headers: {
’X-Custom-Header’: ‘custom-value’,
’Accept’: ‘application/json’
}
});
Axiosのdefaultsを使うことで、すべてのリクエストに共通のAuthorizationヘッダーを自動付加できるため、APIクライアントの実装が大幅に簡潔になります。
まとめ
HTTPリクエストヘッダーはコンテンツネゴシエーション・認証・クライアント情報・ボディ属性・接続制御・キャッシュ制御など目的別に分類して理解することが重要です。
Accept・User-Agent・Authorization・Content-Type・Cookieなど主要なヘッダーの役割と使い方を押さえることがWeb開発・API開発の基礎となります。
curl・Postman・Axios・fetch APIなど様々なツールでリクエストヘッダーを自由に設定できるため、実際に手を動かして試すことで理解が深まるでしょう。
セキュリティ面ではAuthorizationヘッダーやCookieは必ずHTTPS通信で送ること・サーバー側でヘッダー内容を無条件に信頼しないことが基本ルールです。
リクエストヘッダーを正しく理解・活用することで、より安全で効率的なWebアプリケーション・APIの開発が実現できるでしょう。