๐ŸŒฑ Infra/KeyCloak

[keycloak ๋ง›๋ณด๊ธฐ #1] Keycloak ๋กœ์ปฌ์—์„œ ๋„์šฐ๊ณ  Realm ๊ฐœ๋… ์ดํ•ดํ•˜๊ธฐ

mini_world 2024. 11. 23. 15:09
๋ชฉ์ฐจ ์ ‘๊ธฐ

 

๊ฐœ์š”

Keycloak์€ ์˜คํ”ˆ์†Œ์Šค(Apache License2.0) ID ๋ฐ ์—‘์„ธ์Šค ๊ด€๋ฆฌ ์†”๋ฃจ์…˜์ด๋‹ค.
์ด๊ฒƒ๋งŒ ์•Œ๊ณ  ์ผ๋‹จ ์‹œ์ž‘ํ•ด๋ณด์ž

 

Keycloak ๋„์ปค๋กœ ๋„์›Œ๋ณด๊ธฐ

Keycloak์€ ์„ค์น˜ ๋งค๋‰ด์–ผ์ด ์ •๋ง ์ž˜๋˜์–ด์žˆ๋‹ค. 
๊ณต์‹๋ฌธ์„œ์— ์ •๋ง ์ž์„ธํžˆ ์ž˜ ์ž‘์„ฑ๋˜์–ด์žˆ์–ด ๋ฌธ์„œ์— ๋”ฐ๋ผ ์ง„ํ–‰ํ•ด๋ณด์ž.

docker run -p 8080:8080 \
          -e KEYCLOAK_ADMIN=admin \
          -e KEYCLOAK_ADMIN_PASSWORD=admin \
          quay.io/keycloak/keycloak:24.0.4 \
          start-dev

docker run ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ keycloak์„ ๋„์šธ ์ˆ˜ ์žˆ๋‹ค. 
http://localhost:8080 ์— ์ ‘์†ํ•˜๊ณ  ๋กœ๊ทธ์ธํ•ด๋ณด์ž. (id/pw: admin/admin)

๋กœ๊ทธ์ธํ›„ ๋ฐ”๋กœ ๋งŒ๋‚˜๊ฒŒ ๋˜๋Š”๊ฒƒ์ด master realm์ด๋‹ค.
master realm์ด ๋ญ”์ง€ ์ƒ์†Œํ•œ๋ฐ, ๊ฐœ๋…์„ ์กฐ๊ธˆ ์‚ดํŽด๋ณด๊ณ  ์ง€๋‚˜๊ฐ€์ž.

 

Realm์ด ๋ญ”์ง€ ์ดํ•ดํ•˜๊ธฐ  ๐Ÿคช

keycloak๋•๋ถ„์— ์ด ์ต์ˆ™์น˜ ์•Š์€ ๋‹จ์–ด realm, "๋ ๋ฆ„".. ์ต์ˆ™ํ•ด์ ธ๊ฐ„๋‹ค.. 

keycloak์—์„œ realm์ด๋ž€ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง„ ๊ด€๋ฆฌ ์˜์—ญ์„ ๋งํ•œ๋‹ค.
realm์ด๋ž€ "์™•๊ตญ" ์ด๋ผ๋Š” ๋œป์œผ๋กœ, ๋ง ๊ทธ๋Œ€๋กœ ํ•˜๋‚˜ ํ•˜๋‚˜์˜ realm์€ ๊ฐ์ž์˜ ์ž์›์ด ๋‚˜๋‰˜์–ด์ ธ์žˆ์–ด, ์‚ฌ์šฉ์ž, ์ •์ฑ… ๋“ฑ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐ๊ฐ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

master realm

๊ทธ์ค‘์— master realm์€, keyclock์„ค์น˜ ์‹œ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ์ตœ์ƒ์œ„ realm์ด๋‹ค.

  • master realm ์˜ ์—ญํ• 
    • ๊ด€๋ฆฌ: Master realm์€ Keycloak ์ธ์Šคํ„ด์Šค ์ „์ฒด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋‹ค๋ฅธ realm์˜ ์ƒ์„ฑ, ์‚ญ์ œ, ์„ค์ • ๋“ฑ์„ ๊ด€๋ฆฌํ•จ
    • ๊ด€๋ฆฌ์ž ์‚ฌ์šฉ์ž: Master realm์—๋Š” Keycloak ๊ด€๋ฆฌ์ž ์‚ฌ์šฉ์ž๊ฐ€ ํฌํ•จ๋จ
    • ๋ชฉ์ : ๋ณด์•ˆ ๋ฐ ๋ถ„๋ฆฌ๋œ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ๋Š” ๋ถ„๋ฆฌ๋˜์–ด, ์‹œ์Šคํ…œ ์ „์ฒด ์„ค์ •์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ ์ฃผ๋กœ ์‚ฌ์šฉ๋จ

์ฆ‰, master realm์ด๋ž€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜๋Š” ๋ชฉ์ ์ด ์•„๋‹Œ, keyclock ์ž์ฒด๋ฅผ ์šด์˜ํ•˜๊ธฐ ์œ„ํ•œ ์˜์—ญ์ด๋‹ค.

 

realm

๊ทธ๋ ‡๋‹ค๋ฉด realm์—๋Š” ๋ฌด์—‡์ด ํฌํ•จ๋˜์–ด์žˆ๊ณ , ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž.

  • realm์˜ ๊ตฌ์„ฑ์š”์†Œ 
    • ์‚ฌ์šฉ์ž(User): ๊ฐ realm์€ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ถ„๋ฆฌ๋œ, ์ž์ฒด ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ฐ€์ง
    • ๊ทธ๋ฃน(Group): ์‚ฌ์šฉ์ž๋ฅผ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์–ด ์—ญํ• ์ด๋‚˜ ๊ถŒํ•œ์„ ๊ทธ๋ฃน ๋‹จ์œ„๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ
    • ํด๋ผ์ด์–ธํŠธ(Client): ํด๋ผ์ด์–ธํŠธ๋Š” Keycloak์— ์˜ํ•ด ๋ณดํ˜ธ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ์„œ๋น„์Šค๋ฅผ ๋งํ•˜๋ฉฐ, ๊ฐ realm์—์„œ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์—ฐ๊ฒฐํ•จ
    • ์—ญํ• (Role):์‚ฌ์šฉ์ž๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์„ ์ •์˜ํ•จ
    • ์•„์ด๋ดํ‹ฐํ‹ฐ ์ œ๊ณต์ž(Identity Providers): ๊ฐ realm์€ ์™ธ๋ถ€ ์•„์ด๋ดํ‹ฐํ‹ฐ ์ œ๊ณต์ž(์˜ˆ: Google, Facebook ๋“ฑ)์™€ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Œ
    • ์ •์ฑ…(Policies): ๊ฐ realm์€ ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ ์ •์ฑ…์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ

realm์—๋Š” ๋…๋ฆฝ์ ์ธ ์‚ฌ์šฉ์ž, ๊ทธ๋ฃน, ํด๋ผ์ด์–ธํŠธ, ์—ญํ•  ๋“ฑ์„ ์ •์˜ํ•˜๋ฉฐ ๋ฉ€ํ‹ฐํ…Œ๋„Œ์‹œ ํ™˜๊ฒฝ์ด๋‚˜ ํ™˜๊ฒฝ๋ถ„๋ฆฌ(๊ฐœ๋ฐœ/ํ”„๋กœ๋•์…˜), ๋˜๋Š” ์„œ๋น„์Šค ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

Realm ๋งŒ๋“ค์–ด ์จ๋ณด๊ธฐ

Realm ๋งŒ๋“ค๊ธฐ (myservice)

์œ„์—์„œ realm ๊ฐœ๋…์— ๋Œ€ํ•ด ์„ค์ •ํ•ด๋ดค์œผ๋‹ˆ, realm์„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด๋ณด์ž.
์—„์ฒญ ๊ฐ„๋‹จํ•˜๋‹ค, keycloak ์˜†์˜ ํ™”์‚ดํ‘œ๋ฅผ ํด๋ฆญํ•˜๋ฉด Create realm์ด ๋‚˜์˜จ๋‹ค. 

์„œ๋น„์Šค ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๊ณ  (myservice) create ํ•˜๋ฉด ๋œ๋‹ค.

์ด์ œ myservice๋ผ๋Š” realm์ด ๋งŒ๋“ค์–ด์กŒ๋‹ค.
์œ„์—์„œ ์„ค๋ช…ํ•œ user, group, client, role, identity providers, polices๋ฅผ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด์ž

 

์‚ฌ์šฉ์ž(user) ๋งŒ๋“ค๊ธฐ

๋จผ์ € ์œ„์—์„œ ์ƒ์„ฑํ•œ myservice realm์—์„œ ์‚ฌ์šฉ์ž๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.
์™ผ์ชฝ ๋ฉ”๋‰ด [Users] -> [create new user] ์—์„œ ์ผ๋‹จ username์„ ๋„ฃ๊ณ  create ํ•œ๋‹ค.   

์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์•„๋ž˜ ํ™”๋ฉด๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์„ค์ •ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ ํƒญ๋“ค์€ ์•„๋ž˜์˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Details (์„ธ๋ถ€ ์ •๋ณด): ์‚ฌ์šฉ์ž UUID, ์ƒ์„ฑ ์‹œ๊ฐ„, ๋กœ๊ทธ์ธ ์‹œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ž‘์—…, ์ด๋ฉ”์ผ ๊ฒ€์ฆ ์—ฌ๋ถ€ ๋“ฑ.
  • Credentials (์ž๊ฒฉ์ฆ๋ช…): ๋น„๋ฐ€๋ฒˆํ˜ธ, ์‚ฌ์šฉ์ž์˜ ์ž๊ฒฉ ์ฆ๋ช… ๋ชฉ๋ก.
  • Role mapping (์—ญํ•  ๋งคํ•‘): ์‚ฌ์šฉ์ž๊ฐ€ ๋ถ€์—ฌ๋ฐ›์€ ์ „์—ญ ์—ญํ• , ํŠน์ • ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ์—ญํ•  ๋งคํ•‘.
  • Groups (๊ทธ๋ฃน): ์‚ฌ์šฉ์ž๊ฐ€ ์†ํ•œ ๊ทธ๋ฃน ๋ชฉ๋ก, ๊ทธ๋ฃน ์ถ”๊ฐ€ ๋ฐ ์ œ๊ฑฐ.
  • Consents (๋™์˜): ์‚ฌ์šฉ์ž๊ฐ€ ๋ถ€์—ฌํ•œ ๋™์˜ ๋ชฉ๋ก, ๋™์˜ ์ฒ ํšŒ.
  • Identity provider links (์•„์ด๋ดํ‹ฐํ‹ฐ ์ œ๊ณต์ž ๋งํฌ): ์™ธ๋ถ€ ์•„์ด๋ดํ‹ฐํ‹ฐ ์ œ๊ณต์ž์™€์˜ ์—ฐ๊ฒฐ ์ •๋ณด, ์—ฐ๊ฒฐ ์ถ”๊ฐ€ ๋ฐ ์ œ๊ฑฐ.
  • Sessions (์„ธ์…˜): ํ˜„์žฌ ์‚ฌ์šฉ์ž์˜ ํ™œ์„ฑ ์„ธ์…˜ ๋ชฉ๋ก, ์„ธ์…˜ ๋กœ๊ทธ์•„์›ƒ ๋ฐ ์„ธ์…˜ ์„ธ๋ถ€ ์ •๋ณด.

์‚ฌ์šฉ์ž(user) ๋กœ๊ทธ์ธ ํ•˜๊ธฐ

๋จผ์ € ์‚ฌ์šฉ์ž๋กœ ๋กœ๊ทธ์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค.
user01์˜ Credentials ํƒญ์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋“ฑ๋กํ•ด์ค€๋‹ค.

๋“ฑ๋ก์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด, ์•„๋ž˜์ฒ˜๋Ÿผ ๋น„๋ฐ€๋ฒˆํ˜ธ ์„ค์ •๋œ๊ฒƒ์ด ํ™•์ธ๋œ๋‹ค.

keycloak์€ ๊ธฐ๋ณธ ์‚ฌ์šฉ์žํŽ˜์ด์ง€๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

* ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธํŽ˜์ด์ง€: http://localhost:8080/realms/myservice/account

์ด์ œ ์œ„์—์„œ ์ƒ์„ฑํ•œ ์‚ฌ์šฉ์ž user01๋กœ ๋กœ๊ทธ์ธํ•œ๋‹ค.

์‚ฌ์šฉ์ž๋กœ ๋กœ๊ทธ์ธํ–ˆ๋‹ค๋ฉด ์‚ฌ์šฉ์ž์ •๋ณด, ๊ณ„์ • ๋ณด์•ˆ์„ค์ •, ๊ทธ๋ฆฌ๊ณ  ์—ฐ๊ฒฐ๋œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชฉ๋ก์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ง€๊ธˆ์€ ์•„๋ฌด๊ฒƒ๋„ ์—ฐ๊ฒฐ๋˜์–ด์žˆ์ง€ ์•Š์•„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์—†๋‹ค.

 

[์ฐธ๊ณ ] ์‚ฌ์šฉ์ž(user) ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ์„ค์ • ๋ณ€๊ฒฝ

๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ํŽ˜์ด์ง€๋Š” realm settings ์—์„œ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
์‚ฌ์šฉ์ž๊ฐ€ ์Šค์Šค๋กœ ๋ฆฌ์†Œ์Šค ๊ถŒํ•œ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ์•ก์„ธ์Šค๋ฅผ ํ—ˆ์šฉํ•ด์ค€๋‹ค๊ฑฐ๋‚˜, ์‚ฌ์šฉ์ž ๊ฐ€์ž…, ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ , ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ธฐ์–ตํ•˜๊ธฐ ๊ธฐ๋Šฅ, ์ด๋ฉ”์ผ ์„ค์ •, ํ…Œ๋งˆ๋ณ€๊ฒฝ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋‹ˆ ํ•œ๋ฒˆ ์ญ‰ ํ™•์ธํ•ด๋ณด๋Š”๊ฒŒ ์ข‹๋‹ค.  

 

Clients ์—ฐ๊ฒฐํ•ด๋ณด๊ธฐ

์ด์ œ Keycloak์—์„œ ์ œ๊ณตํ•˜๋Š” ํ…Œ์ŠคํŠธ ํŽ˜์ด์ง€์™€ ์—ฐ๊ฒฐ์„ ํ•ด๋ณด์ž

๋จผ์ €, [Clients] -> [Create client]๋ฅผ ํด๋ฆญํ•œ๋‹ค. 

์ฒซ๋ฒˆ์งธ ๋‹จ๊ณ„์—์„œ๋Š” ClientID: keycloak_test๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.

๋‘๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” ์†๋Œˆ๊ฒŒ ์—†๋‹ค. ๋‹ค์Œ์œผ๋กœ ๋ฐ”๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

์„ธ๋ฒˆ์งธ ๋‹จ๊ณ„์—์„œ๋Š” ๊ฐ’์„ ๊ฐ๊ฐ ์ž…๋ ฅํ•ด์ค€๋‹ค.

  • Valid redirect URIs: https://www.keycloak.org/app/*
  • Web origins: https://www.keycloak.org

keycloak_test Clients๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋‹ค.

์ด์ œ, KeyCloak์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ํ…Œ์ŠคํŠธ ํŽ˜์ด์ง€(https://www.keycloak.org/app/)์— ์ ‘์†ํ•˜๊ณ ,
realm ์ด๋ฆ„(= myservice)์™€ Client(= keycloak_test)๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.

์ด์ œ [Sign in]์„ ํด๋ฆญํ•ด์„œ Keycloak ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ ๋˜๋Š”์ง€ ํ•œ๋ฒˆ ํ•ด๋ณด์ž!

[Sign in] ์„ ํด๋ฆญํ•˜๋ฉด http://localhost:8080/realms/myservice/protocol/openid-connect/auth?client_id=keycloak_test ์œผ๋กœ ๋ฆฌ๋””๋ ‰์…˜ ๋˜๋ฉฐ, ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜๊ฒŒ ๋œ๋‹ค.

์˜ฌ๋ฐ”๋ฅธ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ–ˆ๋‹ค๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด Hello, ์‚ฌ์šฉ์ž ๊ฐ€ ๋ณด์ผ๊ฒƒ์ด๋‹ค.

 

 

Keycloak ๋ง›๋ณด๊ธฐ #1์—์„œ๋Š” ๊ณต์‹๋ฌธ์„œ๋ฅผ ๋”ฐ๋ผ์„œ ์ง„ํ–‰ํ•˜๋ฉด์„œ, ์ถ”๊ฐ€์ ์œผ๋กœ ์•Œ๋ฉด ์ข‹์€๊ฒƒ๋“ค์„ ์ž‘์„ฑํ•ด๋ดค๋‹ค.
์ด์ œ ๋ง›๋ณด๊ธฐ #2์—์„œ๋Š” google suite๋ž‘ ์—ฐ๊ฒฐํ•˜๊ณ , AWS๊ณ„์ •์ด๋‚˜ VPN ๋“ฑ์„ ์—ฐ๊ฒฐํ•ด๋ณผ ์˜ˆ์ •์ด๋‹ค.

์˜ค๋Š˜๋„ ํ™”์ดํŒ…๐ŸŽ‰ ๋‚ด์ผ๋„ ํ™”์ดํŒ…๐ŸŽ‰ 

728x90