何の情報?
RFC 7239でHTTPのForwardedヘッダを調べた時の記録。
日本語訳したわけではなく、情報をかいつまんで整理したもの。
Introductoin
近年、HTTPで通信する際にproxyが通信経路に含まれることが多い。
proxyが通信経路に含まれると、HTTPサーバに到達するパケットの送信元IPアドレスは、実際のリクエストを送信したクラアントではなく、proxyのものになってしまう。
そのため、以下のような機能をHTTPサーバで利用しようとした際に、期待通り動作しない可能性がある。
- アクセス分析などを目的とした統計情報収集
- IPアドレスによるアクセス制御
- 不正利用の検出
Forwardedヘッダは、proxyによって隠蔽されたクライアントIPなどの情報を得るために利用される。同様の情報を提供する下記の非標準ヘッダもあるが、Forwardedヘッダはこれらのヘッダ情報が統合されたイメージ。
X-Forwarded-For
X-Forwarded-By
X-Forwarded-Proto
Forwarded HTTP Header Field
ForwardedヘッダはOPTIONALなHTTPリクエストヘッダで、forwarding proxyやreverse proxyに適用する。セキュリティを考慮して、デフォルトはOFFにすべき。
Forwardedヘッダには例えば以下の情報が含まれる。
- リクエストの送信元IPアドレス
- proxy上でリクエストを受け付けるIPアドレス
- HTTP, HTTPSなどのスキーム
通信経路上にproxyが複数含まれる場合、各proxyで上記の情報を追加、削除することができる(必須ではない)。
ForwardedヘッダのABNF syntax
Forwarded = 1#forwarded-element
forwarded-element = [ forwarded-pair ] *( ";" [ forwarded-pair ] )
forwarded-pair = token "=" value
value = token / quoted-string
token = <Defined in [RFC7230], Section 3.2.6>
quoted-string = <Defined in [RFC7230], Section 3.2.6>
- 複数のforwarded-pairを含めることがでる
- 各forwarded-pairは
;
区切り - forwarded-pairはtokenとvalueを
=
で連結したもの - パラメータ名(token)は大文字/小文字の区別なし
パラメータ名には下記4種類を指定可能。
パラメータ名 | 概要 |
---|---|
by | リクエストを受信したproxyのinterface |
for | proxyにリクエストを送信したノード |
host | proxyへのリクエストに含まれるHohtヘッダ値 |
proto | リクエストのプロトコル(http, httpsなど) |
Forwardedヘッダ例
Forwarded: for="_gazonk"
Forwarded: For="[2001:db8:cafe::17]:4711"
Forwarded: for=192.0.2.60;proto=http;by=203.0.113.43
Forwarded: for=192.0.2.43, for=198.51.100.17
proxyがForwardedヘッダ値を追加する場合、下記いずれかの方法がある。
- 新規ヘッダ:HTTPヘッダの末尾に新たなForwardedヘッダを挿入
- 同一ヘッダ:HTTPヘッダ内の最後のForwardedヘッダに
,
区切りで値を挿入
前述の通り、proxyはForwardedヘッダを削除することが可能。
また、Forwardedヘッダが複数存在する場合は、更新対象のForwardedヘッダを正確に選択しなければならない。
補足
Viaヘッダとの違い
Viaヘッダも似たような用途で利用されるが、Viaヘッダはproxy自体の情報を格納するためのものであり、クライアント情報は含まれない。