HTTPヘッダーの一覧と使用方法

目次

プロキシサーバで利用するヘッダー

プロキシサーバでは、通信を仲介する関係で通信元や通信相手に向けて伝達すべき内容をHTTPヘッダーに付与して連携します。

ヘッダー追加イメージ
これらのヘッダーは通信の正常性や追跡性などにおいて重要な役割を持っています。

プロキシで一般的に利用されるHTTPヘッダーを一覧化します。

ヘッダー種別 目的 推奨ヘッダー 説明
クライアント情報の転送 プロキシ経由時に元のクライアント情報を保持・転送する • Forwarded
RFC 7239で標準化された正式なヘッダー。クライアントのIPアドレス、プロトコル、ホスト名などの情報を構造化された形式で転送。

Forwarded: for=192.0.2.43, proto=https, host=example.com
プロキシの存在表示 HTTP標準に基づき、リクエストがプロキシを経由したことを示す • Via HTTP/1.1の正式な標準ヘッダー。リクエスト/レスポンスが経由したプロキシの情報を記録。

Via: 1.1 proxy-server (Apache/2.4.1), 1.1 edge-cache
プロキシ認証 フォワードプロキシへのクライアント認証に使用 • Proxy-Authorization HTTP標準のヘッダー。クライアントがプロキシに対して認証情報を提供するために使用。

Proxy-Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
プロキシ認証チャレンジ プロキシがクライアントに認証を要求する • Proxy-Authenticate HTTP標準のヘッダー。プロキシがクライアントに認証方法を提示するために使用。

Proxy-Authenticate: Basic realm="Proxy Server Authentication"
キャッシュ制御 コンテンツのキャッシュ動作を指定・制御する • Cache-Control
• Age
• Warning
• Cache-Status
HTTP標準のキャッシュ関連ヘッダー。Cache-Controlはキャッシュの動作方法、Ageはキャッシュ内での経過時間、Warningは潜在的な問題の警告、Cache-Statusは新しい標準でキャッシュ処理の詳細を提供。

Cache-Control: public, max-age=86400
Age: 2140
Cache-Status: ExampleCache; hit; ttl=60
コンテンツ変換・最適化 プロキシによるコンテンツの変更や最適化を通知 • Content-Encoding
• Transfer-Encoding
• TE
• Accept-Encoding
コンテンツ圧縮や変換に関するHTTP標準ヘッダー。Content-EncodingとTransfer-Encodingは適用された圧縮や変換方式を示し、TEとAccept-Encodingはサポートされる変換方式を通知。

Content-Encoding: gzip
Transfer-Encoding: chunked
セキュリティ関連 Webセキュリティポリシーを強化し脆弱性対策を行う • Content-Security-Policy
• Strict-Transport-Security
• X-Content-Type-Options
• X-Frame-Options
プロキシが追加または管理するセキュリティヘッダー。コンテンツセキュリティポリシーの定義、HTTPS強制、MIME-type偽装防止、フレーム挿入制御などを行う。

Content-Security-Policy: default-src 'self'
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
接続管理 HTTP接続の振る舞いを制御する • Connection
• Keep-Alive
HTTP接続の維持や終了を制御するヘッダー。ConnectionはHTTP/1.1での接続管理方法を指定し、Keep-Aliveは持続的接続のパラメータを定義。

Connection: keep-alive
Keep-Alive: timeout=5, max=100
条件付きリクエスト キャッシュ効率化やリソース検証に使用 • If-Modified-Since
• If-None-Match
• ETag
• Last-Modified
リソースの変更検出と条件付き転送に関するヘッダー。プロキシが効率的にキャッシュを管理し、不要なデータ転送を回避するための仕組みを提供。

If-Modified-Since: Wed, 21 Oct 2020 07:28:00 GMT
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
クロスオリジン通信 クロスオリジンリソース共有を制御する • Access-Control-Allow-Origin
• Access-Control-Allow-Methods
• Access-Control-Allow-Headers
• Access-Control-Expose-Headers
主にリバースプロキシがCORS(Cross-Origin Resource Sharing)ポリシーを管理・実装するためのヘッダー。異なるオリジン間でのリソース共有を安全に行う仕組みを提供。

Access-Control-Allow-Origin: https://trusted-site.com
Access-Control-Allow-Methods: GET, POST, OPTIONS
監視・トレーシング 分散システムでの要求追跡やパフォーマンス分析 • Traceparent
• Tracestate
• Server-Timing
現代的なマイクロサービス環境でのリクエスト追跡と性能測定のためのヘッダー。Traceparent/TracestateはW3C Trace Context標準の一部で、分散トレーシングを可能にし、Server-Timingはパフォーマンス指標を提供。

