コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

HTTPヘッダのX-Forwarded-Forとは何か、そしてForwaredとは何かをざっくりまとめる

そもそもXがつくヘッダはどんなものなのか

別の記事でざっくり書いたのでそちらを参照

shinkufencer.hateblo.jp

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もどちらもヘッダに付与するものなので偽装は容易にできる。そのため、インターネットに接する面ではあまり効力を発揮しない。そのため現在では内部ネットワークでのリクエストのやりとり経路を確認するためのヘッダとして使う、というのが最近の使い方のスタンダードだと思われる。

参考リンク

今回調査をしようと思ったきっかけのツイート