Wie Cookies mit nicht persistenten Lastbalencern funktionieren

7

Wir haben eine Drupal-Anwendung, die sso verwendet, um Benutzer anzumelden.

Wir verwenden AWS Classic Load Balancer (ELB). AWS teilt uns mit, dass auf der ELB keine Sitzungspersistenz besteht.

Ich versuche herauszufinden, wie Cookies auf den klassischen Load Balancern ohne Persistenz funktionieren.

example.com DNS zeigt auf die ELB. Es gibt 2 Server im Pool Server1 und Server2

Was wir tun möchten, ist, wenn ein Benutzer seine Startseite beispielsweise auf http://example.com/user/12345/Server 1 aufruft http://example.com/user/login/sso, wenn er noch nicht angemeldet ist, auf die SSO-Seite umgeleitet wird , sich automatisch anmeldet und ein Cookie erhält SESS<hexnumber>und dann zurück zu weitergeleitet wirdhttp://example.com/user/12345/

Es ist uns nicht gestattet, Sitzungsserver (Redis) hinzuzufügen. Dies ist die Garantie dafür, dass diese für beide Weiterleitungen auf Server 1 verbleiben.

Meines Wissens könnte der Benutzer bei jedem Treffer auf 'example.com' entweder auf Server 1 oder Server 2 landen.

Meine Frage:

Wenn sie das Cookie auf Server1 erhalten und dann zu Server2 umgeleitet werden, woher weiß Server2, dass diesem Benutzer auf Server1 bereits ein Cookie zugewiesen ist?

Ich scheine mich im Kreis zu denken. Bei der Arbeit an dieser Art von Setup in der Vergangenheit mit LBs ohne Sitzungspersistenz haben wir einen Redis-Server verwendet, um die Sitzungen zu halten, und jede Anforderung hat den Redis-Server nach Sitzungsinformationen durchsucht.

Donna Delour
quelle

Antworten:

3

Ein Cookie wird im Browser gesetzt, nicht auf einem Server. Es ist auf eine Domain und optional auf einen bestimmten Pfad in der URL beschränkt. Solange auf beide Server von derselben Domain zugegriffen wird, ist das Cookie dort.

Wenn ein Cookie auf eine Sitzung verweist, müssen sowohl Server1 als auch Server2 auf irgendeine Weise Zugriff auf diese Sitzung haben. Wenn Sitzungen nicht zwischen den Servern geteilt werden können, müssen Sie einen Benutzer zwingen, auf einem bestimmten Server zu bleiben. Dies kann leicht mit DNS und ein wenig Magie zum Umschreiben von URLs erreicht werden:

  • www.example.com verweist auf beide Server.
  • www1.example.com zeigt nur auf server1
  • www2.example.com zeigt nur auf server2

Mithilfe einer Reihe einfacher (ish) Umschreiberegeln und eines Cookies kann der Benutzer dann an einen bestimmten Server gebunden werden, um sicherzustellen, dass seine Sitzung weiterhin besteht.

Hier sind einige weitere Details.

DNS:

  • example.com A 1.1.1.1, A 2.2.2.2
  • www.example.com CNAME example.com
  • www1.example.com A 1.1.1.1
  • www2.example.com A 2.2.2.2

Regeln umschreiben:

  • Persistenz-Cookie: "Backend"
  • Erstverbindung: "Backend" nicht definiert, "Backend" auf www1 oder www2 setzen, je nachdem, welcher Server geantwortet hat, und auf diesen Server umleiten. Das Cookie muss auf die Domain "example.com" gesetzt sein. Auf diese Weise wird es sowohl auf www1 als auch auf www2 geladen
  • Wenn "Backend" definiert ist, stellen Sie sicher, dass sein Wert mit der Serverinstanz übereinstimmt, und leiten Sie ihn gegebenenfalls um.
  • Stellen Sie sicher, dass das Sitzungscookie im vollständigen Domänennamen des Servers definiert ist, dh www1.example.com oder www2.example.com

Die Umschreibungslogik ist auf dem Webserver selbst zu definieren. Alle modernen Webserver verfügen über sehr funktionsfähige Umschreibesprachen, die diese Funktionalität vollständig implementieren können.


quelle
Ich habe über example1.com und example2.com nachgedacht, darf jedoch keinem Benutzer mitteilen, dass er example1.com oder example2.com verwenden muss. Dies wurde ohne ein klares Verständnis der Funktionsweise von Cookies und Browsern erdacht um das Gesicht zu retten und eine Art Back-End-Magie zu ermöglichen. Wie kann ich verwenden, example.comwenn die Benutzer ein Cookie erhalten und diese dann auf www1.example.com oder www2.example.com speichern?
Donna Delour
Ich habe meine Antwort aktualisiert
0

Wenn Sie eine Sitzungsverwaltungsdatenbank wie Elasticache Redis nicht verwenden können (Redis für Sitzungen sollte nicht mehr als 15 US-Dollar pro Monat kosten), ist die nächstbeste Option, Sticky-Sitzungen auf der ELB zu aktivieren.

https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-sticky-sessions.html

Dadurch werden Benutzer gezwungen, während der gesamten Sitzung denselben Backend-Knoten zu verwenden. Ein "Load Balancer Generated Cookie" mit einer Lebensdauer von 900 Sekunden sollte gut genug sein, aber Sie können dies optimieren.

Jared
quelle