๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ
๊ฒฝ๊ณ 

์ด ํŠœํ† ๋ฆฌ์–ผ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ์—ฌ๋กœ ์ œ๊ณต๋˜๋ฉฐ Open WebUI ํŒ€์—์„œ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋”ฐ๋ผ Open WebUI๋ฅผ ๋งž์ถคํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‹œ์—ฐํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ์—ฌ๋ฅผ ์›ํ•˜์‹ ๋‹ค๋ฉด, ๊ธฐ์—ฌ ํŠœํ† ๋ฆฌ์–ผ์„ ํ™•์ธํ•˜์„ธ์š”.

๐Ÿ”— Okta OIDC SSO ํ†ตํ•ฉ

๊ฐœ์š”โ€‹

์ด ๋ฌธ์„œ ํŽ˜์ด์ง€๋Š” Open WebUI์— Okta OIDC ๋‹จ์ผ ๋กœ๊ทธ์ธ(SSO)์„ ํ†ตํ•ฉํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋‹จ๊ณ„๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ Okta ๊ทธ๋ฃน ๋ฉค๋ฒ„์‹ญ์— ๋”ฐ๋ผ Open WebUI ์‚ฌ์šฉ์ž ๊ทธ๋ฃน์„ ๊ด€๋ฆฌํ•˜๋Š” ์„ ํƒ์  ๊ธฐ๋Šฅ, ์˜ˆ๋ฅผ ๋“ค์–ด ์ฆ‰์‹œ(JIT) ๊ทธ๋ฃน ์ƒ์„ฑ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด๋ฉด ์‚ฌ์šฉ์ž๋Š” Okta ์ž๊ฒฉ ์ฆ๋ช…์„ ์‚ฌ์šฉํ•˜์—ฌ Open WebUI์— ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฃน ๋™๊ธฐํ™” (ENABLE_OAUTH_GROUP_MANAGEMENT)๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ ์‹œ Okta ๊ทธ๋ฃน์— ๋”ฐ๋ผ Open WebUI ๋‚ด๋ถ€ ๊ด€๋ จ ๊ทธ๋ฃน์— ์ž๋™์œผ๋กœ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ JIT ๊ทธ๋ฃน ์ƒ์„ฑ (ENABLE_OAUTH_GROUP_CREATION)๋„ ํ™œ์„ฑํ™”ํ•˜๋ฉด Okta ํด๋ ˆ์ž„์— ์กด์žฌํ•˜์ง€๋งŒ Open WebUI์— ์—†๋Š” ๊ทธ๋ฃน์ด ๋กœ๊ทธ์ธ ์ค‘์— ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ์กฐ๊ฑดโ€‹

  • ์ƒˆ๋กœ์šด ๋˜๋Š” ๊ธฐ์กด Open WebUI ์ธ์Šคํ„ด์Šค.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ์„ฑ ๋ฐ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ด€๋ฆฌ ๊ถŒํ•œ์ด ์žˆ๋Š” Okta ๊ณ„์ •.
  • OIDC, Okta ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์„ฑ, Open WebUI ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ดํ•ด.

Okta ์„ค์ •โ€‹

๋จผ์ € Okta ์กฐ์ง ๋‚ด์—์„œ OIDC ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๊ณ  Open WebUI์— ๊ทธ๋ฃน ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ํด๋ ˆ์ž„์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

1. Okta์—์„œ OIDC ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒ์„ฑ/๊ตฌ์„ฑโ€‹

  1. Okta ๊ด€๋ฆฌ์ž ์ฝ˜์†”์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.
  2. Applications > Applications๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  3. ์ƒˆ๋กœ์šด OIDC - OpenID Connect ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ (์œ ํ˜•์œผ๋กœ Web Application ์„ ํƒ) Open WebUI์— ์‚ฌ์šฉํ•  ๊ธฐ์กด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  4. ์„ค์ • ์ค‘ ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ผ๋ฐ˜ ์„ค์ • ํƒญ์—์„œ Sign-in redirect URIs๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ Open WebUI ์ธ์Šคํ„ด์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” URI ๋’ค์— /oauth/oidc/callback์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. ์˜ˆ: https://your-open-webui.com/oauth/oidc/callback.
  5. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ผ๋ฐ˜ ํƒญ์—์„œ ์ œ๊ณตํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ID ๋ฐ ํด๋ผ์ด์–ธํŠธ ๋น„๋ฐ€์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์ด ์ •๋ณด๋Š” Open WebUI ๊ตฌ์„ฑ์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  6. ํ• ๋‹น ํƒญ์—์„œ ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ์ž ๋˜๋Š” ๊ทธ๋ฃน์ด ํ• ๋‹น๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

