深入瞭解 X-Forwarded-For (XFF):HTTP 標頭與其重要性

avatar-img
發佈於軟體開發
更新於 發佈於 閱讀時間約 6 分鐘

什麼是 X-Forwarded-For (XFF)? 🌐🕵️‍♂️

X-Forwarded-For (XFF) 是一個 HTTP 請求標頭 (Header)。它最主要的目的,是當你的網路請求經過代理伺服器 (Proxy)負載平衡器 (Load Balancer) 之後,能夠讓後端的 Web 伺服器或應用程式仍然知道原始客戶端(也就是發出請求的人)的真實 IP 位址

你可以把 XFF 想像成一個**「包裹上的附加標籤」。當你的請求這個「包裹」經過層層轉運(Proxy/Load Balancer)時,每一層轉運站都會在上面加註自己經手的資訊,但最重要的是,會特別標註「這個包裹最初是從哪裡來的」。

為什麼需要 XFF? 🤔

我們之前談過 Proxy負載平衡器 會作為「中間人」,它們會接收你的請求,然後以它們自己的 IP 位址去向後端伺服器發出請求。

這就產生了一個問題:

  • 後端伺服器 (Backend Server) 收到的請求,其來源 IP 看到的都是 Proxy 或負載平衡器的 IP,而不是真正發出請求的客戶端(例如你的瀏覽器)的 IP。

這樣會導致什麼問題?

  1. 日誌記錄不完整 📜: 後端伺服器的日誌會記錄所有請求來自負載平衡器或 Proxy 的 IP,導致無法追溯實際的用戶來源。這對故障排除、安全審計和業務分析都是個問題。
  2. 安全風險 🛡️:
    • 如果要阻擋惡意 IP,你只能阻擋負載平衡器的 IP,而這會阻擋所有經過這個負載平衡器的流量,包括合法用戶。
    • 無法針對特定用戶 IP 進行地理位置限制或安全策略判斷。
    • 無法有效識別來自單一惡意用戶的攻擊(如暴力破解)。
  3. 流量分析與業務洞察 📈: 無法知道你的網站訪問者主要來自哪些地區、哪些用戶行為異常等。

XFF 標頭就是為了解決這個問題而誕生的!


XFF 如何運作? 🔄

當客戶端的請求經過代理伺服器或負載平衡器時:

  1. 客戶端發出請求。
  2. 第一個代理/負載平衡器 (Proxy/LB1) 接收請求:
    • 它會新增一個 X-Forwarded-For 標頭,其值就是原始客戶端的 IP 位址
    • 如果這個標頭已經存在(因為之前有其他代理經手),它會把原始客戶端 IP 放在最前面,然後用逗號 , 分隔,後面跟著自己的 IP
    • 範例:X-Forwarded-For: <客戶端IP>
  3. 第二個代理/負載平衡器 (Proxy/LB2) 接收請求:
    • 它看到 X-Forwarded-For 標頭已經存在。
    • 它會把自己的 IP 位址追加到現有值的後面,用逗號 , 分隔。
    • 範例:X-Forwarded-For: <客戶端IP>, <Proxy/LB1 的 IP>
  4. 第三個代理/負載平衡器 (Proxy/LB3) (如果有) 接收請求:
    • 再次將自己的 IP 追加到後面。
    • 範例:X-Forwarded-For: <客戶端IP>, <Proxy/LB1 的 IP>, <Proxy/LB2 的 IP>
  5. 後端 Web 伺服器接收請求:
    • 後端伺服器(例如 Nginx, Apache, 或你的應用程式)接收到請求後,會檢查這個 X-Forwarded-For 標頭。
    • 最左邊的 IP 位址通常就是原始客戶端(最終用戶)的真實 IP 位址。後面的 IP 位址則是它經過的各個代理伺服器 IP。

範例:

假設你的真實 IP 是 1.1.1.1,你的請求經過了兩個負載平衡器:

  • LB1 的 IP 是 2.2.2.2
  • LB2 的 IP 是 3.3.3.3 (這是最靠近你後端伺服器的負載平衡器)

後端伺服器收到的 X-Forwarded-For 標頭可能就是: X-Forwarded-For: 1.1.1.1, 2.2.2.2, 3.3.3.3

後端伺服器或應用程式就會解析這個標頭,並讀取最左邊的 1.1.1.1 作為你的真實 IP。


