Keycloak이란

메린·2023년 7월 18일
2

Q&A

목록 보기
7/7


클라우드 관련 프로젝트 진행하기에 앞서 keycloak을 사용하려하여 공부를 해보려한다.

Keycloak 이란

keycloak은 ID 및 액세스 관리 솔루션을 제공하는 오픈소스이다.
인증(Authentication)과 인가(Authorization)을 쉽게 해주고 SSO(Single-Sign-On)을 가능하게 해주는 오픈소스이다.

그래서 SSO가 뭔데? 하고 궁금해졌다.

SSO(Single-Sign-On)이란

SSO는 Single-Sign-On의 약자로 한번의 로그인을 통해 그와 연결된 여러가지 다른 사이트들을 자동으로 접속하여 이용할 수 있도록 하는 방법이다.
일반적으로 각자 다른 사이트는 각각 사용자의 정보들과 DB가 각각 있는데 그 정보를 연동하여 사용해야 하는 경우가 발생할 수 있다. 이런 경우에 SSO 기능을 사용하게 되며 하나의 시스템에서 인증을 할 경우 그와 연결된 다른 시스템에서는 인증 정보가 있는지 없는지를 확인하여 이후 처리를 하도록 만들면 된다.

하나의 패스워드와 아이디를 통해 여러 시스템에 접근할 수 있는 통합인증솔루션 이다.

keycloak 제공 기능

  • 다중 프로토콜 지원

    • OpenID Connect, OAuth 2.0 및 SAML 2.0의 세가지 프로토콜 지원
  • SSO

    • 싱글 사이온 및 싱글 사인아웃을 지원한다.
      • 싱글 사이온 : 사용자가 한 번 로그인 하면 다른 여러 애플리케이션 및 서비스에서 추가 인증 없이 자동으로 인증되는 기능
      • 싱글 사인아웃 : 사용자가 로그아웃하면 사용자의 인증 세션을 종료하고, 이를 통해 다른 연결된 애플리케이션 및 서비스에서도 자동으로 로그아웃되도록 한다.
  • 사용자 지정 역할 및 그룹

    • 사용자 데이터베이스를 생성하여 사용자를 관리할 수 있다.
    • 사용자에게 역할을 할당하고 그룹으로 구성하여 액세스 제어 및 권한 관리를 수행 할 수 있다.
  • 애플리케이션 인증 및 역할 기반 보호

    • 애플리케이션 내에서 사용자를 인증하고, 미리 정의된 역할에 기반하여 애플리케이션 일부를 보호하는 데 사용될 수 있다.
  • 외부 ID 소스 동기화

    • 이미 기존의 사용자 데이터베이스가 있는 경우 해당 데이터베이스와 동기활 할 수 있다. -> 통합관리 가능
  • 신원 중개

    • 사용자와 외부 ID 공급자 또는 다른 공급자 간에 프록시로 작동할 수 있다.
    • 이를 통해 다른 인증 시스템을 중개하여 사용자의 신원을 관리하고 인증을 수행할 수 있다.
  • 소셜 로그인

    • 다양한 소셜 ID 공급자 : Google, Twitter, Stack Overflow 와 통합 가능
  • 페이지 사용자 정의

    • 사용자에게 표시되는 모든 페이지에 대해 사용자 정의 가능

    Keycloak 사용해보기

    docker로 실행시키기

    docker run -d --name keycloak -p 8080:8080 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin jboss/keycloak:10.0.0

Keycloak 서버가 성공적으로 실행되었다.

내가 원하는 실습이 진행되지 않아, 다른 방법으로 진행했다.

yml 파일을 이용하여 keycloak 컨테이너와 keycloak이 필요로 하는 postgres 컨테이너를 생성한다.

version: '3'

volumes:
  postgres_data:
      driver: local

services:
  postgres:
      image: postgres
      volumes:
        - postgres_data:/var/lib/postgresql/data
      environment:
        POSTGRES_DB: keycloak
        POSTGRES_USER: keycloak
        POSTGRES_PASSWORD: password
      ports:
        - 5432:5432
  keycloak:
      image: quay.io/keycloak/keycloak:latest
      environment:
        DB_VENDOR: POSTGRES
        DB_ADDR: postgres
        DB_DATABASE: keycloak
        DB_USER: keycloak
        DB_SCHEMA: public
        DB_PASSWORD: password
        KEYCLOAK_USER: admin
        KEYCLOAK_PASSWORD: admin
        # Uncomment the line below if you want to specify JDBC parameters. The parameter below is just an example, and it shouldn't be used in production without knowledge. It is highly recommended that you read the PostgreSQL JDBC driver documentation in order to use it.
        #JDBC_PARAMS: "ssl=true"
      ports:
        - 8080:8080
      depends_on:
        - postgres

위는 keycloak-postgres.yml 파일이다.

이제 컨테이너를 올려보자.

docker-compose -f keycloak-postgres.yml up

잘 올라갔는지 확인해보자.

이제 keycloak UI 페이지에 접근해보자.

http://{server-address}:8080/auth/

잘 접속된걸 볼 수 있다.

하지만 admin consol로 접근하기 위해 Administration Console 을 클릭하면 문제가 발생한다.

구글링 해보니 지금 상황에서 가장 도움이 될만한 질문이 2개를 찾을 수 있었다.

1번
2번

간단하게 말하면,
외부 IP로 접근하는 요청에 대해서 기본으로 SSL이 설정되어 있다는 것이다.
이 값은 DB에 저장이 되어있다.

DB가 처음에 나는 PostgreSQL을 사용하도록 구성하였기 때문에 SSL 옵션을 변경해주어야 한다.

  • 사실 Keycloak은 DB를 설정해주지 않으면 H2로 기본 구성된다.
    • H2 란?
      • 자바 기반의 관계형 데이터베이스 관리 시스템, H2는 오픈소스로 제공되며 특히 임베디드 애플리케이션 및 테스트 용도로 많이 사용된다.
      • Keycloak은 기본적으로 H2 데이터베이스를 내장하고 있어 개발 및 테스트 목적으로 간단하게 사용할 수 있으나 실제 운영 환경에서는 보통 보다 강력한 데이터베이스 시스템인 PostgreSQL, MySQL, Oracle등과 같은 외부 데이터베이스를 사용하는 것이 일반적이다.

SSL 옵션 변경 및 PostgreSQL 사용 구성

  • SSL_REQUIRED : EXTERNAL -> NONE 변경
    이 SSL 옵션은 realm 이라는 테이블에 SSL_REQUIRED라는 컬럼으로 EXTERNAL이라는 값으로 되어있다.
    이 값을 NONE으로 변경후 keycloak 컨테이너를 재실행하면 접속할 수 있다.

    • 컨테이너의 ID를 확인한다
      docker ps

    • PostgreSQL 컨테이너에 'docker exec' 명령을 사용하여 접속한다.
      docker exec -it 44b59be67b0f bash

    • PostgreSQL 데이터베이스에 접속한다.
      psql -U keycloak -d keycloak

    • 'realm' 테이블을 업데이트 한다. 'SSL_REQUIRED' 값을 'EXTERNAL'에서 'NONE'으로 변경한다.
      UPDATE realm SET SSL_REQUIRED = 'NONE';

profile
I can do it ! 苦盡甘來

1개의 댓글

comment-user-thumbnail
2023년 7월 18일

글이 많은 도움이 되었습니다, 감사합니다.

답글 달기