[Keycloak] Keycloak 도입기_Keycloak이란?(SpringBoot 2.7.10+ Keycloak 21.0.2)

cielo ru·2024년 5월 31일
0

Keycloak

목록 보기
1/6

➰ 서론

지난 프로젝트에서 Keycloak이라는 오픈소스를 도입하여 사용자 인증 서비스를 구축한 경험이 있다. 그 시점에는 더더욱 KeycloakSpringBoot을 연동한 사례가 많이 없었기 때문에 엄청 고생했던 기억이 있다.

당시 최신 버전인 Keycloak 21.0.2 버전을 사용했었는데, 업그레이드가 된지 3달밖에 되지 않아 트러블 슈팅 과정이 꽤 많았다. 대부분의 자료가 이전 버전인 20.0.1을 다루고 있었기 때문에, 에러 메시지조차 없는 문제를 해결하는 데 8시간을 소비하기도 했다.

기억이 생생하지는 않지만 앞으로 Keycloak을 도입하고자 하는 사람들에게 도움을 주고자 이제라도 글을 써보려 한다.

그때는 스프링 시큐리티에 대해서 잘 모르기도 해서 더 고생했던 것 같은데 초기에 Keycloak 세팅 과정이 복잡할 뿐이고 막상 구현하고 나면 엄청 편하다. 지금 구현하라면 더 잘할 수 있을 것 같다. 분산 환경이라면, 사용자 서비스를 좀 더 편리하고 관리하고 유지보수까지 하고 싶다면, Keycloak을 도입하는 것을 추천한다.

++ 최근에 토스와 현대를 비롯해서 많은 기업들에서 keycloak을 도입하고 있다고 한다.


➰ 도입 과정

작년 3월(2023.03)에 학교 팀 프로젝트를 진행하였다.

주제 : 소프트웨어 코칭 플랫폼
요구사항 : 분산 환경(MSA 도입), 애자일, SSO 기능

MSA를 도입하여 여러 서비스 중 사용자 서비스(user-service)와 결제 서비스를 나 포함 2명의 팀원과 개발해야 했다.

➰ 고민

분산 환경이라는 특수한 환경에서 사용자 서비스를 어떻게 관리하면 좋을까 고민을 했었다. 처음에는 시큐리티에 대한 개념도 잘 몰랐기 때문에 시큐리티를 도입하여 인증하는 방식에 OAuth2를 구현해야겠다고 생각했다. 하지만 그렇게 되면 정보를 불러오는 과정이 복잡하다.

그러다 팀원 중에 한명이 Keycloak을 도입해보는건 어떠냐고 했다.

NHN의 기술세미나 영상을 보고 키클락이 우리 프로젝트의 요구사항과 맞닿아 있어 도입을 한번 해보고 싶다는 의견이었다. 무작정 Keycloak을 도입할 수 없기에 그 영상을 함께 시청했고, Keycloak의 장단점, 도입해야 하는 이유 등을 조사해서 팀원들과 도입 여부에 대한 이야기를 나눴다.

키클락을 활용한 인증서버 도입기

결론은 현재 우리 팀의 사용자 서비스에 대한 요구사항과 MSA를 도입해야한다는 조건에 딱 부합하는 아이디어였다. 그래서 Keycloak를 도입하기로 결정했고, 자료 조사를 한 내용, 우여곡절 등에 대해서 앞으로 포스팅 해볼까 한다.

우선 Keycloak이 무엇인지에 대해 알아보자.


➰ Keycloak이란?

  • Keycloak은 사용자 인증과 권한 부여를 위한 오픈 소스 IAM 솔루션이다.

  • 여러 서비스 및 애플리케이션에 대한 사용자 인증 및 권한 부여를 중앙에서 관리할 수 있으며, SSO(Single-sign-on)을 가능하게 해주는 오픈소스이다.

  • 국제적인 인증, 인가 표준(OIDC, SAML, OAuth 2.0 등) 을 모두 제공하는 오픈 소스로, Kubernetes 나 MSA 환경에 최적화 된 솔루션이다.

➰ SSO(Single-Sign-On)란?

SSO (Single-Sign-On)
1회의 사용자 인증으로 다수의 애플리케이션 및 웹사이트에 대한 사용자 로그인을 허용하는 인증 솔루션이다.

  • SSO는 한 번 자격 증명이 검증된 사용자에게는 반복되는 로그인 없이 서비스 이용이 가능하고 사용자가 기억해야 하는 비밀번호의 수와 계정의 수를 크게 줄임으로써 보다 나은 사용자 경험을 제공할 수 있다.

  • SSO가 없을 경우 여러 웹 사이트에 대한 암호를 기억해야함으로 많은 사용자들이 단순하거나 반복적인 암호를 사용하는 등 권장되지 않는 보안 관행이 발생한다. SSO를 사용하면 보안에 취약한 여러 비밀번호 대신 길고 복잡한 단 하나의 강력한 비밀번호를 사용할 수 있다.

  • Keycloak은 SSO의 일종이다.

