๐ ๊ฐ์
์ธ์ฆ์ Client(์ฌ๋/๊ธฐ๊ธฐ/์ ํ๋ฆฌ์ผ์ด์
๋ฑ)์ ์ ์์ ๊ฒ์ฆํ๋๊ฒ์ ๋งํ๋ค.
Keycloak์ OAuth2.0 ๊ธฐ๋ฐ์ ์ธ์ฆ/์ธ๊ฐ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , Keycloak์์์ ์ธ์ฆ์ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ ์๋์ง ์ด๋ค ๊ธฐ๋ฅ์ด ์๋์ง ์ดํด๋ณด๊ณ ์ ํ๋ค.
๐ ์ธ์ฆ ํ๋ฆ (Authentication flows)
์ธ์ฆ ํ๋ฆ์ด๋?
์ธ์ฆ ํ๋ฆ์ด๋ ํด๋ผ์ด์ธํธ๊ฐ ์์คํ
์ ์ ๊ทผํ ๋ ๊ฑฐ์น๋ ์ธ์ฆ ๋จ๊ณ์ ์์์ ๋ฐฉ๋ฒ์ ์ ์ํ ๊ฒ์ ๋งํ๋ค.
Keycloak์์๋ ์ธ์ฆ ํ๋ฆ์ ์ฌ์ฌ์ฉ ํ ์ ์๋๋ก Template ํํ๋ก ์ ์ํ ์ ์๋ค.
Keycloak์์ ์ธ์ฆ์ ์ด๋ป๊ฒ ์ํํ ์ง ๊ทธ ๋ฐฉ๋ฒ๊ณผ ์์๋ฅผ Authentication Flow๋ก ์ ์ํ๊ณ ,
์ ์๋ Authentication Flow๋ฅผ ํน์ ์ธ์ฆ ์ํฉ์ ์ฐ๊ฒฐ(Bind)ํด์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ค.
Keycloak์์ ์ฌ์ฉํ ์ ์๋ ์ธ์ฆ ํ๋ฆ์ ์๋์ ๊ฐ๋ค. ์ธ์ฆ Flow ํฌํ๋ฆฟ์ ์ ์ํด์ Bindํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
- Browser Flow: ์น ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ ๋ก๊ทธ์ธ์ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ณธ ํ๋ฆ (์ฌ์ฉ์๋ช /๋น๋ฐ๋ฒํธ, OTP, WebAuthn ๋ฑ)
- Client Authentication: ํด๋ผ์ด์ธํธ(์ ํ๋ฆฌ์ผ์ด์ ) ์ธ์ฆ ๋ฐฉ์์ ์ ์ํ๋ ํ๋ฆ
- Direct Grant Flow: ์ฌ์ฉ์ ์๊ฒฉ ์ฆ๋ช ์ ์ง์ API๋ก ์ ์กํ๋ ๋ฐฉ์(REST API ์ธ์ฆ์ฉ)
- Docker Authentication: Docker ๋ ์ง์คํธ๋ฆฌ ์ธ์ฆ์ ์ํ ํน์ ํ๋ฆ
- First Broker Login: ์์ ๋ก๊ทธ์ธ์ด๋ ์ธ๋ถ IDP ์ต์ด ์ฌ์ฉ ์ ๊ณ์ ์ฐ๊ฒฐ ๋ฐฉ์ ์ ์
- Registration Flow: ์ ์ฌ์ฉ์ ๋ฑ๋ก ๊ณผ์ ์์ ์ฌ์ฉ๋๋ ๋จ๊ณ์ ๊ฒ์ฆ์ ์ ์
- Reset Credentials Flow: ๋น๋ฐ๋ฒํธ ์ฌ์ค์ ํ๋ก์ธ์ค๋ฅผ ๊ด๋ฆฌํ๋ ํ๋ฆ
"์ฌ์ฌ์ฉํ๋ค"๋ ์๋ฏธ๋ฅผ ์ ํํ ์ดํดํ ์ ์๊ฒ ์ค์ต์ ํด๋ณด์.
[์ฐธ๊ณ ] OAuth2.0์ ๊ถํ๋ถ์ฌ ์ ํ(Grant Types)๊ณผ ์ด๋ค ๊ด๊ณ๊ฐ ์๋์ง?
์ด์ OAuth2.0 ์ ๋ฆฌํ๋ ํฌ์คํ ์์ ์ฃผ์ ๊ถํ ๋ถ์ฌ ์ ํ์ ๋ํด ์ดํด ๋ดค์๋๋ฐ, ์ด๊ฒ๊ณผ ์ด๋ค ๊ด๊ณ์ธ๊ฑด์ง ํ์ธํ๋ณด์.
Keycloak์ OAuth 2.0/OIDC ํ๋กํ ์ฝ์ ๊ตฌํํ๋ ์ ํ์ด๋ฉฐ, Grant Types๋ฅผ ๊ตฌํํ๊ธฐ ์ํด Authentication Flow๋ฅผ ์ฌ์ฉํ๋ค.
์๋ฅผ๋ค๋ฉด ์๋์ ๊ฐ๋ค.
- Authorization Code Grant: Browser Flow๋ฅผ ํตํด ๊ตฌํ (์ฌ์ฉ์ ๋ก๊ทธ์ธ, ๊ถํ ๋์ ๋ฑ์ ๋จ๊ณ ํฌํจ)
- Client Credentials Grant: Client Authentication Flow๋ฅผ ํตํด ๊ตฌํ (ํด๋ผ์ด์ธํธ ID/์ํฌ๋ฆฟ ๊ฒ์ฆ)
- Resource Owner Password Grant: Direct Grant Flow๋ฅผ ํตํด ๊ตฌํ (์ฌ์ฉ์ ID/๋น๋ฐ๋ฒํธ ์ง์ ๊ฒ์ฆ)
- Device Authorization Grant: HTTP Challenge Flow๋ฅผ ํตํด ๊ตฌํ (๊ธฐ๊ธฐ ์ธ์ฆ ์ฝ๋ ๊ฒ์ฆ)
์ฆ, Grant Type์ OAuth2.0์์ค์์ ์ ์๋ ํ๋กํ ์ฝ ์์ค์ ๋ช ์ธ์ด๊ณ , Keycloak์ Authentication Flow๋ ๊ตฌํ์ฒด์ธ๊ฒ์ด๋ค.
์ธ์ฆ ํ๋ฆ (Authentication flows) ์ค์ตํด๋ณด๊ธฐ
์ด์ Keycloak์ ์คํํด๋ณด์.
์ด์ ํฌ์คํ
์์ Docker๋ก ์คํํ๋๊ฒ๊ณผ K8s(minikube) helm์ผ๋ก ์คํํ๋๊ฒ ๋ชจ๋ ์ค์ตํด๋ณด์๋๋ฐ, ์คํ ๋ฐฉ๋ฒ ํธํ ๋ฐฉ๋ฒ์ผ๋ก ํ์.
# Docker๋ก ์คํํ๊ธฐ
docker run -p 8080:8080 \
-e KEYCLOAK_ADMIN=admin \
-e KEYCLOAK_ADMIN_PASSWORD=admin \
quay.io/keycloak/keycloak:24.0.4 \
start-dev
# k8s(minikube) helm์ผ๋ก ์คํํ๊ธฐ
minikube start
helm install keycloak oci://registry-1.docker.io/bitnamicharts/keycloak \
--set auth.adminUser=admin \
--set auth.adminPassword=admin \
--set postgresql.auth.username=bn_keycloak \
--set postgresql.auth.password=password \
--set postgresql.auth.database=keycloak \
--set postgresql.auth.postgresPassword=password
kubectl port-forward svc/keycloak 8082:80 &
์๋ก์ด Realm์ ๋ง๋ ๋ค. (my-Authentication)
๊ฐ๋
๋ง ์ดํดํ ์์ ์ด๋ ๊ธฐ์กด์ ํ
์คํธ ํ๋ Realm์ ์ฌ์ฉํด๋ ์๊ด์๋ค.

