Programming-[Backend]/Keycloak

Keycloak - 9. 사용자 관리, LDAP 통합, Social Login

컴퓨터 탐험가 찰리 2024. 8. 7. 20:06
728x90
반응형

KeyCIoak - 모던 애플리케이션을 위한 ID 및 접근관리 | 에이콘출판(주) | 스티안 토르거센, 페드로 이고르 실바 지음, 최만균 옮김

서적을 참고하여 요약한 시리즈 글이다.

 


 

 

 

 

* 이전 글들에서 사용했던 ssl로 접속하는 production용 서버들말고, 기존에 생성했던 8080 포트의 dev용 서버를 사용한다.

 

 

 

 

 

 

1. 로컬 사용자 관리

 

여기서 로컬 사용자란 Keycloak 데이터베이스에 저장된 사용자를 의미한다.

 

1.1 사용자 생성

신규 사용자 생성은 이미 앞 글들에서 진행했었다. Keycloak 콘솔에서 Users에 들어가서 Add User로 생성하면 된다.

 

 

 

이번에도 alice 라는 이름의 사용자를 생성해본다.

 

사용자를 생성하는 경우 기존 realm에 포함된다. realm에 생성된 사용자는 자신이 속한 realm을 통해서만 인증을 수행할 수 있다.

 

이렇게 사용자에 대한 정보를 관리자가 받아서 생성해줄 수도 있지만, 사용자가 자신의 realm에 직접 등록하도록 허용하거나 인증 프로세스의 일부로 사용자에게 정보를 요청할 수도 있다.

 

그리고 테스트를 해보니, master realm에 만든 사용자에게 아래 1.3.1의 Required User Actions를 적용하고, 로그인하여 정보 변경을 시도하니 리다이렉트가 정상적으로 되지 않는 문제가 발생했다. 로컬 설정 문제일 수도 있는데, myrealm을 따로 만들고 거기에 사용자를 만들어서 같은 작업을 하니 정상적으로 처리되는 것을 보아서, 되도록이면 master realm에서의 작업은 피하는게 좋을 것 같다는 생각이 든다.

 

1.2 사용자 자격 증명 관리

사용자는 패스워드, 일회용(one-time) 키, 보안 기기, X.509 인증서 등을 이용해서 인증할 수 있다.

 

Credentials 탭에서 Set Password로 비밀번호를 생성하면 된다. Temporary 토글은 사용자 로그인 시 사용자가 비밀번호를 재설정 할 수 있도록 하는 옵션이다.

 

 

이렇게 설정된 패스워드로 로그인 할 수 있다. 앞선 글들에서 살펴봤으니 이 부분은 넘어간다.

 

1.3 사용자 정보 획득 및 검증

1.3.1 Required User Actions

만약 사용자에 대한 추가 정보가 필요하다면 required user actions를 선택하여 사용자에게 요청하면 된다.

 

몇 가지 주요 액션은 다음과 같다.

  • Verify Email: 이메일이 사용자의 소유가 맞는지 검증하기 위해서 사용자에게 이메일 전송
  • Update Password: 사용자에게 패스워드 업데이트 요청
  • Update Profile: 사용자에게 이름 및 이메일 정보를 통해 프로필 업데이트 요청

 

실습

관리자로서 alice에 접근하여 update profile 요청을 날려보자. update profile 선택 후 save를 누른다.

 

sign out 후 alice로 로그인해본다. 그럼 아래와 같은 창이 뜨면서 추가 정보를 입력하도록 요청한다.

 

1.4 자동 등록 활성화

Realm Settings -> Login -> User registration을 활성화하면 된다.

 

사용자가 직접 회원 가입을 할 수 있다.

 

1.5 사용자 속성 관리

 

Keycloak은 속성값(attribute)을 통해 사용자의 추가적인 메타 데이터를 관리할 수 있도록 해준다. 앞선 글들에서 살펴본 것처럼 이 속성 값들을 기준으로 사용자를 식별하고 인증할 수 있으며, 토큰을 검사하기 위해서도 사용할 수 있다.

 

