프로덕션 환경을 위한 Keycloak 설정

uchan·2025년 2월 17일
0

Keycloak 호스트네임 설정

프론트엔드

사용자 및 어플리케이션이 Keycloak 에 접근하기 위한 URL 이다. 이를 설정하는 이유는 다음과 같다.
1. Keycloak 에서 발급한 토큰과 쿠키가 특정 인스턴스가 아닌 전체 인스턴스에서 유효하도록 설정
2. 일반적으로 인스턴스는 사설 네트워크에서 동작하기 때문에 리다이렉트 등 동작에서 흐름이 제대로 이루어지지 않음
3. 여러 인스턴스가 가정할 때, 인스턴스에 관계없이 들어온 요청이 마치 하나의 인스턴스에 요청한거처럼 설정

백엔드

토큰 검사, 사용자 정보, 토큰 엔드폰인트, JWKS 등 어플리케이션 간의 직접 통신을 위한 URL 이다. 기본적으로 백엔드 베이스 URL 은 요청 URL 을 기반으로 생성된다. 해당 URL 을 공용 도메인 이름을 기반으로 설정하면 어플리케이션이 외부에서 Keycloak 과 통신할 수 있다. 해당 작업을 수행하려면 프론트엔드 URL 을 백엔드 엔드포인트의 기본 URL 로 사용하도록 설정해야한다.

어드민

일반적으로 Keycloak 관리 콘솔을 외부에서 접근할 수 있도록 설정할 필요는 없다. 그러나 만약 필요하다면 adminUrl 속성을 사용해 URL 설정을 할 수 있다. 해당 URL 은 리버스 프록시에 특정 룰을 적용해서 /auth/admin 등 경로들을 보호할 수 있다.

TLS 활성화

Keycloak 은 사용자 에이전트 및 어플리케이션을 통해 민감한 데이터를 교환하기 때문에 Keycloak 에 대한 모든 요청은 보안 채널을 통해 수행해야 한다. 즉, HTTP 가 아닌 HTTPS(HTTP over TLS)를 활성화하여 통신해야한다.

데이터베이스 설정

Keycloak 은 모든 데이터를 저장하기 위해 단일 데이터베이스를 사용한다. 여러 Keycloak 인스턴스는 단일 데이터베이스와 통신하며 전반적인 성능, 가용성, 확정성, 안정성 및 무결성을 지켜야한다. 기본적으로 Keycloak 은 H2 데이터베이스를 사용하지만 프로덕션 환경에서는 안정적인 데이터베이스를 사용할 필요가 있다(MariaDB, Postgresql 등). 또한 데이터베이스에 영구적인 데이터 외에도 in-memory 데이터 스토어를 사용하여 신속한 데이터 접근을 할 수 있다.

클러스터링 활성화

대부분 프로덕션에서는 가용성 및 확장성을 고려해 Keycloak 클러스터를 실행한다. 즉, 특정 노드가 중단되더라도 다른 인스턴스가 실행되어 가동 시간에 영향을 주지않고, 요청 수에 따라 노드를 확장 및 축소를 통해 일관된 응답 시간 및 처리량을 유지할 수 있으며, 노드 장애가 발생하며 영향을 최소화하고 데이터 손실을 예방할 수 있다.

리버스 프록시 설정

프로덕션 환경에서 리버스 프록시는 고가용성을 수현하기 위한 핵심 구성 요소다. 리버스 프록시는 여러 keycloak 인스턴에 대해 단일 및 공용 접근 포인트를 제공하고 정책 집합을 사용해 부하 분산을 수행한다. 리버스 프록시는 인스턴스에 대한 부하 분산을 통해 필요에 따라 인스턴스를 추가하거나 제거해 배포를 확장할 수 있으며 특정 노드가 요청을 처리하지 못하는 경우에도 장애가 발생하지 않도록 지원한다. Keycloak 에는 Apache, nginx 등 리버스 프록시를 사용할 수 있다.

프록시 종류에 관계없이 Keycloak 에서 리버스 프록시를 사용하기 위한 몇 가지 기본적인 요구사항이 존재한다.

  • TLS termination 및 재암호화
  • 부하 분산
    • 백엔드 노드 개수는 예상 로드, 가용성 및 시스템 대체 작동 시나리오를 고려
    • 응답 시간 및 처리량 측면에서 원하는 목표에 달성하기 위해 노드 부하 분산을 수행하기 위해 적절한 알고리즘 사용
  • 세션 어피니티
    • 특정 클라이언트의 요청을 항상 동일한 백엔드 노드에게 전달하도록 한다.
    • 이는 Keycloak 에서 사용자 및 클라이언트와 서버의 통신을 추적하고 해당 상태를 인메모리 캐시에 저장하여, 이후 통신할 때 빠르게 검색하여 특정 노드에서 특정 클라이언트의 요청을 수행하도록 한다.
  • 헤더 전송
    • Keycloak 은 요청을 생성한 클라이언트와 직접 통신하지 않고 리버스 프록시와 통신하기 때문에 Keycloak 에게 클라이언트에 대한 특정 헤더 전송이 필요하다
      • X-Forward-For: 요청을 전송한 클라이언트 주소
      • X-Forward-Proto: 클라이언트가 프록시와 통신하기 위해 사용하는 프로토콜
      • Host: 프록시의 호스트 및 포트 번호

0개의 댓글

관련 채용 정보