Keycloak - Kakao Identity Provider
ํตํฉ ์ธ์ฆ์ ์ํ IAM ์คํ์์ค์ธ ํคํด๋ก(Keycloak)์์ ์นด์นด์ค ์์ ํ๋ก๋ฐ์ด๋๋ฅผ IdP(Identity Provider)๋ก ๋ ๋ฆ(Realm)์ ์ถ๊ฐํ๊ณ ์นด์นด์ค ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธํ์ฌ ์ฌ์ฉ์๋ฅผ ์ธ์ฆํด๋ณด๋๋ก ํ์. ์ฐ์ ์นด์นด์ค ์์ ํ๋ก๋ฐ์ด๋๋ OpenID Connect ๊ท๊ฒฉ์ ์ง์ํ๊ณ ์์ผ๋ฏ๋ก ํคํด๋ก์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํด์ฃผ๊ณ ์๋OpenID Connect v1.0 ํ๋ก๋ฐ์ด๋ ๋ฐฉ์์ผ๋ก ์ถ๊ฐํ์ฌ ๋ก๊ทธ์ธ ํ๋ฉด์ ์ ํ ์ต์ ์ผ๋ก ๋ ธ์ถ์ํฌ ์ ์๋ค.
์นด์นด์ค ๋ก๊ทธ์ธ์ ์ํ REST API ํค์ ํด๋ผ์ด์ธํธ ์ํฌ๋ฆฟ
์ฐ์ , ์นด์นด์ค ๋ํ ๋กํผ์ค์ ์นด์นด์ค ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธํ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๊ณ ์นด์นด์ค ๋ก๊ทธ์ธ์ ๋ํ ์ค์ ์ ์งํํ์. ํคํด๋ก์์ OpenID Connect Provider ์ค์ ์ ์ ๋ ฅํ ํด๋ผ์ด์ธํธ ์์ด๋์ ํด๋ผ์ด์ธํธ ์ํฌ๋ฆฟ ์ ๋ณด๋ฅผ ๋ค์์ ๋ฉ๋ด์์ ํ์ธํ๋๋ก ํ์. ํด๋ผ์ด์ธํธ ์ํฌ๋ฆฟ์ ์ฝ๋ ๊ตํ ๊ณผ์ ์์๋ ๋ ธ์ถ๋์ง ์์ผ๋ฉฐ ์ฌ์ฉ์ ์ธ์ฆ ํ ์ฝ๋๋ฅผ ํตํด ID ํ ํฐ์ ๋ฐ๊ธ๋ฐ๊ธฐ ์ํด์ ์ฌ์ฉ๋๋ค.
- Client ID : ๋ด ์ ํ๋ฆฌ์ผ์ด์ โ ์ฑ ์ค์ โ ์ฑ ํค (REST API ํค)
- Client Secret : ๋ด ์ ํ๋ฆฌ์ผ์ด์ โ ์ ํ ์ค์ โ ์นด์นด์ค ๋ก๊ทธ์ธ โ ๋ณด์ (Client Secret)
ํคํด๋ก์ ์นด์นด์ค OpenID Connect Provider ์ถ๊ฐ
Identity Providers ๋ชฉ๋ก์์OpenID Connect v1.0์ ์ ํํ๊ณ Discovery endpoint ์ ์นด์นด์ค ๋ก๊ทธ์ธ์ OpenID Connect Discovery Metadata ์ฃผ์๋ฅผ ์ ๋ ฅํ๊ฒ ๋๋ฉด ํคํด๋ก์์๋ OpenID Connect ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์์ ์๋์ผ๋ก ์ ๋ ฅํด์ค๋ค. ๊ทธ๋ฆฌ๊ณ ์์ ์นด์นด์ค ๋ํ ๋กํผ์ค์์ ํ์ธํด๋์๋ REST API ํค์ ํด๋ผ์ด์ธํธ ์ํฌ๋ฆฟ์ ์ ๋ ฅํ๋๋ก ํ์.
- Client ID : ๋ด ์ ํ๋ฆฌ์ผ์ด์ โ ์ฑ ์ค์ โ ์ฑ ํค (REST API ํค)
- Client Secret : ๋ด ์ ํ๋ฆฌ์ผ์ด์ โ ์ ํ ์ค์ โ ์นด์นด์ค ๋ก๊ทธ์ธ โ ๋ณด์ (Client Secret)
- Client assertion signature algorithm : RS256 (Optinal)
์นด์นด์ค์์๋ ์๋ช ์๊ณ ๋ฆฌ์ฆ์ผ๋ก RS256 ํ๊ฐ์ง๋ฅผ ์ง์ํ๋ฏ๋ก ๊ตณ์ด ์ ํํ ํ์๋ ์์ต๋๋ค.
์นด์นด์ค ๋ก๊ทธ์ธ OpenID Connect ํ์ฑํ ์ค์ ๋ฐ Redirect URI ์ถ๊ฐ
์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํ ์ค์ ์์ ์นด์นด์ค ๋ก๊ทธ์ธ๊ณผ OpenID Connect ์ต์ ์ ํ์ฑํํ๊ณ ํคํด๋ก์ ์ถ๊ฐํ IdP ๋ธ๋ก์ปค์ ํ์๋๋Redirect URI ์ฃผ์๋ฅผ ์นด์นด์ค ๋ก๊ทธ์ธ์ Redirect URI ๋ชฉ๋ก์ ์ถ๊ฐํ๋ฉด ๋๋ค.
์ฝ๋ ๊ตํ ๊ณผ์ ์์ PKCE ์ฌ์ฉํ๊ธฐ
์นด์นด์ค ์์ ํ๋ก๋ฐ์ด๋๋S256 ๋ฐฉ์์ PKCE๋ฅผ ์ง์ํ๋ฏ๋ก ์ฝ๋ ๊ตํ ๊ณผ์ (Authorization Code Flow)์์ PKCE๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ฌ์ฉ์ ์ฝ์ ๋ก๊ทธ์ธ ํ๋ฉด์์ ์นด์นด์ค ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธ
์นด์นด์ค ๋ก๊ทธ์ธ์ ์ํ IdP๋ฅผ ์ถ๊ฐํ์ผ๋ฏ๋ก์ฌ์ฉ์ ์ฝ์(account-console)์ ๋ก๊ทธ์ธ ํ๋ฉด์ ์นด์นด์ค ํ๋ก๋ฐ์ด๋๊ฐ ์ต์ ์ผ๋ก ํ์๋๋ค. ์ฌ์ฉ์ ์ฝ์์ ๋ก๊ทธ์ธ ํ๋ฉด์์ ์นด์นด์ค ํ๋ก๋ฐ์ด๋ ์ด๋ฆ์ ์ ํํ๋ฉด ์นด์นด์ค ๊ณ์ ๋ก๊ทธ์ธ ํ๋ฉด์ผ๋ก ๋ฆฌ๋ค์ด๋ ํธ๋๋ฉฐ ์นด์นด์ค ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธํ๊ณ ๋์ ํญ๋ชฉ์ ๋ฐ๋ผ ์งํํ๋ฉด ํคํด๋ก ์ฌ์ฉ์๋ก ์ถ๊ฐ๋๋ค. ๋ง์ฝ, ์๋์ ๊ฐ์ด์นด์นด์ค ๊ณ์ (์ด๋ฉ์ผ)์ ๋ํ ์์ง ํญ๋ชฉ์ ๋์ํ๋ค๋ฉด ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ์ด๋ฉ์ผ์ด ๋ชจ๋ ์ด๋ฉ์ผ๋ก ์ค์ ๋๋ฉฐ ์ฌ์ฉ์ ์ ๋ณด ์ ๋ ฅ ๋จ๊ณ์์ด ์ฌ์ฉ์๊ฐ ๋ง๋ค์ด์ง๊ณ ์ฌ์ฉ์ ์ฝ์ ํ๋ฉด์ด ๋ณด์ธ๋ค.
Add Identity Provider Mapper
์นด์นด์ค ID ํ ํฐ ํ์ด๋ก๋์๋ ์์ง ๋์ ํญ๋ชฉ์ ๋ฐ๋ผ ํด๋ ์์ด ํฌํจ๋์ด ์๋๋ฐ ์ด๊ฒ์User Attribute ์ ์ถ๊ฐํ๊ธฐ ์ํด์๋ Mapper ์ค์ ์ด ํ์ํ๋ค.
- username : sub
- nickname : nickname
- email : email (๊ธฐ๋ณธ๊ฐ)
์์ ๊ฐ์ด username ์ ๋ํ Mapper ์ค์ ์ ์ถ๊ฐํ์ง ์๋๋ค๋ฉด ์ด๋ฉ์ผ ์ ๋ณด๊ฐ username ์ผ๋ก ์ค์ ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ด๋, username ์ ์กด์ฌํ์ง ์๋ ํญ๋ชฉ์ ์ฐ๊ฒฐํ๋ค๋ฉด ๊ด๋ฆฌ์ ์ฝ์์์ ์์ธ ์ ๋ณด๋ฅผ ํ์ธํ๊ฑฐ๋ ์ญ์ ๊ฐ ๋ถ๊ฐ๋ฅํด์ง ์ ์์ผ๋ ์ฃผ์๊ฐ ํ์ํฉ๋๋ค.