사용자 및 어플리케이션이 Keycloak 에 접근하기 위한 URL 이다. 이를 설정하는 이유는 다음과 같다.
1. Keycloak 에서 발급한 토큰과 쿠키가 특정 인스턴스가 아닌 전체 인스턴스에서 유효하도록 설정
2. 일반적으로 인스턴스는 사설 네트워크에서 동작하기 때문에 리다이렉트 등 동작에서 흐름이 제대로 이루어지지 않음
3. 여러 인스턴스가 가정할 때, 인스턴스에 관계없이 들어온 요청이 마치 하나의 인스턴스에 요청한거처럼 설정
토큰 검사, 사용자 정보, 토큰 엔드폰인트, JWKS 등 어플리케이션 간의 직접 통신을 위한 URL 이다. 기본적으로 백엔드 베이스 URL 은 요청 URL 을 기반으로 생성된다. 해당 URL 을 공용 도메인 이름을 기반으로 설정하면 어플리케이션이 외부에서 Keycloak 과 통신할 수 있다. 해당 작업을 수행하려면 프론트엔드 URL 을 백엔드 엔드포인트의 기본 URL 로 사용하도록 설정해야한다.
일반적으로 Keycloak 관리 콘솔을 외부에서 접근할 수 있도록 설정할 필요는 없다. 그러나 만약 필요하다면 adminUrl 속성을 사용해 URL 설정을 할 수 있다. 해당 URL 은 리버스 프록시에 특정 룰을 적용해서 /auth/admin
등 경로들을 보호할 수 있다.
Keycloak 은 사용자 에이전트 및 어플리케이션을 통해 민감한 데이터를 교환하기 때문에 Keycloak 에 대한 모든 요청은 보안 채널을 통해 수행해야 한다. 즉, HTTP 가 아닌 HTTPS(HTTP over TLS)를 활성화하여 통신해야한다.
Keycloak 은 모든 데이터를 저장하기 위해 단일 데이터베이스를 사용한다. 여러 Keycloak 인스턴스는 단일 데이터베이스와 통신하며 전반적인 성능, 가용성, 확정성, 안정성 및 무결성을 지켜야한다. 기본적으로 Keycloak 은 H2 데이터베이스를 사용하지만 프로덕션 환경에서는 안정적인 데이터베이스를 사용할 필요가 있다(MariaDB, Postgresql 등). 또한 데이터베이스에 영구적인 데이터 외에도 in-memory 데이터 스토어를 사용하여 신속한 데이터 접근을 할 수 있다.
대부분 프로덕션에서는 가용성 및 확장성을 고려해 Keycloak 클러스터를 실행한다. 즉, 특정 노드가 중단되더라도 다른 인스턴스가 실행되어 가동 시간에 영향을 주지않고, 요청 수에 따라 노드를 확장 및 축소를 통해 일관된 응답 시간 및 처리량을 유지할 수 있으며, 노드 장애가 발생하며 영향을 최소화하고 데이터 손실을 예방할 수 있다.
프로덕션 환경에서 리버스 프록시는 고가용성을 수현하기 위한 핵심 구성 요소다. 리버스 프록시는 여러 keycloak 인스턴에 대해 단일 및 공용 접근 포인트를 제공하고 정책 집합을 사용해 부하 분산을 수행한다. 리버스 프록시는 인스턴스에 대한 부하 분산을 통해 필요에 따라 인스턴스를 추가하거나 제거해 배포를 확장할 수 있으며 특정 노드가 요청을 처리하지 못하는 경우에도 장애가 발생하지 않도록 지원한다. Keycloak 에는 Apache, nginx 등 리버스 프록시를 사용할 수 있다.
프록시 종류에 관계없이 Keycloak 에서 리버스 프록시를 사용하기 위한 몇 가지 기본적인 요구사항이 존재한다.