[문제 해결] Docker compose 환경에서 keycloak 연결 이슈

[문제 해결] Docker compose 환경에서 keycloak 연결 이슈
Photo by Rubaitul Azad / Unsplash

문제 상황

도커 컴포즈로 keycloak 컨테이너와 그 컨테이너에 연결할 내 앱 서버를 작성했는데, 이상하게 처음 startup할 때 keycloak 연결 에러가 났다. 사실 연결 오류로 실패할 경우 자동으로 재시작하면 문제없이 동작하기에 그냥 넘어가도 됐지만… 계속 신경이 쓰여서 해당 에러를 제거하고자 했다. 서버 시작할 때마다 에러 메시지 뜨면 괜히 신경쓰이니 …

keycloak.exceptions.KeycloakAuthenticationError: 401: b'{"error":"invalid_grant","error_description":"Invalid user credentials"}'

분명히 user credential은 맞게 설정했는데도 Invalid user credentials 이라니 이상하다.

주요 특이사항

  1. compose에서 컨테이너를 1개로 설정했을 때는 안 났다.
  2. 2개를 설정할 때부터 에러가 났다.
  3. 에러도 2개 중의 1개 컨테이너에서만 난다.

문제 원인

확인해 보니, keycloak 컨테이너에서 동일한 계정으로 너무 동시에 여러 연결 요청이 들어올 경우 credential이 맞더라도 401 오류를 내는 설정이 기본적으로 설정되어 있었다. 그래서 두 컨테이너 중 먼저 연결한 경우는 문제 없었지만, 바로 다음에 들어온 컨테이너의 연결 요청은 어뷰징으로 판단하고 거부했던 것이었다.

문제 해결

해당 에러가 안 나도록 가장 쉽게 해결하는 방법은 컨테이너들의 연결 요청 시간을 약간 텀을 두는 것이다. 아주 가까운 시간만 아니면, 예를 들어 1초 이상만 차이나도 keycloak에서 어뷰징으로 판단하지 않는다. 그래서 도커 컴포즈에서 앱 서버에 대해 아래와 같은 command를 추가했다.

    command:
      [
        "/bin/bash",
        "-c",
        "sleep $$(( ( RANDOM % 10 ) + 1 )) && ./app_server start",
      ]

이렇게 하면 컨테이너들이 시작할 때 랜덤 n초 후에 시작해서 연결 텀이 생기므로 연결 오류가 날 가능성이 매우 작아진다. 사실 제로로 만드는 게 제일 좋지만 이정도도 충분하고, 사실 에러가 난다 해도 재시작하면 아무 문제가 없으니 해당 오류가 나타날 가능성을 최소화하는 정도로 마무리했다.