XFF 的重要性 🌟

  • 精確日誌記錄: 確保後端伺服器日誌能記錄真實用戶的 IP,方便流量分析、用戶行為追蹤。
  • 安全策略實施: 許多安全規則(如地理位置阻擋、速率限制、IP 黑白名單)都需要基於真實的用戶 IP 來判斷。XFF 使得這些策略能夠在應用程式層級有效實施。
  • 數據分析: 企業可以根據真實用戶的地理位置、使用模式進行更精準的數據分析和業務決策。
  • 防止濫用: 識別並阻擋來自單一惡意 IP 的攻擊,例如暴力破解或惡意爬蟲。

XFF 的限制與替代方案 ⚠️

  • 可偽造性: XFF 標頭是客戶端或最前端的代理可以偽造的。惡意用戶可以自己設定這個標頭來欺騙後端。因此,後端伺服器必須信任最靠近自己的、受控的負載平衡器或 Proxy 所提供的 XFF 資訊,並通常只取最左邊或第二個 IP(取決於你的網路架構層次)。
  • 替代標頭: 有時也會看到類似的 HTTP 標頭,例如:
    • X-Real-IP:通常只包含一個 IP,通常是最靠近後端伺服器的代理的 IP。
    • Forwarded:這是 XFF 的標準化版本,在 HTTP/1.1 (RFC 7239) 中定義,提供更詳細的資訊。

總之,XFF 是一個關鍵的 HTTP 標頭,它在現代網路架構(特別是使用負載平衡器和代理的環境)中扮演著傳遞原始客戶端 IP 的重要角色,對於日誌記錄、安全和數據分析至關重要。