책에서는 Users -> 사용자 클릭 -> Attributes에 들어가서 설정할 수 있다고 나오는데, 버전 업이 되면서 바뀐 것 같다. Realm Settings -> User Profile에 가서 Attribute를 추가하는 것이 가능하다.

 

 

2. LDAP 및 액티브 디렉터리 통합

 

LDAP(Lightweight Directory Access Protocol)는 네트워크상에서 조직이나 개인, 파일, 디바이스 등을 찾아볼 수 있게 해주는 소프트웨어 프로토콜이다. 보통 LDAP를 이용한 데이터 서버는 트리 구조로 이루어진 계층형 데이터베이스 형태로 사용한다.

 

액티브 디렉터리는 사용자와 컴퓨터에 대한 정보를 단일 디렉토리로 관리하는 목적으로 사용하는 툴이다. Single Sign On이 해주는 역할처럼 여러 애플리케이션에 일일이 로그인을 할 필요가 없게 만들어준다.

 

이 장에서는 LDAP, 액티브 디렉터리를 사용하고 있는 시스템을 Keycloak에 통합하는 방법을 이야기한다.

 

2.1 User Federation

관리 콘솔 좌측의 User Federation 항목은 외부 ID 저장소와 통합하는 기능을 의미한다. Keycloak은 액티브 디렉터리를 포함한 대부분의 LDAP 벤더를 지원한다.

 

2.1.1 Import Users

User Federation -> Add Ldap federation -> 아래 쪽에 Import Users 토글이 있다.

 

 

이 항목은 Keycloak이 LDAP 서버를 데이터베이스에 취합할 것인지에 대한 여부를 정의한다. 이 설정은 사용자가 LDAP 공급자를 이용하여 인증할 때마다 사용자에 대한 정보가 데이터베이스에 유지되도록 활성화한다. 기본적으로 ON 이며 이렇게 데이터베이스에 사용자 정보가 남아야 Keycloak의 모든 기능들을 사용할 수 있게 된다. LDAP 프로토콜을 통해 인증하고, 데이터베이스에 등록된 사용자는 federated user로 등록된다. 이를 통해 keycloak은 local userfederated user를 구분한다.

 

 

2.1.2 Edit mode

edit mode는 LDAP 디렉터리에 데이터를 읽고 쓰는 방법을 관리하기 위한 키동기화 설정을 의미한다.

 

READ_ONLY

LDAP 디렉터리를 읽기 전용으로 사용하는 모드이다. federated user에 대한 변경 사항은 LDAP 디렉터리에 업데이트 되지 않는다. LDAP를 그대로 이용하되, Keycloak으로는 보안 인프라만 이용하고자하는 경우 이 설정이 적합하다.

 

WRITABLE

사용자 정보의 변경 사항이 LDAP 디렉터리에도 반영되는 방식이다. Keycloak을 통해 ID 관리를 중앙 집중화 할려는 경우 적용하면 된다. 이외에도 Periodic full sync, read timeout 등 동기화와 관련한 설정들을 통해 동기화 프로세스를 조절할 수 있다.

 

 

 

2.2 LDAP 매퍼

LDAP 매퍼는 LDAP 공급자와 Keycloak간 정보를 매핑해주는 도구이다. 책에서는 LDAP Mapper를 바로 생성할 수 있는 것처럼 기술되어있는데, 공식 문서에는 그런 내용이 없다. 게다가 공식 문서에서는 LDAP Mapper는 LDAP의 Edit mode, Vendor 등의 설정이 완료돼야 mapper가 생성된다고 한다. 이럴려면 연결 URL도 지정해줘야해서 LDAP 샘플이 하나 있어야할 것 같다.

 

아래 페이지의 Edit Mode 부분을 참고해서 향후 필요할 때 공부하면 될 것 같다. https://www.keycloak.org/docs/latest/server_admin/

 

 

 

3. 서드파티 ID 제공자와 통합

 

Keycloak에서 제공하는 보안 프로토콜에 따라서 두 가지 주요 유형의 ID 제공자와 통합이 가능하다.

  • SAML v2
  • OpenID Connect v1.0

이 중 OpenID Connect v1.0 공급자를 생성하는 방법에 대해 알아본다.

 

3.1 OpenID Connect ID 제공자 생성

 

