技術(非IT系)

HTTPリクエストヘッダーの種類と使い方は?設定方法も解説!(Accept:User-Agent:Authorization:Content-Typeなど)

当サイトでは記事内に広告を含みます

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の開発が実現できるでしょう。