Keycloak 에서 인증은 인증 흐름에 따라 ID 인증 방법을 정의하기 위해 그룹화된 일련의 순차적 단계 또는 실행으로 구성된다. 흐름에 따라 인증 요구 사항 및 realm 에 인증을 수행하는 주체의 ID 를 검증하는 단계도 달라진다.
최종 사용자의 경우 인증 흐름은 브라우저를 중개로 사용한다.
클라이언트의 경우 엔드포인트에 대한 백채널 요청을 기반으로 사용한다.
기본적으로 realm 은 최종 사용자 및 클라이언트를 인증하기 위한 가장 일반적인 요구 사항을 처리하는 빌트인 정의(built-in definition)로 생성되며, 사용자 고유의 인증 요구 사항을 수행하기 위해 언제든지 변경하거나 확장할 수 있다. 이는 realm 에서 Authentication 설정을 통해 확인할 수 있다
위를 보면 browser, clients, direct grant 등 다양한 인증 흐름이 존재하며, 커스텀 생성하기위해 기존의 흐름을 복사해서 생성할 수도 있다. 우선 browser 흐름에 대해 알아보자.
위 그림에서 보여지는 스텝은 위에서부터 아래로 순차적으로 진행된다.
앞선 실습에서 패스워드 초기화 및 패스워드 기반으로 로그인하는 방법을 알아보았으니 이에 관련한 실습은 생략한다. Keycloak 은 PBKDF2 알고리즘을 사용하여 브루트 포스(brute-force) 등 공격으로부터 해킹시도를 방지한다. 그러나 해당 알고리즘은 CPU 자원을 많이 사용하는 단점이 있어 필요 시 알고리즘 변경할 수 있다.
또한 사용자에게 패스워드 설정 시 다양한 유형의 정책을 적용할 수 있다. Authentication 에서 Policies 탭으로 넘어가 설정할 수 있다. 아래 이미지는 최소한 대문자 한 개 이상 정책을 추가한 것이다.
만약 사용자가 비밀번호를 잃어버렸다면 다시 찾을 수 있도록 설정할 수도 있다. 이는 Realm Settings 에서 설정이 가능하다.
Keycloak 은 추가 보안 계층으로 이중 인증 요소를 사용할 수 있다. OTP 는 2FA 를 구현하기 위한 유용한 방법이지만, 피시 및 스캠과 같은 공격에 취약하다. 추후 살펴보겠지만, Keycloak 은 WebAuthn 보안 기기를 이중 인증 요소로 사용해 OTP 약점을 보완할 수 있다. 우선 OTP 정책에 대해 살펴보자.
위 정책은 "30초"라는 시간동안 6자리 넘버로 제공되는 코드를 사용한다는 뜻이다. OTP 타입에 Time based 도 있지만 Counter based(다음 카운터가 증가하기 전까지 코드가 유효하다) 를 사용할 수도 있다. Look around window 의 경우 사용자 기기에 나온 코드와 서버에서 제공한 코드와 완전히 동기화되지 않아 일시적으로 코드 싱크가 맞지 않은 경우를 대비해 사용한다. 마지막으로 FreeOTP, Google Authenticator 등을 사용해 사용자는 코드를 생성할 수 있다.
이제 사용자가 OTP 를 설정하는 방법에 대해 알아보자. 사용자를 로그인을 한 뒤 Signing In 탭에서 OTP 를 설정할 수 있다.
위에서 Set up Authenticator application 을 누르면 다음과 같이 나온다.
Google Authenticator 등 어플리케이션으로 QR 코드를 찍으면 코드를 생성할 수 있고, 이후 로그인할 때 다음과 같이 보여진다.
만약 위 Browser 인증 흐름에서 OTP 스텝을 Required 를 설정한다면 유저는 반드시 OTP 를 설정해야된다. 위에서 유저가 만든 OTP 를 제거한 뒤 다시 로그인 처리를 하면 아래 이미지처럼 OTP 를 설정하라는 페이지가 보여진다.
웹 인증, 즉 WebAuthn 프로토콜은 인터넷에서 사용자 인증의 유용성과 보안을 개선하기 위해 사용된다. 즉, 암호화 프로토콜을 사용해 사용자를 인증하기 위해 브라우저를 중개자로 사용하여 서버와 보안 기기가 서로 통신할 수 있는 추가 기능을 제공한다.
WebAuthn 은 비대칭 키(개인키 및 공개키)를 기반으로 사용자의 기기를 안전하게 등록하고 시스템에서 사용자를 인증한다. 보안 기기와 서버 사이의 중개자 역할을 수행함으로써 WebAuthn 은 생체 정보를 통해 해당 기기들을 2FA, MFA 로 활용하거나 보안 기기 이외의 명시적 자격 증명 없이 사용자를 원활하게 인증할 수 있도록 해준다.
우선 Browser 인증 흐름을 복사하여 다음과 같이 만들어준다.
OTP 부분에 하위 스텝인 OTP form 을 제거하고 WebAuthn Authenticator 스텝을 하위 스텝으로 추가해주었다. 이후 Browser 인증 흐름에 바인딩한 후 로그인을 한 뒤 Signing In 탭으로 이동한다. 그럼 아까 보이지 않던 Pass Key 설정이 보인다. Pass Key 를 설정하면 생체 인증 수단 등을 사용해 인증 절차를 수행할 수 있다.
(나는 1password 를 통해 설정할 수 있었다)
이후 로그인을 시도하면 아래와 같이 Passkey 를 사용하여 로그인을 수행해야한다.
일반적으로 강력한 인증이란 사용자를 인증하기 위해 이중 인증(2FA) 또는 다중 인증(MFA) 적용하는 것을 의미한다. 그리고 Keycloak 에서는 이를 활성화하는데 필요한 기능을 제공한다. 특히 생체 인증을 통해 사용자를 안전하게 식별하는 방법이 가장 강력한 인증 유형이다. 또한 사용자의 IP 주소 및 히스토리를 파악해 위험 점수 및 행동을 기반으로 재인증 요청 등을 하는 방법도 존재한다.