์ด์ ํ
์คํธ๋ฅผ ์ํด ์ฌ์ฉ์๋ฅผ ๋ง๋ค์ด๋ณด์.
๋๋ user01 ์ฌ์ฉ์๋ฅผ ์์ฑํ๋ค. ์ ์ ๋ฅผ ์์ฑํ ํ์๋ ๋ฐ๋์ Credentials์์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ถ๊ฐํด์ฃผ์ด์ผ ํ๋ค.

์ฌ์ฉ์ ๋ก๊ทธ์ธ ํ
์คํธ๋ฅผ ํด๋ณด์.
์ผ์ชฝ ๋ค๋น๊ฒ์ด์
๋ฐ Clients์์ account home URL์ ํด๋ฆญํ๋ฉด ์ฌ์ฉ์ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ค์ด๊ฐ ์ ์๋ค.

์ฌ์ฉ์ ๋ก๊ทธ์ธ ํ์ด์ง์์ ๊ณ์ ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ๊ฒ ๋์ด์๊ณ , ๊ณ์ ์ ๋ณด๋ฅผ ์ ๋ ฅํ๋ฉด ๋ฐ๋ก ๋ก๊ทธ์ธ ํ ์ ์๋ค.


์ด์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ก๊ทธ์ธ์ ํ์ผ๋, ์ธ์ฆ ๋ฐฉ์์ ๋ณ๊ฒฝํด๋ณด์.
์ผ์ชฝ ๋ค๋น๊ฒ์ด์
๋ฐ์์ `Authentication`์ ํด๋ฆญํ์.
์ฌ์ฉ๊ฐ๋ฅํ ์ธ์ฆ Flow๊ฐ ์ ์๋์ด์๋ค.

