λ§ κ·Έλλ‘ Keycloakμ νμ₯ κΈ°λ₯!!! Keycloak Extensions for Korean Social Logins!
μ΄ νλ‘μ νΈλ νκ΅μ μ£Όμ μμ λ‘κ·ΈμΈ μλΉμ€λ€μ Keycloakκ³Ό ν΅ν©ν μ μλ Identity Provider νμ₯μ μ 곡ν©λλ€.
This project provides Keycloak identity provider extensions for popular Korean social login services and international OAuth2 providers.
- Kakao (μΉ΄μΉ΄μ€) - νκ΅μμ κ°μ₯ μΈκΈ° μλ λ©μμ§ νλ«νΌ
- LINE (λΌμΈ) - νκ΅κ³Ό μΌλ³Έμμ λ리 μ¬μ©λλ λ©μμ§ μ±
- Naver (λ€μ΄λ²) - νκ΅μ λνμ μΈ κ²μ μμ§ λ° μΉ ν¬νΈ
- Google - κ΅¬κΈ κ³μ μΌλ‘ λ‘κ·ΈμΈ (OpenID Connect μ§μ)
- GitHub - κΉνλΈ κ³μ μΌλ‘ λ‘κ·ΈμΈ
Keycloak μ΄λ²€νΈλ₯Ό λ€μν λ©μμ§ μμ€ν μΌλ‘ μ€μκ° μ€νΈλ¦¬λ°:
- Kafka - Apache Kafkaλ‘ μ΄λ²€νΈ μ€νΈλ¦¬λ°
- RabbitMQ - RabbitMQ λ©μμ§ νλ‘ μ΄λ²€νΈ μ μ‘
- NATS - NATS λ©μμ§ μμ€ν ν΅ν©
- Redis - Redis Pub/Subλ‘ μ΄λ²€νΈ λ°ν
- MQTT - MQTT λΈλ‘μ»€λ‘ IoT ν΅ν© β¨ NEW
- AWS - AWS SNS/SQSλ‘ μ΄λ²€νΈ μ μ‘
- Azure - Azure Service Bus/Event Grid ν΅ν©
- Resilience Patterns: Circuit Breaker, Retry, Dead Letter Queue, Batch Processing
- Metrics & Monitoring: Prometheus λ©νΈλ¦, μ€μκ° λͺ¨λν°λ§
- Security: TLS/SSL, μΈμ¦, μνΈν μ§μ
- High Performance: λΉλκΈ° μ²λ¦¬, λ°°μΉ μ²λ¦¬, μ°κ²° νλ§
- Production-Ready: μμ ν μλ¬ μ²λ¦¬, λ‘κΉ , ν μ€νΈ 컀λ²λ¦¬μ§
Keycloak Realmμ κ³ κΈ κ΄λ¦¬ κΈ°λ₯ μ 곡:
- κ³μΈ΅ ꡬ쑰: Realm κ° λΆλͺ¨-μμ κ΄κ³ μ€μ
- μ€μ μμ: Identity Provider, Role μλ μμ
- μλ λκΈ°ν: λΆλͺ¨ Realm λ³κ²½μ¬ν μλ μ ν
- REST API: κ³μΈ΅ ꡬ쑰 κ΄λ¦¬μ© μμ ν REST API
- μ΄λ²€νΈ κΈ°λ°: Realm λ³κ²½ μλ κ°μ§ λ° μ²λ¦¬
μ¬μ© μ¬λ‘:
- μν°νλΌμ΄μ¦ SaaS (λκΈ°μ β μνμ¬ β μ§μ¬)
- λ©ν°ν λνΈ νλ«νΌ (νλ«νΌ β ν λνΈ β νκ²½)
- λκ·λͺ¨ μ‘°μ§ (λ³Έμ¬ β λΆμ β ν)
μμΈν λ΄μ©μ Realm Hierarchy λ¬Έμλ₯Ό μ°Έμ‘°νμΈμ.
κΉλνκ³ λͺ¨λν κΈ°μ νκ²½μ© Keycloak λ‘κ·ΈμΈ ν λ§ μ 곡:
- λ―Έλλ© λμμΈ: κΉλνκ³ μ λ¬Έμ μΈ UI
- λ°μν μ§μ: λ°μ€ν¬ν±, νλΈλ¦Ώ, λͺ¨λ°μΌ μλ²½ λμ
- λ€κ΅μ΄ μ§μ: μμ΄, νκ΅μ΄, μΌλ³Έμ΄
- μμ λ‘κ·ΈμΈ μ€νμΌλ§: Kakao, Naver, Google, GitHub, LINE λ±
- μ κ·Όμ±: WCAG 2.1 AA μ€μ
- 컀μ€ν°λ§μ΄μ§: μμ, λ‘κ³ , λ°°κ²½ μ½κ² λ³κ²½ κ°λ₯
μμΈν λ΄μ©μ ν λ§ λ¬Έμλ₯Ό μ°Έμ‘°νμΈμ.
- κ° νλ«νΌκ³Όμ μμ ν OAuth2 ν΅ν©
- μλ μ¬μ©μ μμ± λ§€ν
- νλ‘ν μ΄λ―Έμ§, μ΄λ©μΌ λ± μ¬μ©μ μμ± μ§μ
- 컀μ€ν μμ± λ§€νΌ μ§μ
- ν¬κ΄μ μΈ μλ¬ μ²λ¦¬λ‘ νλ‘λμ νκ²½ λμ
- λͺ¨λ μ»΄ν¬λνΈμ λν λ¨μ ν μ€νΈ
- GitHub Actions CI/CD νμ΄νλΌμΈ μ§μ
- Keycloak 26.3.1 μ΄μ
- Java 21 μ΄μ
- Gradle 8.8 (wrapper ν¬ν¨)
-
μ μ₯μ ν΄λ‘ :
git clone https://github.com/yourusername/sb-keycloak-exts.git cd sb-keycloak-exts -
λͺ¨λ provider λΉλ:
./gradlew shadowJar
-
JAR νμΌ μμ± μμΉ:
Identity Providers:
idps/idp-kakao/build/libs/idp-kakao-*-all.jaridps/idp-line/build/libs/idp-line-*-all.jaridps/idp-naver/build/libs/idp-naver-*-all.jaridps/idp-google/build/libs/idp-google-*-all.jaridps/idp-github/build/libs/idp-github-*-all.jar
Event Listeners:
events/event-listener-kafka/build/libs/keycloak-kafka-event-listener-*-all.jarevents/event-listener-rabbitmq/build/libs/keycloak-rabbitmq-event-listener-*-all.jarevents/event-listener-nats/build/libs/keycloak-nats-event-listener-*-all.jarevents/event-listener-redis/build/libs/keycloak-redis-event-listener-*-all.jarevents/event-listener-mqtt/build/libs/keycloak-mqtt-event-listener-*-all.jarβ¨events/event-listener-aws/build/libs/keycloak-aws-event-listener-*-all.jarevents/event-listener-azure/build/libs/keycloak-azure-event-listener-*-all.jar
Realm Management:
realms/realm-hierarchy/build/libs/realm-hierarchy-*-all.jarβ¨
Corporate Themes:
themes/build/libs/keycloak-theme-corporate-clean.jarπ¨themes/build/libs/keycloak-theme-corporate-base.jar
-
μνλ νμ₯ JARλ₯Ό Keycloakμ 볡μ¬:
# Identity Providers cp idps/idp-*/build/libs/*-all.jar $KEYCLOAK_HOME/providers/ # Event Listeners (μ νμ¬ν) cp events/event-listener-*/build/libs/*-all.jar $KEYCLOAK_HOME/providers/ # Corporate Themes (μ νμ¬ν) π¨ cp themes/build/libs/*.jar $KEYCLOAK_HOME/providers/
-
Keycloak λΉλ λ° μ¬μμ:
$KEYCLOAK_HOME/bin/kc.sh build $KEYCLOAK_HOME/bin/kc.sh start
-
(ν λ§ μ¬μ© μ) Keycloak κ΄λ¦¬ μ½μμμ ν λ§ μ€μ :
- Realm Settings β Themes β Login Theme:
corporate-cleanμ ν
- Realm Settings β Themes β Login Theme:
κ° μμ νλ«νΌμμ μ ν리μΌμ΄μ μ μμ±ν΄μΌ ν©λλ€:
- Kakao: Kakao Developers Console
- LINE: LINE Developers Console
- Naver: Naver Developers Console
- Google: Google Cloud Console
- GitHub: GitHub Developer Settings
μμΈν μ€μ λ°©λ²μ κ° providerμ READMEλ₯Ό μ°Έμ‘°νμΈμ:
- Kakao μ€μ κ°μ΄λ
- LINE μ€μ κ°μ΄λ
- Naver μ€μ κ°μ΄λ
- Google μ€μ κ°μ΄λ
- GitHub μ€μ κ°μ΄λ
- Keycloak κ΄λ¦¬ μ½μ λ‘κ·ΈμΈ
- Realm μ ν
- Identity Providers λ©λ΄λ‘ μ΄λ
- Add provider λλ‘λ€μ΄ ν΄λ¦
- μνλ provider μ ν (Kakao, LINE, Naver, Google, λλ GitHub)
- Provider μ€μ μ λ ₯
κ° providerλ λ€μ νμμ redirect URIλ₯Ό μ€μ ν΄μΌ ν©λλ€:
https://your-keycloak-domain.com/realms/{realm}/broker/{provider}/endpoint
{provider}λ kakao, line, naver, google, λλ github μ€ νλμ
λλ€.
λͺ¨λ λ¨μ ν μ€νΈ μ€ν:
./gradlew testνΉμ provider ν μ€νΈ:
./gradlew :idps:idp-kakao:test
./gradlew :idps:idp-line:test
./gradlew :idps:idp-naver:test
./gradlew :idps:idp-google:test
./gradlew :idps:idp-github:testEvent Listener λͺ¨λλ€μ TestContainers κΈ°λ° ν΅ν© ν μ€νΈλ₯Ό μ 곡ν©λλ€:
ν΅ν© ν μ€νΈ μ€ν (Docker νμ):
# Kafka ν΅ν© ν
μ€νΈ
./gradlew :events:event-listener-kafka:integrationTest
# RabbitMQ ν΅ν© ν
μ€νΈ
./gradlew :events:event-listener-rabbitmq:integrationTest
# Redis ν΅ν© ν
μ€νΈ
./gradlew :events:event-listener-redis:integrationTest
# NATS ν΅ν© ν
μ€νΈ
./gradlew :events:event-listener-nats:integrationTest
# MQTT ν΅ν© ν
μ€νΈ (μ νμ¬ν - ꡬν κ°λ₯)
# ./gradlew :events:event-listener-mqtt:integrationTestμ£Όμμ¬ν:
- ν΅ν© ν μ€νΈλ Dockerκ° μ€ν μ€μ΄μ΄μΌ ν©λλ€
- TestContainersκ° μλμΌλ‘ 컨ν μ΄λλ₯Ό μμ/μ€μ§ν©λλ€
- CI/CD νμ΄νλΌμΈμμλ λ¦΄λ¦¬μ¦ μμλ§ μλ μ€νλ©λλ€
- μλ μ€ν μ: GitHub Actions β integration-tests μν¬νλ‘μ° β "Run workflow" ν΄λ¦
Identity Providers (λ¨μ ν μ€νΈ):
- OAuth2 νλ‘μ° ν μ€νΈ
- μ¬μ©μ νλ‘ν λ§€ν ν μ€νΈ
- μλ¬ μ²λ¦¬ μλλ¦¬μ€ ν μ€νΈ
- JSON νμ± λ° λ°μ΄ν° λ³ν ν μ€νΈ
Event Listeners (ν΅ν© ν μ€νΈ):
- 컨ν μ΄λ μμ λ° μ°κ²° νμΈ
- λ©μμ§ λ°ν/ꡬλ ν μ€νΈ
- Keycloak Realm μ€μ κ²μ¦
- μ±λ₯ ν μ€νΈ (λ©μμ§ μ²λ¦¬λ)
- Keycloak μ΄λ²€νΈ β λ©μμ§ μμ€ν E2E ν μ€νΈ
sb-keycloak-exts/
βββ .github/
β βββ workflows/ # GitHub Actions μν¬νλ‘μ°
β βββ ci.yml # CI νμ΄νλΌμΈ
β βββ release.yml # λ¦΄λ¦¬μ¦ μλν
βββ build.gradle # λ£¨νΈ λΉλ μ€μ
βββ gradle.properties # Gradle μμ±
βββ settings.gradle # λ©ν° λͺ¨λ μ€μ
βββ idps/ # Identity providers λͺ¨λ
βββ build.gradle # IDP λͺ¨λ μ€μ
βββ idp-kakao/ # Kakao provider
β βββ src/
β β βββ main/ # μμ€ μ½λ
β β βββ test/ # ν
μ€νΈ μ½λ
β βββ README.md # Kakao μ€μ κ°μ΄λ
βββ idp-line/ # LINE provider
β βββ src/
β β βββ main/ # μμ€ μ½λ
β β βββ test/ # ν
μ€νΈ μ½λ
β βββ README.md # LINE μ€μ κ°μ΄λ
βββ idp-naver/ # Naver provider
β βββ src/
β β βββ main/ # μμ€ μ½λ
β β βββ test/ # ν
μ€νΈ μ½λ
β βββ README.md # Naver μ€μ κ°μ΄λ
βββ idp-google/ # Google provider
β βββ src/
β β βββ main/ # μμ€ μ½λ
β β βββ test/ # ν
μ€νΈ μ½λ
β βββ README.md # Google μ€μ κ°μ΄λ
βββ idp-github/ # GitHub provider
βββ src/
β βββ main/ # μμ€ μ½λ
β βββ test/ # ν
μ€νΈ μ½λ
βββ README.md # GitHub μ€μ κ°μ΄λ
-
Providerκ° Keycloakμ λνλμ§ μμ
- JAR νμΌμ΄ μ¬λ°λ₯Έ λλ ν 리μ μλμ§ νμΈ
- Keycloak λ‘κ·Έμμ λ‘λ© μ€λ₯ νμΈ
- shadowJarλ‘ λΉλνλμ§ νμΈ
-
μΈμ¦ μ€ν¨
- Client IDμ Secretμ΄ μ¬λ°λ₯Έμ§ νμΈ
- Redirect URI μ€μ νμΈ
- μμ νλ«νΌμμ νμν κΆνμ΄ νμ±νλμλμ§ νμΈ
-
CI/CD νμ΄νλΌμΈ β μλ£
- GitHub Actions μν¬νλ‘μ° κ΅¬μ±
- μλ ν μ€νΈ λ° λ°°ν¬
- λ€μ€ Java λ²μ ν μ€νΈ (17, 21)
-
μΆκ° IDP ꡬν π μ§νμ€
- Google β μλ£
- GitHub β μλ£
- Discord (https://github.com/wadahiro/keycloak-discord)
- Apple (https://github.com/klausbetz/apple-identity-provider-keycloak)
- κ³΅ν΅ μ½λ μΆμΆνμ¬ μ€λ³΅ μ κ±°
-
μ΄λ²€νΈ 리μ€λ β μλ£
- Kafka β
- RabbitMQ β
- NATS β
- Redis β
- MQTT β NEW
- AWS SNS/SQS β
- Azure Service Bus/Event Grid β
- Resilience patterns μμ ꡬν
- Production-ready νμ§
-
보μ λ° λͺ¨λν°λ§
- λ‘κΉ νλ μμν¬ μΆκ°
- λ©νΈλ¦ μμ§ κΈ°λ₯
-
ν λ§ μ§μ
- Keycloakify ν΅ν© (https://www.keycloakify.dev/)
- νκ΅μ΄ UI κ°μ
μ΄ νλ‘μ νΈλ Semantic Versioningμ λ°λ¦ λλ€.
릴리μ¦λ GitHubμ νκ·Έ κΈ°λ°μΌλ‘ μλνλμ΄ μμ΅λλ€:
git tag v1.0.0
git push origin v1.0.0νκ·Έ νΈμ μ GitHub Actionsκ° μλμΌλ‘:
- λΉλ λ° ν μ€νΈ μ€ν
- Shadow JAR μμ±
- GitHub Release μμ±
- JAR νμΌ μ λ‘λ
μ΄ νλ‘μ νΈλ Apache License 2.0μΌλ‘ λ°°ν¬λ©λλ€.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
Copyright 2025 ScriptonBasestar
κΈ°μ¬λ₯Ό νμν©λλ€! Pull Requestλ₯Ό 보λ΄μ£ΌμΈμ.