留言
avatar-img
留言分享你的想法!
avatar-img
hello maple
4會員
81內容數
各種工作及生活中的小小紀錄
hello maple的其他內容
2025/07/28
本文深入淺出地介紹代理伺服器 (Proxy) 的運作原理、常見用途、類型以及與 VPN 的差異。此外,更詳細說明公司內部的 Proxy List 如何應用於安全控制、效能優化和網路管理與監控,以及它在企業網路中的重要性。
Thumbnail
2025/07/28
本文深入淺出地介紹代理伺服器 (Proxy) 的運作原理、常見用途、類型以及與 VPN 的差異。此外,更詳細說明公司內部的 Proxy List 如何應用於安全控制、效能優化和網路管理與監控,以及它在企業網路中的重要性。
Thumbnail
2025/07/28
Nginx 是一個高效能的網頁伺服器、反向代理伺服器、負載平衡器和 HTTP 快取,以其高性能、高併發處理能力和低資源消耗而聞名。本文詳細介紹了 Nginx 的主要功能、應用場景和核心特性,並說明瞭 Nginx 的優點和其無法取代的領域。
2025/07/28
Nginx 是一個高效能的網頁伺服器、反向代理伺服器、負載平衡器和 HTTP 快取,以其高性能、高併發處理能力和低資源消耗而聞名。本文詳細介紹了 Nginx 的主要功能、應用場景和核心特性,並說明瞭 Nginx 的優點和其無法取代的領域。
2025/07/28
你可以把這個主題想像成:不再是蓋一棟巨大的獨棟別墅(傳統單體應用),而是建造許多獨立的小公寓(微服務),每間公寓都被打包在一個標準化的移動箱子裡(容器),然後這些箱子可以在任何地方快速地部署和管理。 1. Docker 🐳 什麼是 Docker? Docker 是一個開源平台,它能讓你輕鬆地開
2025/07/28
你可以把這個主題想像成:不再是蓋一棟巨大的獨棟別墅(傳統單體應用),而是建造許多獨立的小公寓(微服務),每間公寓都被打包在一個標準化的移動箱子裡(容器),然後這些箱子可以在任何地方快速地部署和管理。 1. Docker 🐳 什麼是 Docker? Docker 是一個開源平台,它能讓你輕鬆地開
看更多
你可能也想看
Thumbnail
※ 什麼是路由? 當我們說「路由」時,可能是在談論路由器(實體設備),也可能是在談論路由(選擇路徑的過程),或者是在談論路徑(資料封包的傳輸路徑)。 路由器 (Router):這是一種實體設備,負責將資料封包 (Packet) 從一個網路傳送到另一個網路。它的工作方式類似於交通指揮,確保資料封包
Thumbnail
※ 什麼是路由? 當我們說「路由」時,可能是在談論路由器(實體設備),也可能是在談論路由(選擇路徑的過程),或者是在談論路徑(資料封包的傳輸路徑)。 路由器 (Router):這是一種實體設備,負責將資料封包 (Packet) 從一個網路傳送到另一個網路。它的工作方式類似於交通指揮,確保資料封包
Thumbnail
一、什麼是Web Service?   簡單說就是「服務」的概念,人與人間、電腦與電腦間都是一樣的,一個是人與人的一來一回交流,媒介是語言中文,另一個則是個人電腦與伺服器的交流,媒介是HTTP/Internet,那麼有了媒介,就會有共同格式才能做
Thumbnail
一、什麼是Web Service?   簡單說就是「服務」的概念,人與人間、電腦與電腦間都是一樣的,一個是人與人的一來一回交流,媒介是語言中文,另一個則是個人電腦與伺服器的交流,媒介是HTTP/Internet,那麼有了媒介,就會有共同格式才能做
Thumbnail
之前在【什麼是網路請求(HTTP response)】筆記裡有提到,網路請求遇到 CORS 跨域問題,在開發時可以透過 vite 的反向代理來解決,那麼什麼是反向代理,有反向代理的話是不是也有正向代理呢?
Thumbnail
之前在【什麼是網路請求(HTTP response)】筆記裡有提到,網路請求遇到 CORS 跨域問題,在開發時可以透過 vite 的反向代理來解決,那麼什麼是反向代理,有反向代理的話是不是也有正向代理呢?
Thumbnail
在開發前後端分離架構時,使用兩個不同網域所遇到跨域請求問題。特別是在POST請求時行為差異大,揭示了「簡單請求」與「預檢請求」的關鍵差異。簡單請求不需預檢,但application/json會觸發預檢請求,需透過特定設定解決。分享這篇文章希望幫助開發者有效處理跨域問題。
Thumbnail
在開發前後端分離架構時,使用兩個不同網域所遇到跨域請求問題。特別是在POST請求時行為差異大,揭示了「簡單請求」與「預檢請求」的關鍵差異。簡單請求不需預檢,但application/json會觸發預檢請求,需透過特定設定解決。分享這篇文章希望幫助開發者有效處理跨域問題。
Thumbnail
Request內容 package main import ( "fmt" "log" "net/http" "strings" ) func request(w http.ResponseWriter, r *http.Request) { //這些資訊是輸出到伺服器端的列印訊息
Thumbnail
Request內容 package main import ( "fmt" "log" "net/http" "strings" ) func request(w http.ResponseWriter, r *http.Request) { //這些資訊是輸出到伺服器端的列印訊息
Thumbnail
Accept:用戶端能夠接收的內容類型。 Accept: text/plain, text/html Accept-Charset:瀏覽器可以接受的字元編碼集。 Accept-Charset: utf8 Accept-Encoding:指定瀏覽器可以支援的web伺服器返回內容壓縮編碼
Thumbnail
Accept:用戶端能夠接收的內容類型。 Accept: text/plain, text/html Accept-Charset:瀏覽器可以接受的字元編碼集。 Accept-Charset: utf8 Accept-Encoding:指定瀏覽器可以支援的web伺服器返回內容壓縮編碼
Thumbnail
ServeMux ServeMux是一個包含映射的結構,映射會將URL映射到對應的伺服器。 DefaultServeMux DefaultServeMux是net/HTTP中預設的多工器,是ServeMux的實例。多工器要根據URL的請求導向到不同的伺服器。DefaultServeMux是
Thumbnail
ServeMux ServeMux是一個包含映射的結構,映射會將URL映射到對應的伺服器。 DefaultServeMux DefaultServeMux是net/HTTP中預設的多工器,是ServeMux的實例。多工器要根據URL的請求導向到不同的伺服器。DefaultServeMux是
Thumbnail
HTTP伺服器端 package main import ( "net/http" ) type Refer struct { handler http.Handler refer string } //實現中介軟體邏輯​ func (this *Refer) ServeHTTP(
Thumbnail
HTTP伺服器端 package main import ( "net/http" ) type Refer struct { handler http.Handler refer string } //實現中介軟體邏輯​ func (this *Refer) ServeHTTP(
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News