8.4. 고정 세션
일반적인 클러스터 배포는 로드 밸런서(reverse proxy)와 사설 네트워크의 Red Hat Single Sign-On 서버 2개로 구성됩니다. 성능을 위해 로드 밸런서에서 특정 브라우저 세션과 관련된 모든 요청을 동일한 Red Hat Single Sign-On 백엔드 노드로 전달하는 경우 유용할 수 있습니다.
그 이유는 Red Hat Single Sign-On이 현재 인증 세션 및 사용자 세션과 관련된 데이터를 저장하기 위해 적용 대상에서 Infinispan 분산 캐시를 사용하고 있기 때문입니다. Infinispan 분산 캐시는 기본적으로 하나의 소유자로 구성됩니다. 즉, 특정 세션이 하나의 클러스터 노드에만 저장되고 다른 노드는 액세스하려는 경우 원격으로 세션을 조회해야 합니다.
예를 들어 ID 123 이 있는 인증 세션이 node1 의 infinispan 캐시에 저장된 다음 node2 에서 이 세션을 조회해야 하는 경우 특정 세션 엔터티를 반환하려면 네트워크를 통해 node1 에 요청을 보내야 합니다.
특정 세션 엔터티를 로컬에서 항상 사용할 수 있는 경우 유용합니다. 이 경우 고정 세션의 도움을 받아 수행할 수 있습니다. 공용 프런트 엔드 로드 밸런서가 있는 클러스터 환경의 워크플로우와 Red Hat Single Sign-On 노드 두 개는 다음과 같을 수 있습니다.
- Red Hat Single Sign-On 로그인 화면을 보려면 초기 요청 전송
- 이 요청은 프런트 엔드 로드 밸런서에서 제공하며 일부 임의 노드(예: node1)로 전달합니다. 엄격하게 말하면, 노드는 임의적 일 필요는 없지만 다른 기준 (클라이언트 IP 주소 등)에 따라 선택할 수 있습니다. 모두 기본 로드 밸런서(reverse proxy)의 구현 및 구성에 따라 달라집니다.
- Red Hat Single Sign-On은 임의의 ID(예: 123)를 사용하여 인증 세션을 생성하여 Infinispan 캐시에 저장합니다.
-
Infinispan 분산 캐시는 세션 ID의 해시를 기반으로 세션의 기본 소유자를 할당합니다. 이에 대한 자세한 내용은 Infinispan 문서를 참조하십시오. infinispan이 이 세션의 소유자가
node2로 할당되었다고 가정하겠습니다. -
Red Hat Single Sign-On은 <
session-id>.<owner-node-id>와 같은 형식으로AUTH_SESSION_ID쿠키를 생성합니다. 이 예에서는123.node2입니다. - 브라우저에서 Red Hat Single Sign-On 로그인 화면과 AUTH_SESSION_ID 쿠키를 사용하여 응답이 사용자에게 반환됩니다.
이 시점에서 로드 밸런서가 ID 123 이 있는 인증 세션의 소유자이므로 모든 다음 요청을 node2 로 전달하는 경우 유용합니다. 따라서 Infinispan은 이 세션을 로컬로 조회할 수 있습니다. 인증이 완료되면 인증 세션이 사용자 세션으로 변환되며 ID 123 이 동일하기 때문에 node2 에도 저장됩니다.
고정 세션은 클러스터 설정에 필수는 아니지만 위에서 언급한 이유로 성능에 적합합니다. AUTH_SESSION_ID 쿠키를 고정하도록 로드 밸런서를 구성해야 합니다. 이 작업은 로드 밸런서에 따라 어떻게 됩니까.
시작 중에 시스템 속성 jboss.node.name 을 경로 이름에 해당하는 값과 함께 사용하려면 Red Hat Single Sign-On 측에서 사용하는 것이 좋습니다. 예를 들어 -Djboss.node.name=node1 은 node1 을 사용하여 경로를 식별합니다. 이 경로는 노드가 특정 키의 소유자인 경우 Infinispan 캐시에서 사용되며 AUTH_SESSION_ID 쿠키 에 연결됩니다. 이 시스템 속성을 사용한 시작 명령의 예는 Mod Cluster Example 에서 확인할 수 있습니다.
일반적으로 경로 이름은 백엔드 호스트와 동일하지만 필수는 아닙니다. 예를 들어 사설 네트워크 내에서 Red Hat Single Sign-On 서버의 호스트 이름을 숨기려면 다른 경로 이름을 사용할 수 있습니다.
8.4.1. 경로 추가 비활성화 링크 복사링크가 클립보드에 복사되었습니다!
일부 로드 밸런서는 백엔드 Red Hat Single Sign-On 노드를 사용하는 대신 경로 정보를 직접 추가하도록 구성할 수 있습니다. 그러나 위에서 설명한 대로 Red Hat Single Sign-On에서 경로를 추가하는 것이 좋습니다. 이는 Red Hat Single Sign-On은 특정 세션의 소유자인 엔티티를 인식하고 해당 노드로 라우팅할 수 있기 때문에 성능이 향상됩니다. 이는 반드시 로컬 노드가 아닙니다.
Red Hat Single Sign-On의 AUTH_SESSION_ID 쿠키의 경로 정보를 원하는 경우 Red Hat Single Sign-On의 RHSSO_HOME/standalone/configuration/standalone-ha.xml 파일에 추가하여 다음을 비활성화할 수 있습니다.
<subsystem xmlns="urn:jboss:domain:keycloak-server:1.1">
...
<spi name="stickySessionEncoder">
<provider name="infinispan" enabled="true">
<properties>
<property name="shouldAttachRoute" value="false"/>
</properties>
</provider>
</spi>
</subsystem>
8.4.2. mod_cluster를 사용한 클러스터 설정 예 링크 복사링크가 클립보드에 복사되었습니다!
이 예제에서는 Mod Cluster 를 로드 밸런서로 사용합니다. mod 클러스터의 주요 기능 중 하나는 로드 밸런서 측에 구성이 많지 않다는 것입니다. 대신 백엔드 노드 측에서 지원이 필요합니다. 백엔드 노드는 MCMP라는 전용 프로토콜을 통해 로드 밸런서와 통신하고 다양한 이벤트(예: 연결된 노드 또는 왼쪽 클러스터, 새 애플리케이션 배포 등)에 대해 로드 밸런서에 알립니다.
설정의 예는 하나의 JBoss EAP 7.1 로드 밸런서 노드와 두 개의 Red Hat Single Sign-On 노드로 구성됩니다.
클러스터링 예제에서는 시스템의 루프백 네트워크 인터페이스에서 MULTICAST를 활성화해야 합니다. 이 작업은 루트 권한(Linux의)에서 다음 명령을 실행하여 수행할 수 있습니다.
route add -net 224.0.0.0 netmask 240.0.0.0 dev lo
ifconfig lo multicast
8.4.2.1. 로드 밸런서 설정 링크 복사링크가 클립보드에 복사되었습니다!
어디에서나 JBoss EAP 7.1 서버의 압축을 풉니다. 가정은 위치 EAP_LB입니다.
EAP_LB/standalone/configuration/standalone.xml 파일을 편집합니다. undertow 하위 시스템에서 다음과 같이 필터 아래에 mod_cluster 구성을 추가합니다.
<subsystem xmlns="urn:jboss:domain:undertow:4.0">
...
<filters>
...
<mod-cluster name="modcluster" advertise-socket-binding="modcluster"
advertise-frequency="${modcluster.advertise-frequency:2000}"
management-socket-binding="http" enable-http2="true"/>
</filters>
그리고 다음과 같은 filter-ref 가 default-host 아래에 있습니다.
<host name="default-host" alias="localhost">
...
<filter-ref name="modcluster"/>
</host>
다음으로 socket-binding-group 에서 이 그룹을 추가합니다.
<socket-binding name="modcluster" port="0"
multicast-address="${jboss.modcluster.multicast.address:224.0.1.105}"
multicast-port="23364"/>
파일을 저장하고 서버를 실행합니다.
cd $WILDFLY_LB/bin
./standalone.sh
8.4.2.2. 백엔드 노드 구성 링크 복사링크가 클립보드에 복사되었습니다!
일부 위치에 Red Hat Single Sign-On 서버 배포의 압축을 풉니다. 위치가 RHSSO_NODE1 이라고 가정합니다.
RHSSO_NODE1/standalone/configuration/standalone-ha.xml 을 편집하고 공유 데이터베이스에 대해 데이터 소스를 구성합니다. 자세한 내용은 데이터베이스 장을 참조하십시오.
undertow 하위 시스템에서 서블릿 컨테이너 요소 아래에 를 추가합니다.
session- config
<servlet-container name="default">
<session-cookie name="AUTH_SESSION_ID" http-only="true" />
...
</servlet-container>
mod_cluster 로드 밸런서에서만 session-config 를 사용합니다. 다른 경우에는 로드 밸런서에서 직접 AUTH_SESSION_ID 쿠키를 통해 고정 세션을 구성합니다.
그런 다음 Load Balancer 장에 설명된 대로 proxy-address-forwarding 을 구성할 수 있습니다. mod_cluster는 기본적으로 Cryostat 커넥터를 사용하므로 해당 커넥터를 구성해야 합니다.
이는 모두 mod_cluster가 이미 구성되어 있기 때문입니다.
Red Hat Single Sign-On의 노드 이름은 현재 서버의 호스트 이름을 기반으로 자동으로 감지할 수 있습니다. 그러나 보다 세분화된 제어는 시스템 속성 jboss.node.name 을 사용하여 노드 이름을 직접 지정하는 것이 좋습니다. 동일한 물리 서버 등에서 두 개의 백엔드 노드로 테스트하는 경우 특히 유용합니다. 따라서 다음과 같이 시작 명령을 실행할 수 있습니다.
cd $RHSSO_NODE1
./standalone.sh -c standalone-ha.xml -Djboss.socket.binding.port-offset=100 -Djboss.node.name=node1
두 번째 백엔드 서버를 동일한 방식으로 구성하고 다른 포트 오프셋 및 노드 이름을 사용하여 실행합니다.
cd $RHSSO_NODE2
./standalone.sh -c standalone-ha.xml -Djboss.socket.binding.port-offset=200 -Djboss.node.name=node2
http://localhost:8080/auth 의 서버에 액세스합니다. 관리자 사용자는 로컬 주소 및 로드 밸런서(proxy) 액세스 없이 생성할 수 있으므로 먼저 http://localhost:8180/auth 에서 직접 백엔드 노드에 액세스하여 관리자 사용자를 생성해야 합니다.
mod_cluster를 사용하는 경우 백엔드 노드를 통해 직접 사용하지 않고 로드 밸런서를 통해 클러스터에 항상 액세스해야 합니다.