์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋ค๋๊ฒ์ด ์ด๋ค ์๋ฏธ์ธ์ง ํ ์คํธ ํด๋ณด์. ๋จผ์ Browser Flow๋ฅผ ๋ณต์ ํ๋ค.


์ด์ ์ด ํผ์ ์ข ๋ฐ๊ฟ๋ณด์.
AS-IS, TO-BE๋ฅผ ํ์ธํ๊ณ ๊ทธ๋๋ก ์์ ํด๋ ์ข๊ณ , ์ํ๋ ๋ฐฉ์์ผ๋ก ์์ ํด๋ ๋๋ค.
์๋์ ๊ฒฝ์ฐ์๋ UsernameForm ๋จ๊ณ๋ฅผ ์ถ๊ฐํ๊ณ , OTP๋ฅผ Required๋ก ์ถ๊ฐํ๋ค.

๊ทธ๋ฆฌ๊ณ ๋ฐฉ๊ธ ์์ ํ Form์ Browser flow๋ก ๋ฐ์ธ๋ ํ๋ค.


๊ทธ๋ผ ์ด์ ๋ค์ํ๋ฒ ์ฌ์ฉ์ ๋ก๊ทธ์ธ์ ํตํด ์ธ์ฆ ๋ฐฉ์์ด ์ด๋ป๊ฒ ๋ณ๊ฒฝ ๋์๋์ง ํ์ธํ ์ ์๋ค.
์ด์ ์๋ ๊ณ์ ID์ ๋น๋ฐ๋ฒํธ๋ฅผ ํ๋ฒ์ ์
๋ ฅํ ํ ๋ฐ๋ก ๋ก๊ทธ์ธ ๋์๋๋ฐ,
my-test-browser ํฌํ๋ฆฟ์ผ๋ก ๋ณ๊ฒฝํ ํ ID์
๋ ฅ์ฐฝ, PW์
๋ ฅ์ฐฝ, OTP์ค์ ์ด ๊ฐ์ ๋๊ฒ์ ํ์ธํ ์ ์๋ค.

๐ ์ธ์ฆ ์ ์ฑ (Authentication Policies)
์ธ์ฆ ์ ์ฑ
์ ์ธ์ฆ ๋ฐฉ์์ ๋ํ ์ ์์ด๋ค.
์์์ ์ค๋ช
ํ๋ ์ธ์ฆํ๋ฆ์ด "์ด๋ค ์์๋ก ์ธ์ฆํ ๊ฒ์ธ๊ฐ"์ ๋ํ ์ ์์๋ค๋ฉด,
์ธ์ฆ ์ ์ฑ
์ "์ด๋ป๊ฒ ๋์ํด์ผ ํ๋๊ฐ"๋ฅผ ์ ์ํ๋ ๊ฒ ์ด๋ค.
์ธ์ฆ ์ ์ฑ (Policies) ์ข ๋ฅ