Traceparent: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01
Server-Timing: cache;desc="Cache lookup";dur=23.2

非推奨だがよく使われるヘッダー

上の表は、もしプロキシサーバを設計した経験がある人がいれば、違和感を覚える人もいるかもしれません。

プロキシサーバでよく使われるヘッダーが軒並み入っておりません。

実は、今までプロキシサーバの世界で標準的に使われていたヘッダーは非推奨ヘッダーと言われており正式には推奨されていません。

以下、よく使われるが非推奨となっているヘッダーの一覧も表にしておきます。

非推奨ヘッダー 問題点 現代的な代替手段
Proxy-Connection 非標準ヘッダーであり、HTTP/1.1以降では正式には推奨されていません。元々はHTTP/1.0の制限を回避するために導入されましたが、近代的なプロキシやクライアントでは不要です。 Connection ヘッダーを使用するべきです。HTTP/1.1では、標準のConnectionヘッダーがプロキシ対応となっており、Connection: keep-aliveのように使用します。HTTP/2以降では接続管理が自動化されているため、このヘッダー自体が通常不要です。
X-Forwarded-For
X-Forwarded-Proto
X-Forwarded-Host
広く使われているものの、正式なHTTP標準ではなく、「X-」プレフィックス付きのヘッダーはRFC 6648によって非推奨とされています。 RFC 7239で標準化された Forwarded ヘッダーの使用が推奨されています。

Forwarded: for=192.0.2.60;proto=https;by=203.0.113.43;host=example.com

このヘッダーは複数のパラメータを一つのヘッダーにまとめ、より構造化された方法で情報を伝達します。ただし、実際には旧来のX-Forwardedシリーズがまだ広く使用されています。
X-XSS-Protection クロスサイトスクリプティング(XSS)から保護するためのブラウザ組み込み機能を制御するために使用されていましたが、最新のブラウザではこの機能自体が廃止または非推奨となっています。 代わりに Content-Security-Policy ヘッダーを使用するべきです。これはより包括的で効果的なセキュリティ制御を提供します:

Content-Security-Policy: script-src 'self'
X-Cache
X-Cache-Hit
X-Cache-Lookup
これらは非標準であり、プロキシベンダーごとに異なる形式や意味を持つことがあります。デバッグには役立ちますが、標準的な意味はありません。 標準的な代替はありませんが、Cache-Status ヘッダー(RFC 9211で定義)が新しい標準として登場しています:

Cache-Status: OriginCache; hit; ttl=1100; key=example.com

ただし、まだ広く採用されていません。

ヘッダーの使用方法

プロキシサーバで一般的に使用されるヘッダーの一覧と使用方法、設定例を記載します。

この内容については、一度に覚える必要はないと思います。

必要に応じて、参照しに来てください。

Forwarded ヘッダー

使用方法: クライアント接続に関する情報をバックエンドサーバーに転送します。

Forwarded: for=192.0.2.60;proto=https;by=203.0.113.43;host=example.com

設定例 (Nginx):

proxy_set_header Forwarded "for=\$remote_addr;proto=\$scheme;host=\$host;by=\$server_addr";

設定例 (Apache):

RequestHeader set Forwarded "for=%{REMOTE_ADDR}s;proto=%{REQUEST_SCHEME}s;host=%{HTTP_HOST}s"

Via ヘッダー

使用方法: リクエスト/レスポンスが経由したプロトコルとプロキシの情報を表示します。

Via: 1.1 proxy-name (Product/Version), 1.1 edge-gateway

設定例 (Squid):

via on

設定例 (Nginx - 省略する場合):

proxy_hide_header Via;

Proxy-Authorization ヘッダー

使用方法: クライアントがプロキシサーバーに認証情報を提供します。

Proxy-Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

クライアント設定例 (curl):

curl -x proxy.example.com:3128 -U username:password https://target-site.com/

Proxy-Authenticate ヘッダー

使用方法: プロキシが認証を要求する際に使用し、認証方式を指定します。

Proxy-Authenticate: Basic realm="Corporate Proxy"

設定例 (Squid):

auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
auth_param basic realm Proxy Authentication Required
acl authenticated proxy_auth REQUIRED
http_access allow authenticated

Cache-Control ヘッダー

使用方法: リソースのキャッシュ動作を制御します。

Cache-Control: public, max-age=86400
Cache-Control: private, no-cache

設定例 (Nginx):