➰ Keycloak 기본 구조

Keycloak은 렐름(Realm) 이라는 영역이 존재하고 Realm 단위로 sso가 설정된다.

Keycloak은 설치시 기본적으로 Master realm을 제공하지만, 이 Realm은 다른 realm을 관리하는데 사용하기 때문에 새로운 realm을 생성하여 사용해야 한다.

하나의 렐름에 연동이 된 서비스들끼리는 한 번의 로그인으로 전체 서비스들을 사용할 수 있다.

➰ Keycloak 용어 정리

1) Realm

Realm은 사용자, 인증, 인가, 권한, 그룹이 관리하는 범위이다.
각각의 Realm은 독립적이고, 한 Realm내의 Client들(Application)은 서로 SSO를 공유합니다.

2) Client

Client란 인증, 인가 업무를 Keycloak에게 요청할 수 있는 주로 어플리케이션이나 서비스를 뜻한다. Keycloak은 Client들에게 보안이나, SSO를 제공해준다.

3) User

User란 Client를 이용하는 사용자를 뜻한다. 사용자는 Realm 단위이다.
A라는 Realm에 가입된 X라는 사용자는 Client들에서 X의 아이디 하나로 로그인이 가능하지만, B라는 Realm에는 가입이 되어있지 않으므로 로그인이 불가능하다.


➰ Keycloak 기능

1) User Storage Federation

키를락에 로그인을 하려고 할 때 계정 정보가 키클락에 저장이 되어 있지 않고 다른 저장소에 저장이 되어 있을 경우, 다른 저장소에 저장이 되어 있는 계정 정보로 로그인이 가능하게 해주는 기능이다.

  • LDAP
    : 추가 개발 없이 관리자 페이지에서 설정만으로도 연동이 가능하다.
  • Kerberos
  • User Storage SPI(Service Provider Interfaces)
    : 사용자가 직접 모듈을 개발하고 이 모듈을 키클락에 적용시키면 키클락이 그 모듈을 사용할 수 있게 한다.
    : 외부 저장소가 정해져 있는게 아닌 사용자가 원하는 외부 저장소와의 연동을 하는 모듈을 직접 개발해서 spi를 적용하면 어떠한 외부 저장소와도 연동이 가능하다.

이 기능으로 User Storage를 재구성하였다.

2) Authentication SPI

  • 키클락에서의 인증 로직을 수정할 수 있게 해주는 기능으로, 키를락에서의 기본 기능으로는 지원이 안되는 기능을 추가하여 사용 할 수 있다.

  • 같은 렐름을 사용한 같은 sso 이더라도 인증 흐름은 클라이언트별로 다르게 설정할 수 있는 장점이 있다.

    1. 로그인이 가능한 아이디 수정

    키클락은 아이디와 이메일 두 가지로 로그인이 가능하도록 지원하지만, 서비스에 맞게 다른 아이디로도 로그인이 가능하도록 로직을 수정할 수 있다.

    2. 무차별 암호 대입 공격 방지 기능 대체

    짧은 시간 동안 여러 번의 로그인을 실패하면 키클락에서 그 계정을 사용하지 못하도록 disable 하는 기능이 존재하지만, 시간에 상관없이 로그인에 5회이상 실패하면 계정을 disable 하기 위해 인증 로직을 수정하여 사용할 수 있다.

3) 로그인 페이지

키클락에서 테마라는 기능으로 로그인 페이지를 우리가 원하는 로그인 페이지로 보이도록 하는 기능이다.

이 기능으로 로그인 페이지를 커스텀하여 원하는 로그인 페이지로 바꾸었다.

➰ Keycloak 로그인 과정

Keycloak 로그인 과정은 다음과 같다.

  1. 사용자가 애플리케이션에 로그인 요청을 보낸다.

  2. 애플리케이션은 사용자를 Keycloak 로그인 페이지로 리다이렉트한다.

  3. 사용자가 로그인 페이지에 로그인 정보를 입력하고 로그인 버튼을 누른다.

  4. 입력된 계정 정보로 keycloak에서 로그인 한다. (계정 정보가 외부 저장소에 저장이 되어 있는 경우 외부 저장소의 정보를 통해 로그인 로직을 수행하고 keycloak 로그인을 한다.)

  5. Keycloak은 인증이 성공하면 액세스 토큰과 리프레시 토큰을 발급하여 클라이언트 애플리케이션으로 리다이렉트한다.

  6. 클라이언트 애플리케이션은 토큰을 저장하고, 이를 사용해 보호된 리소스에 접근할 때마다 서버에 인증 정보를 포함하여 요청을 보낸다.


Keycloak이 무엇인지와 전반적인 Keycloak의 흐름 및 기능에 대해 살펴봤다.

다음 포스팅에서는 여러 SSO 솔루션과 비교하며 왜 Keycloak을 선택했는지를 살펴보도록 하자.


➰ 참고

profile
Cloud Engineer & BackEnd Developer

0개의 댓글