2. ID ํ† ํฐ์— ๊ทธ๋ฃน ํด๋ ˆ์ž„ ์ถ”๊ฐ€โ€‹

(์„ ํƒ ์‚ฌํ•ญ) Okta ๊ทธ๋ฃน์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ Open WebUI์—์„œ ์ž๋™ ๊ทธ๋ฃน ๊ด€๋ฆฌ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด Okta๊ฐ€ ์‚ฌ์šฉ์ž ๊ทธ๋ฃน ๋ฉค๋ฒ„์‹ญ์„ ID ํ† ํฐ์— ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. SSO ๋กœ๊ทธ์ธ๋งŒ ํ•„์š”ํ•˜๊ณ  Open WebUI ๋‚ด์—์„œ ์ˆ˜๋™์œผ๋กœ ๊ทธ๋ฃน์„ ๊ด€๋ฆฌํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ด ์„น์…˜์„ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ด€๋ฆฌ์ž ์ฝ˜์†”์—์„œ Applications > Applications์œผ๋กœ ์ด๋™ํ•˜์—ฌ OIDC ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  2. Sign On ํƒญ์œผ๋กœ ์ด๋™ํ•œ ๋‹ค์Œ OpenID Connect ID Token ์„น์…˜์—์„œ Edit๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  3. Group claim type ์„น์…˜์—์„œ Filter๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  4. Group claims filter ์„น์…˜์—์„œ:
    • ํด๋ ˆ์ž„ ์ด๋ฆ„์œผ๋กœ groups๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค (๋˜๋Š” ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉ).
    • ๋“œ๋กญ๋‹ค์šด์—์„œ Matches regex๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    • ์ •๊ทœ์‹ ํ•„๋“œ์— .*๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์†ํ•œ ๋ชจ๋“  ๊ทธ๋ฃน์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ ๊ตฌ์ฒด์ ์ธ ์ •๊ทœ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  5. Save๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  6. Back to applications ๋งํฌ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  7. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ More ๋ฒ„ํŠผ ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด์—์„œ Refresh Application Data๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

๋” ๊ณ ๊ธ‰ ๊ทธ๋ฃน ํด๋ ˆ์ž„ ๊ตฌ์„ฑ์„ ์œ„ํ•ด Okta์˜ ํ† ํฐ ์‚ฌ์šฉ์ž ์ •์˜์— ๋Œ€ํ•œ ๋ฌธ์„œ ๋ฐ ๊ทธ๋ฃน ํ•จ์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

Open WebUI ๊ตฌ์„ฑโ€‹

Open WebUI์—์„œ Okta OIDC SSO๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๊ธฐ๋ณธ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ์  ๊ทธ๋ฃน ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ์ถ”๊ฐ€ ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

# --- OIDC ์ฝ”์–ด ์„ค์ • ---
# ์‚ฌ์šฉ์ž๊ฐ€ Okta๋ฅผ ํ†ตํ•ด ๊ณ„์ •์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๋ ค๋ฉด OAuth ๊ฐ€์ž…์„ ํ™œ์„ฑํ™”ํ•˜์‹ญ์‹œ์˜ค
# ENABLE_OAUTH_SIGNUP="true"

# Okta ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํด๋ผ์ด์–ธํŠธ ID
OAUTH_CLIENT_ID="YOUR_OKTA_CLIENT_ID"

# Okta ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํด๋ผ์ด์–ธํŠธ ๋น„๋ฐ€
OAUTH_CLIENT_SECRET="YOUR_OKTA_CLIENT_SECRET"

# Okta ์กฐ์ง์˜ OIDC ๋ฐœ๊ฒฌ URL
# ํ˜•์‹: https://<your-okta-domain>/.well-known/openid-configuration
# ํŠน์ • ์ธ์ฆ ์„œ๋ฒ„์˜ ๊ฒฝ์šฐ: https://<your-okta-domain>/oauth2/<auth-server-id>/.well-known/openid-configuration
OPENID_PROVIDER_URL="YOUR_OKTA_OIDC_DISCOVERY_URL"

# ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์— ํ‘œ์‹œ๋  ์ด๋ฆ„ (์˜ˆ: "Login with Okta")
OAUTH_PROVIDER_NAME="Okta"

