[Keycloak] 개념부터 실행까지

Kai·2022년 12월 18일
2

스프링과 OAuth2

목록 보기
2/11

☕ 시작


이번 글에서는 무료 오픈소스 IAM 솔루션(Identity and Access Management Solution)인 Keycloak에 대해서 살펴보겠다.
Keycloak에 대한 개념적인 접근은 물론 로컬에 설치하고, EC2에 배포까지 해보면서 자세하게 살펴보자.


🧐 Keycloak이란?


⭐ IAM 솔루션

대부분의 서비스에는 '회원' 또는 '사용자' 또는 '계정'이라는 개념이 꼭 있다.
게임을 하려고 해도 무조건 회원가입이 먼저 이루어진다.
이렇게 서비스를 개발함에 있어 사용자 관리는 필수적이지만, 이 사용자 관리라는 것은 굉장히 쉽지 않은 작업이다.
대충 생각해도 구현해야할 기능이 한 둘이 아니다.

- 회원 가입
- 로그인
- 회원 정보 수정
- 회원 권한 관리
- 회원 로그인 이력 관리
- 회원 탈퇴
...

구현해야할 기능이 많은 것과 더불어 회원관리는 보안적으로도 굉장히 민감하게 다루어야해서 난이도도 굉장히 높다.

그런데! 이러한 어려운 기능들을 미리 다 구현해놓은 서비스들이 있다.
바로 IAM 솔루션(Identity and Acess Management Solution)으로 불리는 녀석들이다.
Keycloak, AWS Cognito같은 서비스들이 대표적인 예시들이다.

⭐ 사용자 관리 서비스의 분리

Keycloak을 사용한다는 것은 독립된 사용자 관리 서비스를 갖게 됨을 의미한다. 즉, 나만의 OAuth서버를 갖게 되었다고도 할 수 있다.
그렇다면, Keycloak을 사용하기 전과 후의 구조적이 차이를 살펴보자.

💧 Before

🔥 After

이런식으로 사용자 관련 서비스가 분리되면서 서비스의 확장성과 관리의 용이성이 대폭 개선된다.
OAuth에 대한 자세한 내용은 이전에 다룬 적이 있어서, 이 글을 참고하자 🤭

또, 서비스 A, B, C를 사용하기 위해선 각각 인증 및 인가 절차를 거치지 않아도 되고, Keycloak에 한번만 인증, 인가 과정을 거치면 서비스 A,B,C를 모두 사용할 수 있다.
이를 Single Sing On(SSO)라고 부른다.

이미지로 봐도 알 수 있듯이 굉장히 유연한 서비스 구조가 만들어지게 되고, 그리하여 요즘에 거의 대부분의 큰 기업들은 위와 같은 식으로 시스템을 구축한다.
구글, 애플, 토스등등 굳이 따로 예시를 들지 않아도 쉽게 접할 수 있어서 깊게 언급하지는 않겠다.

이렇게 Keycloak에 대해서 충분히 알아봤으니 이번에는 내 pc에 직접 설치해보자! 🔥


💻 설치하기


다운로드 페이지에 접속하면 이렇게 3가지 유형으로 다운 받을 수 있는 방법을 제공한다.
하나씩 살펴보자.

이 중에서 Operator는 다루지 않겠다.
쿠버네티스도 다룰 줄 모르고... OpenShift도 뭔지 몰라서 넘어가겠다. ㅎㅎ ㅠㅠ
개인적으로도 첫번째, 두번째 방식만 사용해봤다 ㅎㅎ


🖐️ 잠깐! 시작하기 전에

본격적으로 시작하기 전에 한가지 알아두어야할 것이 있다.
Keycloak을 설치하고 사용하다 보면, 이런 생각이 들 것이다.

'잉? 그러고보니 DB정보를 따로 설정 안해줬는데... 어케 돌아가지..?'
(사실 내 얘기다 🤭)

찾아보니, 따로 DB설정을 해주지 않으면, 기본적으로 H2 데이터 베이스를 사용한다고 한다.
그러니 놀라지 말도록하자. ㅎㅎ

❗ 프로덕션 환경에서 사용할 때는 꼭, 외부 DB를 연동해주자!


1) 압축파일로 설치

자신의 OS에 맞는 확장자로 파일을 다운받는다.
나는 윈도우, wsl이여서 zip으로 다운받겠다.

압축을 풀기 -> 해당 폴더에 접근 -> bin폴더로 이동

그리고 아래의 명령어로 개발 서버를 실행한다.
(명령어는 물론 각자의 OS에 맞게 실행한다.)
(포트옵션을 따로 주지 않으면 8080포트에서 돌아간다.)

bash kc.sh start-dev --http-port=9090

그리고 브라우저를 통해서 접속하면 아래와 같이 정상 동작하는 것을 확인할 수 있다.
관리자 계정을 생성하면 본격적으로 Keycloak을 이용할 수 있다.


2) 도커 이미지로 설치

아래의 도커 명령어를 실행하면 바로 띄울 수 있다.
권한, 포트맵핑 때문에 명령어가 좀 길다 🤭

docker run --privileged=true -d -p 9090:9090 quay.io/keycloak/keycloak start-dev --http-port=9090

이 또한 마찬가지로 브라우저를 통해서 한번 접속해보자.

흠... 뜨긴 떴는데 뭔가 고장나있다 ㅎㅎ
도커에 대해서 추가 설정을 해줘야할 것 같은데... 나는 도커를 잘 안쓰고, 이후 실습도 1번 형태로 진행할거여서 넘어가도록 하겠다.
그냥 도커로도 구동이 가능하다는 것 정도만 알아주면 좋을 것 같다.
(예전 회사에서는 도커로 했었는데... 어케했누 🤔)


