Neuigkeiten von trion.
Immer gut informiert.

Client IP-Adresse ermitteln in Spring Boot Anwendungen

Die IP-Adresse eines Clients stellt für Web-APIs einen wichtigen Datenpunkt dar. Sie wird für Anwendungsfälle wie der Personalisierung von Diensten, Protokollierungen und auch für Sicherheitsaspekte wie z.B. Rate Limiting benötigt. In diesem Artikel soll es daher darum gehen, wie sich die tatsächliche IP-Adresse eines Clients in einer Spring Boot Anwendung zuverlässig und sicher ermitteln lässt.

Zugriff über HttpServletRequest

Eingehende Request werden in einer Spring Boot Anwendung in der Regel über ein Objekt, das das Interface HttpServletRequest implementiert, bereitgestellt. In Filtern oder Controller-Methoden hat man direkt Zugriff auf dieses Objekt. Alternativ kann auch über den RequestContextHolder darauf zugegriffen werden.

Die Methode getRemoteAddr() liefert gemäß Dokumentation, die IP-Adresse des Clients oder des letzten Proxies der den Request gesendet hat.

Controller-Endpunkt zum Abfragen der eigenen IP-Adresse
@GetMapping("/ip")
public String getIp(HttpServletRequest request) {
    return request.getRemoteAddr();
}

Ein Aufruf mit cURL zeigt das erwartete Ergebnis.

$ curl http://localhost:8080/ip
127.0.0.1

Umgang mit Proxies

In der Praxis rufen Clients jedoch häufig nicht direkt eine Spring Boot Anwendung auf. Vielmehr werden Requests zunächst von einem Reverse-Proxy wie nginx oder Traefik verarbeitet. Diese leiten den Request dann stellvertretend für den Client an die Anwendung weiter.

Auf Netzwerkebene ändert sich dadurch der Absender der Pakete und für unsere Anwendung sieht es zunächst so aus, als würde der gesamte Traffic vom Proxy stammen. Damit diese Information nicht verloren geht, setzen Proxies in der Regel bestimmte HTTP Header. Durch das Auswerten dieser Header kann eine Anwendung ermitteln, von welchem Client ein Request tatsächlich gesendet wurde.

Beispiel für HTTP Header von einem Proxy
X-Forwarded-For: 80.245.156.34

Häufig kommt dazu X-Forwarded-For zum Einsatz. Dieser Header kann auch mehrere IPs enthalten, falls auf dem Weg zwischen Client und Anwendung mehrere Proxies involviert waren.

Spring Boot Konfiguration

Spring Boot kann über eine Einstellung angewiesen werden, diesen Header automatisch für jeden Request auszuwerten. Dazu dient das Property server.forward-headers-strategy. Wird diese auf native gesetzt, wird der interne Webserver (hier Tomcat) angewiesen, die Auswertung durchzuführen.

Ruft man mit dieser Einstellung den Endpunkt von oben auf, kann folgendes Verhalten beobachtet werden:

$ curl http://localhost:8080/ip -H "X-Forwarded-For: 1.1.1.1"
1.1.1.1

Der Header wird also berücksichtigt und getRemoteAddr() gibt wieder die IP-Adresse des Clients zurück. Sollte der Proxy einen anderen Header verwenden, kann dies über server.tomcat.remoteip.remote-ip-header konfiguriert werden.

Security-Aspekte: IP Spoofing verhindern

Ist eine Anwendung sowohl über einen Proxy als auch direkt von einem Client erreichbar, ist zusätzliche Konfiguration für ein sicheres Setup notwendig. Ansonsten könnte jeder Client, bei einem direkten Aufruf, seine IP-Adresse beliebig ändern, indem er den passenden Header setzt.

Um diese Situation zu verhindern, kann angegeben werden, bei welchen Hosts es sich um vertrauenswürdige Proxies handelt. Nur wenn ein Request von dort stammt, wird der X-Forwarded-For Header ausgewertet.

Tomcat unterscheidet zusätzlich zwischen internal-proxies und trusted-proxies. Beides kann über Properties mittels eines regulären Ausdrucks konfiguriert werden. Der einzige wesentlich Unterschied besteht darin, dass Tomcat interne Proxies nicht in der Aufzählung der durchlaufenden Proxies (Header X-Forwarded-By) aufgeführt. Wie die Verarbeitung innerhalb von Tomcat genau abläuft, ist hier dokumentiert.

Konfiguration der vertrauenswürdigen Proxies
server:
  forward-headers-strategy: native
  tomcat:
    remoteip:
      internal-proxies: "127\\.0\\.0\\.\\d{1,3}"
      trusted-proxies: "..."

Für die Konfiguration oben ist unter anderem die Localhost-IP 127.0.0.1 als interner Proxy gesetzt. Bei einem lokalen Request via cURL wird der Header daher ausgewertet:

$ curl http://localhost:8080/ip -H "X-Forwarded-For: 1.1.1.1"
1.1.1.1

Mit internal-proxies: "127\\.0\\.0\\.\\2" wäre 127.0.0.1 kein vertrauenswürdiger Proxy mehr. Somit würde der Header auch nicht mehr ausgewertet:

$ curl http://localhost:8080/ip -H "X-Forwarded-For: 1.1.1.1"
127.0.0.1

PROXY Protocol als Alternative zu Headern

Das PROXY Protocol von HAProxy Technologies stellt einen weiteren Weg dar, wie Informationen über den Client auch über einen Proxy an die Anwendung gelangen können. Damit dieses jedoch in Verbindung mit Spring verwendet werden kann, müssen die Webserver das Protokoll zunächst implementieren. Bei Tomcat ist das zum aktuellen Zeitpunkt (Juli 2025) noch nicht geschehen.

Fazit

Damit Client-IP-Adressen in Spring Boot korrekt und sicher ermittelt werden, muss man mit den Proxies, die vor der Anwendung stehen, vertraut sein. Nur wenn diese korrekt konfiguriert werden, ist sichergestellt, dass ein Client seine IP-Adresse nicht spoofen kann.

Alleine wenn zweifelsfrei sichergestellt ist, dass es keine direkte Möglichkeit gibt die Anwendung aufzurufen, kann auf diese Sicherheitsmaßnahme verzichtet werden.

In jedem Fall ist es notwendig, sich mit der Netzwerkstruktur, die eine Spring Boot Anwendung umgibt, auseinanderzusetzen.



Zu den Themen Spring Boot und Spring Security bieten wir sowohl Beratung, Entwicklungsunterstützung als auch passende Schulungen an:

Auch für Ihren individuellen Bedarf können wir Workshops und Schulungen anbieten. Sprechen Sie uns gerne an.



Feedback oder Fragen zu einem Artikel - per Twitter @triondevelop oder E-Mail freuen wir uns auf eine Kontaktaufnahme!

Los geht's!

Bitte teilen Sie uns mit, wie wir Sie am besten erreichen können.