# ์š”์ฒญํ•  ๋ฒ”์œ„ (๊ธฐ๋ณธ๊ฐ’์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์ถฉ๋ถ„)
# OAUTH_SCOPES="openid email profile groups" # ๊ธฐ๋ณธ๊ฐ’์ด ์•„๋‹ˆ๋ฉด 'groups' ํฌํ•จ ํ™•์ธ

# --- OAuth ๊ทธ๋ฃน ๊ด€๋ฆฌ (์„ ํƒ ์‚ฌํ•ญ) ---
# Okta์—์„œ ๊ทธ๋ฃน ํด๋ ˆ์ž„์„ ๊ตฌ์„ฑํ•œ ๊ฒฝ์šฐ (2๋‹จ๊ณ„) "true"๋กœ ์„ค์ •
# ๋ฐ ๋กœ๊ทธ์ธ ์‹œ Open WebUI ๊ทธ๋ฃน์ด Okta ๊ทธ๋ฃน์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.
# ๊ธฐ์กด ๊ทธ๋ฃน์ด ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” Open WebUI ๊ทธ๋ฃน์—์„œ ์ถ”๊ฐ€/์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.
# Okta ๊ทธ๋ฃน ํด๋ ˆ์ž„์— ๋งž์ถ”์–ด ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
# ENABLE_OAUTH_GROUP_MANAGEMENT="true"

# ENABLE_OAUTH_GROUP_MANAGEMENT๊ฐ€ true์ธ ๊ฒฝ์šฐ์—๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
# ๊ทธ๋ฃน ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋Š” ID ํ† ํฐ์˜ ํด๋ ˆ์ž„ ์ด๋ฆ„ (Okta ์„ค์ •๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•จ)
# OAUTH_GROUP_CLAIM="groups"

# ์„ ํƒ ์‚ฌํ•ญ: Okta ํด๋ ˆ์ž„์— ์กด์žฌํ•˜์ง€๋งŒ Open WebUI์—๋Š” ์•„์ง ์—†๋Š” ๊ทธ๋ฃน์˜ Just-in-Time (JIT) ์ž๋™ ์ƒ์„ฑ ํ™œ์„ฑํ™”.
# ENABLE_OAUTH_GROUP_MANAGEMENT="true" ํ•„์š”.
# false๋กœ ์„ค์ • (๊ธฐ๋ณธ๊ฐ’)ํ•˜๋ฉด ๊ธฐ์กด ๊ทธ๋ฃน๋งŒ ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.
# ENABLE_OAUTH_GROUP_CREATION="false"

YOUR_OKTA_CLIENT_ID, YOUR_OKTA_CLIENT_SECRET, YOUR_OKTA_OIDC_DISCOVERY_URL๋ฅผ Okta ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์„ฑ์˜ ์‹ค์ œ ๊ฐ’์œผ๋กœ ๊ต์ฒดํ•˜์‹ญ์‹œ์˜ค.

Okta ํด๋ ˆ์ž„ ๊ธฐ๋ฐ˜์˜ ๊ทธ๋ฃน ๋™๊ธฐํ™”๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ENABLE_OAUTH_GROUP_MANAGEMENT="true"๋ฅผ ์„ค์ •ํ•˜๊ณ , OAUTH_GROUP_CLAIM์ด Okta์— ๊ตฌ์„ฑ๋œ ํด๋ ˆ์ž„ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค (๊ธฐ๋ณธ๊ฐ’์€ groups ์ž…๋‹ˆ๋‹ค).

Okta์— ์กด์žฌํ•˜์ง€๋งŒ Open WebUI์— ์•„์ง ์—†๋Š” ๊ทธ๋ฃน์˜ ์ž๋™ Just-in-Time (JIT) ์ƒ์„ฑ์„ ์ถ”๊ฐ€๋กœ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ENABLE_OAUTH_GROUP_CREATION="true"๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ Open WebUI์— ์กด์žฌํ•˜๋Š” ๊ทธ๋ฃน์˜ ๋ฉค๋ฒ„์‹ญ๋งŒ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด ์ด ๊ฐ’์„ false๋กœ ๋‘์‹ญ์‹œ์˜ค.

๊ทธ๋ฃน ๋ฉค๋ฒ„์‹ญ ๊ด€๋ฆฌ