예시를 위해 아예 다른 ID 제공자 서비스를 사용하지는 않고, OpenID Connect 제공자로써 Keycloak 서버의 다른 realm이 있다고 가정하고 실습을 진행한다. 하지만 OpenID Connect 규약을 지킨 제공자 서비스라면 통합이 가능하다는 점을 인지하고 다음 실습을 진행해본다.

 

 

3.1.1 실습

신규 realm에 사용자 정보 생성

'third-party-provider' realm을 생성한다. 그리고 아래 내용으로 클라이언트도 생성한다.

  • Client ID: broker-app
  • Root URL: http://localhost:8080/realms/myrealm/broker/oidc/endpoint
  • Access Type: Credentials

유저 생성

  • Username: third-party-user
  • Password: 지정해주기

 

기존 myrealm에 ID Provider 등록

myrealm - 좌측 하단 Identity providers - OpenID connect v1.0을 선택한다. 그리고 여기서 discovery document를 third-party-provider의 검색 문서 위치로 지정해준다. 그리고 나머지 항목들도 다음과 같이 설정해준다.

  • Display Name: My Thrid-Party Provider
  • Client Authentication: Client secret sent as post
  • Client ID: broker-app
  • Client Secret: <third-party-provider client의 CLIENT SECRET>
  • Discovery endpoint: http://localhost:8080/realms/third-party-provider/.well-known/openid-configuration (만약 이전 글의 keycloak container를 계속 사용하고 있다면 https://로 접근해야함)

Discovery endpoint를 입력하면 계속 요청을 보내면서 endpoint에서 OK response가 오는지 계속 체크한다.

 

 

 

이후에 http://localhost:8080/realms/myrealm/account로 접속하면 아래처럼 로그인 화면에 My Thrid Party Provider 버튼이 생긴 것을 확인할 수 있다.

 

 

이후 기존에 생성한 third-party-user로 로그인하면 User profile 업데이트 화면 이후 정상 로그인이 되는 것을 확인할 수 있다.

 

추가로 알아야할 내용: 토큰 저장

Keycloak에 ID 제공자에서 발행하는 토큰을 저장해놓고 token exchange 기능을 사용하면 ID 제공자의 보호된 API에 접근할 수 있게 된다.

 

 

 

4. 소셜 ID 제공자와 연동

 

잘 알려진 소셜 ID 제공자와 연동을 공부해본다. Identity Provider 메뉴에서 진행할 수 있다. 실습으로는 github으로 연동해볼 것이다.

 

github에 접속해서 profile -> settings -> developer settings -> OAuth 메뉴에서 OAuth App을 생성해줘야한다. 그리고 생성된 client ID 및 client secret 값을 keycloak에 붙여넣어주면 된다.

 

그리고 아래쪽 화면에 Homepage URL과 Authorization callback URL을 아래 그림처럼 설정해주었다.

 

 

이제 Keycloak 콘솔에서 로그아웃 후 로그인 페이지로 돌아가보면 github 로그인이 추가된 것을 볼 수 있다.

 

 

 

5. 사용자 데이터 관리

 

Keycloak 계정 콘솔을 통해서 사용자들이 자신의 정보를 관리할 수 있도록 해본다. 다음과 같은 작업들을 수행할 수 있다.

  • 프로필 업데이트
  • 패스워드 업데이트
  • 2차 인증 활성화
  • 인증된 애플리케이션을 포함해 애플리케이션 보기
  • 다른 세션에서 원격으로 로그아웃하는 것을 포함해 열려 있는 세션 보기

 

일반 사용자로 로그인했을 때 접속되는 홈페이지가 계정 콘솔 페이지이다.

 

 

계정 콘솔도 일반 애플리케이션으로 분류된다. Keycloak은 사용자가 접근할 수 있도록 하고, 관리하기 위해서 account client 를 자동으로 생성한다. 그리고 사용자가 생성된 경우 manage-account 클라이언트 역할이 자동으로 부여된다. 이 역할을 통해서 사용자가 계정 콘솔에 접근이 가능한지 여부를 결정하며 관리할 수 있게 된다.

 

지금은 간단한 화면 뿐이지만, 나중에 계정 정보를 다루는 방법을 추가로 배운다.

728x90
반응형