## PoC 란
- Proof of Concept
- 기존에 없던 신기술 또는 개념을 새로게 도입할 때 이를 도입하기 위한 검증 과정이다.
- 프로젝트를 진행하다보면 비즈니스 도메인과 관계없는 영역을 추가로 개발하는 경우가 많이 발생하여 외부 시스템 도입을 고려하게 되는데 이럴 때 PoC를 진행하게 된다.
- PoC는 단순 기능 검토 정도에서 머무를수도 있고, 실 운영에 가까운 환경에서도 진행될 수 있다.
## Keycloak PoC를 진행하게 된 이유
- 서비스 제공 애플리케이션을 개발하다보면 항상 나오는 주제는 인증인가와 모니터링이다. 인증인가 부분을 매번 개발할 수는 없고 개발할 리소스가 부족하여 PoC를 진행해보았다.
- (예시) 채널에서 진행 중인 LMS, TheFactory 프로젝트
- PoC 결과는 ISO 9126 품질 특성 기준에 근거하여 작성하였다. ([결론] 항목 참조)
## Keycloak 이란
- keycloak은 ID 및 엑세스 관리 솔루션을 제공하는 오픈소스이다.
- 인증(authntication)과 인가(authorization)을 쉽게 해주고 SSO(Single-Sign-On)을 가능하게 해준다
### SSO(Single-Sign-On) 이란
- 한 번의 로그인을 통해 그와 연결된 여러가지 다른 사이트들을 자동으로 접속하여 이용할 수 있도록 하는 방법이다.
- 일반적으로 개별 사이트는 각각의 사용자 정보를 가지고 있는데 이 정보를 연동하여 사용해야하는 경우가 발생할 수 있다. 이러한 경우 SSO 를 제공하여 각 시스템의 인증 정보를 공유할 수 있다.
## Keycloak 기능
(* 아래 내용은 keycloak.org 홈페이지 메인의 내용을 정리한 것입니다.)
### Single-Sign On
- Keycloak으로 사용자 인증을 수행하면 개별 애플리케이션이 로그인 관련 기능을 별도로 구현할 필요가 없다.
- single-sign out 에도 적용되므로 한 번 로그아웃하면 keycloak을 사용하는 모든 애플르케이션에서 로그아웃 할 수 있다.
### 신원 중개와 소셜 로그인
- keycloak admin에서 소셜네트워크를 등록하기만 하면 간단히 연계가 가능하다. 추가 코드 작성이 필요없다.
### User Federation[^사용자 통합관리 ]
- LDAP, Active Directory를 지원하며, DB를 이용한 자체 사용자 provider 제공도 가능하다.
### Admin Console
- admin console을 사용하여 keycloak server를 중앙에서 관리할 수 있다.
- 다양한 기능을 활성/비활성화 할 수 있고, 인증 정책을 정의할 수 있다.
### Account management Console
- 사용자의 계정관리 페이지를 계정별로 제공한다.
- 계정별 사용자 관리 페이지에서는 프로파일, 패스워드, 2-factor 인증 등의 설정을 변경할 수 있다.
- 사용자 계정의 세션 기록도 조회할 수 있다.
### 표준 프로토콜 지원
- OpenID Connect, SAML 2.0 Identity Provider 도 지원하므로 설정만으로 인증을 수행할 수 있다.
### 인증 서비스
- 역할 기반 인증만으로는 애플리케이션의 요구사항을 충족하지 못할 수도 있다. keycloak은 세분화된 인증 서비스를 제공하며, admin console에서 필요한 정책을 정의할 수 있다.
## Getting started - Docker 편
- 도커가 설치되어있어야 한다.
### 1. 설치 후 로그인 하기
- keycloak 실행
```bash
$ docker run -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:24.0.4 start-dev
```
- 최초 port 는 8080 이며, 관리자 계정은 admin/admin 이다.
### 2. realm 생성
- realm 은 영역, 왕국이란 뜻이지만 '군주, 제후 등의 영향이 미치는 영역' 이라고 생각하면 이해하기 쉽다. realm에 사는 백성들은 세금을 내야한다. getting started 문서에는 'tenant'와 동일하다고 적혀있는데 테넌트는 한국식으로 생각하면 '월세를 내는 장기 세입자' 정도이다. 아마도 애플리케이션 사용에 대한 과금 영역을 구분하기 위해 이런 용어들을 사용하지 않나 싶다.
- admin console에 들어가면 최초에는 master realm이 생성되어있다. master는 관리에만 사용되므로 create Realm 을 클릭하여 신규 realm을 다음과 같이 만든다.
- [myrealm] (실습용입니다)
### 3. 사용자 생성
- 새로 만든 realm을 선택하고 Users 메뉴를 선택하여 사용자를 추가해준다.
- Username : [myuser]
- 초기 패스워드지정은 Credentials 에서 설정한다.
- temporary 옵션을 off 로 하면 이 초기 패스워드를 변경할 필요가 없다.
- account console에 접속한다.
- url : http://localhost:8080/realms/myrealm/account
- account console은 realm을 생성하면 '[keycloak서버]/realms/[realm명]/account'로 url이 만들어지는 듯 하다.
- 생성된 [myuser]로 로그인하면 패스워드 변경등을 할 수 있다.
### 4. 클라이언트 애플리케이션과 연결하기
- 여기서는 https://www.keycloak.org 에서 제공하는 테스트 앱을 이용해본다.
- admin 계정으로 로그인 해야한다.
- Clients 메뉴에서 다음과 같이 정보 입력
- content type : [OpenID Connect]
- client id : [myclient]
- 'Next' 버튼 클릭
- 'Standard flow' 가 활성화 되어있는지 체크
- 'Next' 버튼 클릭
- 다음과 같이 로그인 설정
- Valid redirect URIs to https://www.keycloak.org/app/*
- Web origins to https://www.keycloak.org
### 5. 앱에서 keycloak 으로 로그인 해보기
- 'Valid redirect URIs' 에 설정했던 url로 이동
- https://www.keycloak.org/app/
- 다음과 같이 입력되어있는지 확인 후 save
- Keycloak URL : http://localhost:8080
- Realm : myrealm
- Client : myclient
## 결론
full타입의 PoC라고 보기엔 조금 부족하지만, ISO 9126 품질 특성에 따른 PoC 결과를 적어본다.
### 1. 기능성 Functionality
- 명시적, 묵시적 요구사항을 만족하는 기능을 제공하는가
- 요구사항
- 멀티 테넌트를 지원하는가 : 지원함
- OAuth2외 다양한 인증환경을 제공하는가 : 제공함
- SNS 인증 방식을 구현할 수 있는가 : 가능함
- 자체 DB를 이용한 사용자관리가 가능한가 : 가능함
- 로그인 화면, 프로필 정보, 회원가입 페이지를 제공하는가 :
- 제공함. 커스터마이징 여부는 확인 못함
- 회원가입 페이지는 확인 못함
### 2. 신뢰성 Reliablity
- 규정된 성능을 지속적으로 유지할 수 있는가
- 요구사항
- N/A. 별도 성능 측정도구 사용이 필요함
### 3. 사용성
- 사용자가 얼마나 쉽게 사용할 수 있는지 여부
- 요구사항
- N/A. 별도 사용성 평가 필요함. 개발자 교육 필요함
### 4. 효율성
- 애플리케이션 유지를 위해 필요한 리소스의 양
- 요구사항
- N/A.
- 별도 서버 구성 필요함
- 별도 운영 인력(1인) 필요함. (유지보수 개발자 또는 시스템 보안 담당자)
### 5. 유지보수성
- 변경사항 발생시 얼마나 쉽게 변경할 수 있는가
- 요구사항
- 신규 시스템 추가시 타 시스템 영향도가 없이 추가가 가능한가 : realm 추가로 가능함
### 6. 이식성
- 다른 환경으로 얼마나 쉽게 이전할 수 있는가
- 요구사항
- container(docker)로 운용이 가능한가 : 도커 운용 가능
댓글
댓글 쓰기