ENABLE_OAUTH_GROUP_MANAGEMENT๊ฐ€ true๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ž์˜ Open WebUI ๊ทธ๋ฃน ๋ฉค๋ฒ„์‹ญ์€ ๊ฐ ๋กœ๊ทธ์ธ ์‹œ Okta ํด๋ ˆ์ž„์—์„œ ๋ฐ›์€ ๊ทธ๋ฃน๊ณผ ์—„๊ฒฉํ•˜๊ฒŒ ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค:

  • ์‚ฌ์šฉ์ž๋Š” Okta ํด๋ ˆ์ž„์— ํ•ด๋‹นํ•˜๋Š” Open WebUI ๊ทธ๋ฃน์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.
  • Okta ํด๋ ˆ์ž„์— ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š” ๊ทธ๋ฃน (Open WebUI์—์„œ ์ˆ˜๋™์œผ๋กœ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ํ• ๋‹น๋œ ํฌํ•จ)์—์„œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ํ•„์š”ํ•œ ๊ทธ๋ฃน์ด Okta์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ ๋ฐ ํ• ๋‹น๋˜๊ณ  ๊ทธ๋ฃน ํด๋ ˆ์ž„์— ํฌํ•จ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

๋‹ค์ค‘ ๋…ธ๋“œ ๋ฐฐํฌ์—์„œ์˜ ์„ธ์…˜ ์ง€์†์„ฑ

Open WebUI๋ฅผ ์—ฌ๋Ÿฌ ๋…ธ๋“œ(์˜ˆ: Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ๋˜๋Š” ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ๋’ค)์— ๋ฐฐํฌํ•  ๋•Œ ์›ํ™œํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์œ„ํ•ด ํŠนํžˆ SSO์™€ ํ•จ๊ป˜ ์„ธ์…˜ ์ง€์†์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  Open WebUI ์ธ์Šคํ„ด์Šค์—์„œ ๋™์ผํ•œ ์•ˆ์ „ํ•˜๊ณ  ๊ณ ์œ ํ•œ ๊ฐ’์œผ๋กœ WEBUI_SECRET_KEY ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค.

# ์˜ˆ: ๊ฐ•๋ ฅํ•œ ๋น„๋ฐ€ ํ‚ค ์ƒ์„ฑ (์˜ˆ: openssl rand -hex 32 ์‚ฌ์šฉ)
WEBUI_SECRET_KEY="YOUR_UNIQUE_AND_SECURE_SECRET_KEY"

์ด ํ‚ค๊ฐ€ ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ์ผ๊ด€๋˜์ง€ ์•Š์œผ๋ฉด, ์„ธ์…˜์ด ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๋ผ์šฐํŒ…๋  ๋•Œ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์‹œ ๋กœ๊ทธ์ธ์„ ๊ฐ•์š”๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ•œ ๋…ธ๋“œ์—์„œ ์„œ๋ช…๋œ ์„ธ์…˜ ํ† ํฐ์ด ๋‹ค๋ฅธ ๋…ธ๋“œ์—์„œ ์œ ํšจํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Docker ์ด๋ฏธ์ง€๊ฐ€ ์ตœ์ดˆ ์‹œ์ž‘ ์‹œ ๋žœ๋ค ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ๋‹ค์ค‘ ๋…ธ๋“œ๋ฅผ ์œ„ํ•œ ์„ค์ •์œผ๋กœ๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ‘œ์ค€ ๋กœ๊ทธ์ธ ํผ ๋น„ํ™œ์„ฑํ™”

Okta (๋ฐ ์ž ์žฌ์ ์œผ๋กœ ๋‹ค๋ฅธ ๊ตฌ์„ฑ๋œ OAuth ์ œ๊ณต์ž)์— ์˜ํ•œ ๋กœ๊ทธ์ธ๋งŒ ํ—ˆ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ, ํ‘œ์ค€ ์ด๋ฉ”์ผ/๋น„๋ฐ€๋ฒˆํ˜ธ ๋กœ๊ทธ์ธ ํผ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๋‹ค์Œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค:

ENABLE_LOGIN_FORM="false"
์ค‘์š”ํ•œ ์‚ฌ์ „ ์š”๊ตฌ์‚ฌํ•ญ

ENABLE_LOGIN_FORM="false" ์„ค์ •์€ ENABLE_OAUTH_SIGNUP="true"๋„ ์„ค์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ ํผ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  OAuth ๊ฐ€์ž…์„ ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š์œผ๋ฉด, ์‚ฌ์šฉ์ž (๊ด€๋ฆฌ์ž ํฌํ•จ)๊ฐ€ ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ‘œ์ค€ ๋กœ๊ทธ์ธ ํผ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์ „์— ์ ์–ด๋„ ํ•˜๋‚˜์˜ OAuth ์ œ๊ณต์ž๊ฐ€ ๊ตฌ์„ฑ๋˜๊ณ  ENABLE_OAUTH_SIGNUP์ด ํ™œ์„ฑํ™”๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

์ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•œ ํ›„ Open WebUI ์ธ์Šคํ„ด์Šค๋ฅผ ์žฌ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค.

ํ™•์ธโ€‹

  1. Open WebUI ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์‹ญ์‹œ์˜ค. "Login with Okta" (๋˜๋Š” OAUTH_PROVIDER_NAME์— ์„ค์ •ํ•œ ๋‚ด์šฉ)๋ผ๊ณ  ํ‘œ์‹œ๋œ ๋ฒ„ํŠผ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
  2. ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ณ  Okta ๋กœ๊ทธ์ธ ํ๋ฆ„์„ ํ†ตํ•ด ์ธ์ฆํ•˜์‹ญ์‹œ์˜ค.
  3. ์ธ์ฆ์— ์„ฑ๊ณตํ•˜๋ฉด Open WebUI๋กœ ๋‹ค์‹œ ๋ฆฌ๋””๋ ‰์…˜๋˜์–ด ๋กœ๊ทธ์ธ๋ฉ๋‹ˆ๋‹ค.
  4. ENABLE_OAUTH_GROUP_MANAGEMENT๊ฐ€ true์ธ ๊ฒฝ์šฐ, ๊ด€๋ฆฌ์ž๊ฐ€ ์•„๋‹Œ ์‚ฌ์šฉ์ž๋กœ ๋กœ๊ทธ์ธํ•˜์‹ญ์‹œ์˜ค. ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ Open WebUI ๊ทธ๋ฃน์€ ์ด์ œ Okta์˜ ํ˜„์žฌ ๊ทธ๋ฃน ๋ฉค๋ฒ„์‹ญ์„ ์—„๊ฒฉํžˆ ๋ฐ˜์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค (Okta ํด๋ ˆ์ž„์— ์—†๋Š” ๊ทธ๋ฃน์— ๋Œ€ํ•œ ๋ฉค๋ฒ„์‹ญ์€ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค). ENABLE_OAUTH_GROUP_CREATION๋„ true๋ผ๋ฉด, ์‚ฌ์šฉ์ž์˜ Okta ํด๋ ˆ์ž„์— ์กด์žฌํ•˜์ง€๋งŒ Open WebUI์— ์ด์ „์—๋Š” ์—†์—ˆ๋˜ ๊ทธ๋ฃน์ด ์ด์ œ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜์—ˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž ์‚ฌ์šฉ์ž์˜ ๊ทธ๋ฃน์€ SSO๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  5. ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด Open WebUI ์„œ๋ฒ„ ๋กœ๊ทธ์—์„œ OIDC ๋˜๋Š” ๊ทธ๋ฃน ๊ด€๋ จ ์˜ค๋ฅ˜๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๋ฌธ์ œ ํ•ด๊ฒฐโ€‹

  • 400 Bad Request/Redirect URI Mismatch: Okta ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ Sign-in redirect URI๊ฐ€ <your-open-webui-url>/oauth/oidc/callback๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
  • ๊ทธ๋ฃน์ด ๋™๊ธฐํ™”๋˜์ง€ ์•Š์Œ: OAUTH_GROUP_CLAIM ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ Okta ID ํ† ํฐ ์„ค์ •์— ๊ตฌ์„ฑ๋œ ํด๋ ˆ์ž„ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋ฃน ๋ณ€๊ฒฝ ํ›„ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์•„์›ƒํ•œ ์ƒํƒœ์—์„œ ๋‹ค์‹œ ๋กœ๊ทธ์ธํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. OIDC ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด ๋กœ๊ทธ์ธ ํ๋ฆ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž ๊ทธ๋ฃน์€ ๋™๊ธฐํ™”๋˜์ง€ ์•Š๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค.
  • ๊ตฌ์„ฑ ์˜ค๋ฅ˜: OIDC ๊ตฌ์„ฑ๊ณผ ๊ด€๋ จ๋œ ์ž์„ธํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด Open WebUI ์„œ๋ฒ„ ๋กœ๊ทธ๋ฅผ ๊ฒ€ํ† ํ•˜์‹ญ์‹œ์˜ค.
  • ๊ณต์‹ Open WebUI SSO ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
  • Okta ๊ฐœ๋ฐœ์ž ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.