そもそもXがつくヘッダはどんなものなのか
別の記事でざっくり書いたのでそちらを参照
X-Forwarded-Forとは
クライアントからレスポンス戻る際にロードバランサーなどの仲介する某かを通る場合がある。そのような場合は純粋に送信元IPを基準に考えると、もともとのクライアントのIPがわからなくなってしまう。
そこでHTTPヘッダに元のクライアントIPの情報を乗せるときに使われるヘッダが X-Forwarded-For
である。
使われ方
フォーマットと意義
クライアントのIPから始まり、あとはクライアント起点で経由したプロキシのIPをカンマ区切りで追記していく形式
X-Forwarded-For: クライアントのIP, プロキシのIPその1, プロキシのIPその2 ...
こう記述することで、クライアントのIPと経由したプロキシのIPが順番も含めてわかる。
X-Forwarded-Forに増えるタイミング
プロキシにあたるものを一つしか挟まない場合は、クライアントのIPのみしか記録されない。そのため クライアントIPが記載されるのはX-Forwarded-For
と勘違いされがち。
X-Forwarded-Forの歴史
これはRFCで標準化された仕様ではなく、Squidのキャシング/プロキシサーバで使われ始めて、それがデファクトスタンダードになったものだとされている。(ここに関しては原初が何の仕様だったのかまではたどることができなかった)
X-Real-IPとの違い
似たような拡張仕様に X-Real-IP
ヘッダが存在するが、仕様としてはあまり他での利用が見かけられないがOracleのドキュメントには以下のような記述がある。
クライアントのIPアドレスを指定します。 ロード・バランシング・サービスの場合、クライアントは最後のリモート・ピアです。 - HTTP "X-"ヘッダー
X-Real−IPは純粋にクライアントのIPのみを記載する目的のヘッダの様子。
置き換えとなるRFCの仕様 Fowarded
デファクトスタンダードだった仕様に対し、RFCで明確に定められた仕様が Forwarded
RFC 7239 - Forwarded HTTP Extension
X-Forwarded-For
と同列で語られるデファクトスタンダード仕様である X-Forwarded-Host
(クライアントのホスト名), X-Forwarded-Proto
(クライアントが利用しているHTTPのプロトコル,http or https) も格納できるフォーマットとなっている。
ヘッダなので偽装もできる
X-Forwarded-ForもForwardedもどちらもヘッダに付与するものなので偽装は容易にできる。そのため、インターネットに接する面ではあまり効力を発揮しない。そのため現在では内部ネットワークでのリクエストのやりとり経路を確認するためのヘッダとして使う、というのが最近の使い方のスタンダードだと思われる。
参考リンク
- X-Forwarded-For - HTTP | MDN
- 図でわかるX-Forwarded-For(XFF)とは | なまけものノこえだめ
- http — HTTP_CLIENT_IPとHTTP_X_FORWARDED_FORの違いは何ですか?
- X-Forwarded-Forヘッダが無い場合SrcIPをコピーする(Apache) - Qiita
- 多段nginxでもX-Forwarded-ForできちんとバックエンドにクライアントIPアドレスを伝える | せろとにんぱわー.
- nginxでX-Forwarded-Forの値に`$proxy\_add\_x\_forwarded_for`を安易に使わない方が良い | せろとにんぱわー.
今回調査をしようと思ったきっかけのツイート
192.168.7.21 #ちょうぜつエンジニアめもりーちゃん pic.twitter.com/cUShFjwVzT
— ひさてるさん (@tanakahisateru) 2020年4月14日