🧐 기능 살펴보기


1) Root 관리자 생성

먼저 root 관리자 계정을 생성해주자.

2) 로그인

그리고 관리자 콘솔로 이동해보면 다음과 같은 로그인화면을 만나게 된다.
이 화면으로 다른 사용자들도 이용하게 된다.
(이 화면은 물론 커스터마이징이 가능하다.)

단순히 화면만 제공되는 것이 아니라 인증/인가 기능이 모두 준비되어 있다.
위에서 생성한 관리자 계정으로 로그인해보자.

3) Realm

Realm은 '영역', '왕국'이라는 뜻인데, Keycloak에서 가장 근본이 되는 데이터 타입이다.
이 Realm 하위에 클라이언트들을 생성할 수 있고, 그 하위에 사용자들이 생성되게 된다.
뭐 예를 들어서, 회사 A라는 Realm 하위에 서비스 A전용 클라이언트, 서비스 B전용클라이언트, 관리자 웹 전용클라이언트를 생성해서 운영할 수 있다.

4) Client

클라이언트를 하나 생성해보자.

그러면, 아래와 같이 옵션을 설정하라고 한다.

각 옵션에 대해서 설명하자면, 다음과 같다.

  • Client authentication: 생성할 클라이언트를 public하게 사용할지 말지를 정한다. 아마 거의 대부분의 경우 public하게 사용하지는 않을 것이므로, 대부분은 이 옵션은 활성화해주면 된다.
  • Authorization: 활성화하면, 권한이나 규칙등등 다양한 기준을 통해서 사용자 Autorization(인가)기능을 제공한다.
  • Authentication Flow: 사용자에게 어떤 인증(로그인)절차를 제공할지 설정한다.

그렇게 클라이언트를 생성하면 다음과 같이 정상적으로 클라이언트가 생성된 것을 확인할 수 있다.

모든 내용을 다루긴 어렵지만, 중요한 것 몇가지 더 살펴보도록 하겠다.

5) Redirect URI

사용자가 인증(로그인)에 성공했을 때, Redirect시킬 수 있는 URI들을 미리 정의해둘 수 있다.
클라이언트가 요청한 Redirect URI가 여기에 미리 정의되어 있어야 그 URI로 Redirect될 수 있다.
이는 당연히 보안을 위해서 상호간에 합의된 URI만 취급하겠다는 의도이다.

또, 이렇게 함으로써 서비스 별로 각자의 Redirect URI를 설정할 수 있게 된다.
위에서 이야기한, 인증/인가만 Keycloak이 해주고 다시 각자의 서비스에서 계속 사용자 경험을 이어갈 수 있는 것이다 👍

6) Credentials - Client secret

클라이언트에 아무나 접근하지 못하도록 해주는 비밀번호라고 보면 될 것 같다.
이 값이 있어야 사용자는 이 Keycloak의 client와 통신할 수 있다.
가장 핵심적인 보안 장치라고 할 수 있다.

7) 다양한 EndPoint

그래서 Keycloak에서 제공하는 강력하고 다양한 기능들을 어떻게 쓰는 건데? 라고 생각할 수 있다.
아래에 표시한 곳으로 들어가보면 그 기능들을 직접확인할 수 있다.

모든 IAM 프레임워크들은 이런식으로 API형태로 인증/인가 기능들을 제공하고 있다.


기능들은 일단 여기까지 살펴보도록하고, 실제 예제들을 진행하면서 이 것들이 어떻게 어우러져서 동작하는 지 직접 확인해보자! 🔥


💾 MySQL 연동


좀 더 실감나는 실습(?)을 위해서 H2데이터베이스말고 MySQL을 사용해보자.
(먼저 공식문서를 밑밥으로 깔고 시작하겠다 ㅎㅎ)

1) DB부터 만들기

공식문서를 확인해보면 여러 주의사항들이 있는데, 그 중에서 MySQL은 JDBC설정에 characterEncodingUTF-8로 설정하라고 한다.
(우리는 지금 Java를 사용하는 것이 아니므로 pass)
또, mysql 8버전을 사용하라고 한다.

DB를 생성해보자.
나는 이렇게 생성했다.

2) 설정 파일 수정

./conf/keycloak.conf

위의 파일을 아래와 같이 각자 DB에 맞게 수정한다.

3) 실행

bin폴더로 이동한 후에 아래 명령어로 다시 서버를 실행해주자.

bash kc.sh start-dev --http-port=9090

그러면 위에서 봤던 동일한 UI, UX가 제공된다.

4) DB확인

그렇다면, MySQL DB에는 무슨일이 일어났을까? DB를 한번 들여다보자.

음... 뭔가 많은 일이 벌어졌다. 그만 들여다보자.


않이 잠깐많여...


자! 드디어 실제 클라이언트 들을 활용해서 기능들을 하나 하나 실행해보고 실제로 배포하는 순서까지 남았다.
근데 글 분량이 너무 길다... ㅎㅎ;;

기능 실행과 서버 배포는 다음 글에서 알아보도록 하자..하핳 😂

금방 돌아오도록 하겠다! 🔥

4개의 댓글

comment-user-thumbnail
2023년 2월 10일

KeyCloak 도입 검토중이였는데 정말 상세한 정리 감사드립니다!!

1개의 답글
comment-user-thumbnail
2023년 10월 31일

상세한 정리 감사합니다.

1개의 답글