expires 1d;  # Cache-Control: max-age=86400 を設定
proxy_cache_bypass \$http_cache_control;  # "no-cache" を尊重

設定例 (Varnish):

sub vcl_backend_response {
  set beresp.ttl = 1d;  # 1日間キャッシュ
}

Age ヘッダー

使用方法: レスポンスがキャッシュ内に存在している秒数を示します。

Age: 3600  # 1時間キャッシュ内に保存されている

プロキシが通常自動的に追加し、手動設定は不要です。

Cache-Status ヘッダー

使用方法: キャッシュ処理の詳細情報を提供します (RFC 9211)。

Cache-Status: ExampleCache; hit; ttl=60; key=uri; detail=1234

設定例 (高度なプロキシやCDNで設定可能):

# 多くの場合、自動的に追加されます

Content-Encoding ヘッダー

使用方法: レスポンスに適用された圧縮アルゴリズムを示します。

Content-Encoding: gzip

設定例 (Nginx):

gzip on;
gzip_types text/plain text/css application/javascript;

設定例 (Apache):

AddOutputFilterByType DEFLATE text/html text/plain text/css

Content-Security-Policy ヘッダー

使用方法: サイトのコンテンツソースポリシーを定義し、XSSなどの攻撃を防止します。

Content-Security-Policy: default-src 'self'; script-src 'self' trusted-scripts.com;

設定例 (Nginx):

add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://trusted-scripts.com;";

設定例 (Apache):

Header always set Content-Security-Policy "default-src 'self'; script-src 'self' https://trusted-scripts.com;"

Strict-Transport-Security ヘッダー

使用方法: サイトがHTTPS接続のみを使用するようブラウザに指示します。

Strict-Transport-Security: max-age=31536000; includeSubDomains

設定例 (Nginx):

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

X-Content-Type-Options ヘッダー

使用方法: MIMEタイプのスニッフィング防止によりセキュリティ向上。

X-Content-Type-Options: nosniff

設定例 (Nginx):

add_header X-Content-Type-Options nosniff;

X-Frame-Options ヘッダー

使用方法: サイトがフレーム内に表示されることを制限し、クリックジャッキングを防止。

X-Frame-Options: SAMEORIGIN

設定例 (Nginx):

add_header X-Frame-Options SAMEORIGIN;

Connection ヘッダー

使用方法: HTTP接続の管理方法を指定します。

Connection: keep-alive
Connection: close

設定例 (Nginx):

keepalive_timeout 65;  # keep-aliveの設定
proxy_set_header Connection "";  # HTTP/1.1での接続管理

ETag と If-None-Match ヘッダー

使用方法: リソースの変更検出とキャッシュ検証に使用。

ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"

設定例 (Nginx):

etag on;  # ETAGを有効化

Last-Modified と If-Modified-Since ヘッダー

使用方法: リソースの変更日時に基づくキャッシュ検証。

Last-Modified: Wed, 21 Oct 2020 07:28:00 GMT
If-Modified-Since: Wed, 21 Oct 2020 07:28:00 GMT

Access-Control-Allow-Origin ヘッダー

使用方法: クロスオリジンリクエストを許可するドメインを指定。

Access-Control-Allow-Origin: https://trusted-site.com
Access-Control-Allow-Origin: *  # すべてのドメインを許可(注意して使用)

設定例 (Nginx):

add_header Access-Control-Allow-Origin https://trusted-site.com;
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
add_header Access-Control-Allow-Headers "DNT,X-CustomHeader,Keep-Alive,User-Agent";

Traceparent ヘッダー

使用方法: 分散トレーシングのためのリクエスト識別子。

Traceparent: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01

設定例 (カスタム実装またはトレーシングツール使用):

# 多くの場合、OpenTelemetryなどのライブラリを使用
proxy_set_header Traceparent \$opentelemetry_trace_id;

Server-Timing ヘッダー

使用方法: サーバーサイドの処理時間に関する情報を提供。

Server-Timing: cache;desc="Cache lookup";dur=23.2

設定例 (カスタム処理):

add_header Server-Timing "edge;dur=\$upstream_response_time";

まとめ

プロキシサーバにおけるHTTPヘッダーの処理方法を解説しました。

これらのヘッダーは利用者やアクセス先のサーバ等へ必要な情報を連携するために必要なものとなります。

セキュリティに関わるものも多くあります。

正直、全てのヘッダーを頭に入れておくのは難しいと思いますが、要件に応じて必要なヘッダーを取捨選択する必要があることは頭に入れておいて下さい。

そこさえ覚えていれば、後はヘッダーの一覧を見ながら設計できれば十分だと思います。