要約
- X-Forwarded系ヘッダーの役割はプロキシーサーバーを挟む通信でもクライアントの情報にアクセスすることを可能にすること
- X-Forwarded-Hostヘッダー:クライアントのホストを特定する
- X-Forwarded-Forヘッダー:クライアントのIPアドレスを特定する
- X-Forwarded-Protoヘッダー:クライアントのプロトコルを特定する
背景
nextjsのサーバーアクションでエラーが起きていました。
原因がX-Forwarded-Hostヘッダーの未設定であることが分かりました。
X-Forwarded-Hostヘッダーについて調査しました。
x-forwarded-hostheader with valuelocalhost:3002does not matchoriginheader with value example.com from a forwarded Server Actions request. Aborting the action.
X-Forwarded-Hostヘッダーとは
X-Forwarded-Host:example.com
リクエスト元のクライアントのホストを特定するための事実上の標準となっているリクエストヘッダーのことです。
X-Forwarded-Hostヘッダーが役に立つ場面
これが役立つのはクライアント→プロキシーサーバー→サーバーのような、プロキシーを挟んだ通信の時です。
プロキシーサーバーを挟むとリクエストヘッダーのHostを上書きすることが可能なため、サーバーはリクエスト元のクライアントのホストを特定するのが困難になります。
X-Forwarded-Hostヘッダーにリクエスト元のクライアントのホストを指定することでプロキシーサーバーを挟んだ通信でもリクエスト元のクライアントのホストを特定することができます。
X-Forwarded-Forヘッダーについて
実は以前X-Forwarded-Forヘッダーを勉強しました。
X-Forwarded-Forヘッダーとは以下のような記法で、プロキシーサーバーを挟む通信でもクライアントIPのIPアドレスを特定することに使用されます。
記法はクライアントIPを左端に書き、中継するサーバーのIPを後ろに追記していきます。
X-Forwarded-For: クライアントIP, 中継機器1, 中継機器2
基本的に中継するたびに前のサーバーのIPをカンマで区切りながら追記する
次にX-Forwarded系のヘッダーがもう一つあったので紹介します。
X-Forwarded-Protoヘッダーについて
プロキシーサーバーを挟む通信でクライアントのプロトコルを特定するために事実上の標準となっているヘッダーのことです。
X-Forwarded-Proto: https
考察 X-Forwarded系ヘッダーの役割について
中継サーバー、プロキシーサーバーを挟む通信でもクライアントの情報にアクセスすることを可能にするためのヘッダーであることが分かりました。
- X-Forwarded-Host
- X-Forwarded-For
- X-Forwarded-Proto
まとめ
- X-Forwarded系ヘッダーの役割はプロキシーサーバーを挟む通信でもクライアントの情報にアクセスすることを可能にすること
- X-Forwarded-Hostヘッダー:クライアントのホストを特定する
- X-Forwarded-Forヘッダー:クライアントのIPアドレスを特定する
- X-Forwarded-Protoヘッダー:クライアントのプロトコルを特定する
参考
- https://developer.mozilla.org/ja/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host
- https://developer.mozilla.org/ja/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto
- https://speakerdeck.com/yamatai1212/x-forwarded-forhetudawei-zhuang-nifu-kenaiclientipnojue-mefang-with-gin
- https://github.com/vercel/next.js/blob/100253c450f67eba6b9a0d936c1eedbe3a8446cf/packages/next/src/server/app-render/action-handler.ts#L635-L642
- https://www.netassist.ne.jp/techblog/32879/
- https://zenn.dev/villa_ak99/articles/316b6bfa103b44
- https://tech.synapse.jp/entry/2024/03/18/170000
- https://qiita.com/naka_kyon/items/8532cea02675180cb878
- https://developer.mozilla.org/ja/docs/Web/HTTP/Reference/Headers/Forwarded
- https://pkg.go.dev/github.com/gin-gonic/gin#Engine.SetTrustedProxies
- https://gin-gonic.com/ja/docs/deployment/
- https://pkg.go.dev/github.com/gin-gonic/gin#Context.ClientIP
- https://christina04.hatenablog.com/entry/2016/10/25/190000
- https://wa3.i-3-i.info/word110942.html
- https://wa3.i-3-i.info/word172.html