Keycloak์ Authentication์ ์ดํด๋ณด๋ฉด ์ ๋ง ๋ค์ํ ์ธ์ฆ ์ต์ ์ ์ ๊ณตํ๋๊ฒ์ ํ์ธํ ์ ์๋ค.
- Password policy: ๋น๋ฐ๋ฒํธ ๊ธธ์ด, ๋ณต์ก์ฑ, ํน์๋ฌธ์ ์๊ตฌ์ฌํญ ๋ฑ ๋น๋ฐ๋ฒํธ ๊ฐ๋๋ฅผ ์ ์ดํ๋ ์ค์
- OTP Policy: ์ผํ์ฉ ๋น๋ฐ๋ฒํธ ์ธ์ฆ์ ์๊ณ ๋ฆฌ์ฆ, ์๋ฆฟ์, ์ ํจ๊ธฐ๊ฐ ๋ฑ์ ์ค์
- Webauthn Policy: ์์ฒด์ธ์ฆ ๋ฑ FIDO2/WebAuthn ๊ธฐ๋ฐ 2์ฐจ ์ธ์ฆ(MFA)์ ์ํ ์ค์
- Webauthn Passwordless Policy: ๋น๋ฐ๋ฒํธ ์์ด WebAuthn๋ง์ผ๋ก ์ธ์ฆํ ์ ์๋ ์ ์ฑ ์ค์
- CIBA Policy: ํด๋ผ์ด์ธํธ ์ฃผ๋ ๋ฐฑ์ฑ๋ ์ธ์ฆ์ ์๊ฐ์ ํ, ์ธ์ฆ๋ฐฉ์ ๋ฑ์ ์ค์
ํนํ ๋น๋ฐ๋ฒํธ ์ ์ฑ ์ KISAํํ์ด์ง์๋ง ๊ฐ๋ ์ฌ์ฉ ๊ฐ์ด๋๊ฐ ์์ผ๋, ์์ธํ ๋ด์ฉ์ ํจ์คํ๋ค.
[์ฐธ๊ณ ] WebAuthn(Web Authentication)์ด๋?
WebAuthn(Web Authentication)์ ์น ์์์ ๋น๋ฐ๋ฒํธ๋์ ๊ณต๊ฐํค ๋ฐฉ์์ ๋ก๊ทธ์ธ์ ์ง์ํ๋ ์ธ์ฆ ๊ธฐ์ ์ด๋ฉฐ,
2019๋
3์์ W3C(World Wide Web Consortium)์ FIDO ์ผ๋ผ์ด์ธ์ค๊ฐ ๊ณต๋์ผ๋ก ๊ฐ๋ฐํ์ฌ ๊ณต์ ์น ํ์ค์ผ๋ก ์น์ธ๋์๋ค๊ณ ํ๋ค.
- ์๋ ๋ฐฉ์:
- ์ฌ์ดํธ์ ๋ฑ๋กํ ๋:
1. ์ฌ์ฉ์๊ฐ ๋ฑ๋ก์ ์์ํ๋ฉด ์น์ฌ์ดํธ(Keycloak)๊ฐ ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ์ธ์ฆ ์์ฒญ์ ์ ์กํ๋ค.
2. ์ธ์ฆ๊ธฐ(Authenticator- iCloud ํค์ฒด์ธ, ํด๋์ ํ/ํ๋ธ๋ฆฟ์ ๋ณด์ ๋ชจ๋, USB ๋ณด์ํค ๋ฑ)๊ฐ ๊ณ ์ ํ ์ํธํ ํค ์์ ์์ฑํ๋ค.
2. ๊ฐ์ธ ํค๋ ์ธ์ฆ๊ธฐ(Authenticator) ๋ด๋ถ์ ์์ ํ๊ฒ ์ ์ฅ๋๊ณ , ๊ณต๊ฐ ํค๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ์น์ฌ์ดํธ์ ์ ์ก๋์ด ์ฌ์ฉ์ ๊ณ์ ๊ณผ ์ฐ๊ฒฐ๋๋ค. - ๋ก๊ทธ์ธํ ๋:
1. ์น์ฌ์ดํธ๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ์ธ์ฆ ์์ฒญ(challenge)์ ์ ์กํ๋ค.
2. ๋ธ๋ผ์ฐ์ ๋ ์ด ์์ฒญ์ ์ธ์ฆ๊ธฐ(Authenticator)๋ก ์ ๋ฌํ๋ค.
3. ์ฌ์ฉ์๊ฐ ์ง๋ฌธ, ์ผ๊ตด ์ธ์, PIN ์ฝ๋ ๋๋ ๋ฒํผ ํฐ์น ๋ฑ์ผ๋ก ์์ ์ ์ธ์ฆํ๋ฉด, ์ธ์ฆ๊ธฐ๋ ์ ์ฅ๋ ๊ฐ์ธ ํค๋ฅผ ์ฌ์ฉํ์ฌ challenge์ ์๋ช ํ๊ณ ์ด ์๋ช ๋ ์๋ต์ ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ์น์ฌ์ดํธ๋ก ์ ์กํ๋ค.
4. ์น์ฌ์ดํธ๋ ๋ฑ๋ก๋ ๊ณต๊ฐ ํค๋ก ์๋ช ์ ๊ฒ์ฆํ์ฌ ์ฌ์ฉ์๋ฅผ ์ธ์ฆํ๋ค.
- ์ฌ์ดํธ์ ๋ฑ๋กํ ๋:
- ์ฅ์ :
- ํผ์ฑ ๋ฐฉ์ง: ๊ฐ์ง ์น์ฌ์ดํธ๋ ์ค์ ์น์ฌ์ดํธ์ ํค๋ฅผ ๋ณต์ ํ ์ ์์
- ๋น๋ฐ๋ฒํธ ์์: ๊ธฐ์ตํ ๋น๋ฐ๋ฒํธ๊ฐ ํ์ ์์
- ํธ๋ฆฌํจ: ์ง๋ฌธ ํ๋๋ก ๋น ๋ฅด๊ฒ ๋ก๊ทธ์ธ
- ๊ฐ๋ ฅํ ๋ณด์: ๋น๋ฐ๋ฒํธ๋ณด๋ค ํจ์ฌ ํดํนํ๊ธฐ ์ด๋ ค์