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

์—ฐํ•ฉ ์ธ์ฆ ์ง€์›

Open WebUI๋Š” ์—ฌ๋Ÿฌ ํ˜•ํƒœ์˜ ์—ฐํ•ฉ ์ธ์ฆ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:

  1. OAuth2
    1. Google
    2. Microsoft
    3. Github
    4. OIDC
  2. ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํ—ค๋”

OAuthโ€‹

OAuth์— ๋Œ€ํ•œ ์ „์—ญ ๊ตฌ์„ฑ ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. ENABLE_OAUTH_SIGNUP - true๋กœ ์„ค์ •ํ•˜๋ฉด OAuth๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธํ•  ๋•Œ ๊ณ„์ •์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ENABLE_SIGNUP๊ณผ๋Š” ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค.
  2. OAUTH_MERGE_ACCOUNTS_BY_EMAIL - OAuth ๊ณต๊ธ‰์ž๊ฐ€ ์ œ๊ณตํ•œ ์ด๋ฉ”์ผ ์ฃผ์†Œ์™€ ์ผ์น˜ํ•˜๋Š” ๊ณ„์ •์— ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋Š” ๋ชจ๋“  OAuth ๊ณต๊ธ‰์ž๊ฐ€ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ „ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ณ„์ • ํƒˆ์ทจ๊ฐ€ ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. OAUTH_UPDATE_PICTURE_ON_LOGIN - true๋กœ ์„ค์ •ํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ OAuth๋ฅผ ํ†ตํ•ด ์ œ๊ณต๋œ ํ”„๋กœํ•„ ์‚ฌ์ง„์ด ๋กœ๊ทธ์ธ ์‹œ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.
    • OAUTH_PICTURE_CLAIM์„ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•˜์—ฌ OAuth ์‚ฌ์ง„ ํด๋ ˆ์ž„์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ด ์„ค์ •์€ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.
  4. OAUTH_PICTURE_CLAIM - ํ”„๋กœํ•„ ์‚ฌ์ง„ ์ €์žฅ์„ ์‚ฌ์šฉ์ž ์ •์˜ํ•˜๊ฑฐ๋‚˜ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์ธ picture๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ณต๊ธ‰์ž์—๊ฒŒ ์ž‘๋™ํ•˜๋ฉฐ, ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•˜๋ฉด ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์‚ฌ์ง„์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Googleโ€‹

Google OAuth ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด Googles Documentation์„ ์ฐธ์กฐํ•˜์—ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์šฉ Google OAuth ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•˜์„ธ์š”. ํ—ˆ์šฉ๋œ ๋ฆฌ๋””๋ ‰์…˜ URI์—๋Š” <open-webui>/oauth/google/callback์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

  1. GOOGLE_CLIENT_ID - Google OAuth ํด๋ผ์ด์–ธํŠธ ID
  2. GOOGLE_CLIENT_SECRET - Google OAuth ํด๋ผ์ด์–ธํŠธ ์‹œํฌ๋ฆฟ

Microsoftโ€‹

Microsoft OAuth ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด Microsofts Documentation์„ ์ฐธ์กฐํ•˜์—ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์šฉ Microsoft OAuth ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•˜์„ธ์š”. ํ—ˆ์šฉ๋œ ๋ฆฌ๋””๋ ‰์…˜ URI์—๋Š” <open-webui>/oauth/microsoft/callback์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Microsoft OAuth ์ง€์›์€ ํ˜„์žฌ ๋‹จ์ผ ํ…Œ๋„ŒํŠธ์— ํ•œ์ •๋˜๋ฉฐ, ๋‹จ์ผ Entra ์กฐ์ง ๋˜๋Š” ๊ฐœ์ธ Microsoft ๊ณ„์ •๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

  1. MICROSOFT_CLIENT_ID - Microsoft OAuth ํด๋ผ์ด์–ธํŠธ ID
  2. MICROSOFT_CLIENT_SECRET - Microsoft OAuth ํด๋ผ์ด์–ธํŠธ ์‹œํฌ๋ฆฟ
  3. MICROSOFT_CLIENT_TENANT_ID - Microsoft ํ…Œ๋„ŒํŠธ ID - ๊ฐœ์ธ ๊ณ„์ •์—๋Š” 9188040d-6c67-4c5b-b112-36a304b66dad๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”

Githubโ€‹

Github OAuth ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด Githubs Documentation์„ ์ฐธ์กฐํ•˜์—ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์šฉ OAuth ์•ฑ ๋˜๋Š” Github ์•ฑ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•˜์„ธ์š”. ํ—ˆ์šฉ๋œ ๋ฆฌ๋””๋ ‰์…˜ URI์—๋Š” <open-webui>/oauth/github/callback์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

  1. GITHUB_CLIENT_ID - Github OAuth ์•ฑ ํด๋ผ์ด์–ธํŠธ ID
  2. GITHUB_CLIENT_SECRET - Github OAuth ์•ฑ ํด๋ผ์ด์–ธํŠธ ์‹œํฌ๋ฆฟ

OIDCโ€‹

OIDC๋ฅผ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ์ธ์ฆ ๊ณต๊ธ‰์ž๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. email ํด๋ ˆ์ž„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. name ๋ฐ picture ํด๋ ˆ์ž„์€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ—ˆ์šฉ๋œ ๋ฆฌ๋””๋ ‰์…˜ URI์—๋Š” <open-webui>/oauth/oidc/callback์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค:

  1. OAUTH_CLIENT_ID - OIDC ํด๋ผ์ด์–ธํŠธ ID
  2. OAUTH_CLIENT_SECRET - OIDC ํด๋ผ์ด์–ธํŠธ ์‹œํฌ๋ฆฟ
  3. OPENID_PROVIDER_URL - OIDC well-known URL, ์˜ˆ์‹œ: https://accounts.google.com/.well-known/openid-configuration
  4. OAUTH_PROVIDER_NAME - UI์— ํ‘œ์‹œํ•  ๊ณต๊ธ‰์ž ์ด๋ฆ„, ๊ธฐ๋ณธ๊ฐ’์€ SSO
  5. OAUTH_SCOPES - ์š”์ฒญํ•  ๋ฒ”์œ„. ๊ธฐ๋ณธ๊ฐ’์€ openid email profile

OAuth ์—ญํ•  ๊ด€๋ฆฌโ€‹

์•ก์„ธ์Šค ํ† ํฐ์—์„œ ์—ญํ• ์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  OAuth ๊ณต๊ธ‰์ž๋Š” Open WebUI ์—ญํ•  ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ENABLE_OAUTH_ROLE_MANAGEMENT๋ฅผ true๋กœ ์„ค์ •ํ•˜์„ธ์š”. OAuth ๊ณต๊ธ‰์ž๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ญํ• ๊ณผ ์ผ์น˜ํ•˜๋„๋ก ๋‹ค์Œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  1. OAUTH_ROLES_CLAIM - ์—ญํ• ์ด ํฌํ•จ๋œ ํด๋ ˆ์ž„. ๊ธฐ๋ณธ๊ฐ’์€ roles. ์ค‘์ฒฉ ํ˜•ํƒœ๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค, ์˜ˆ: user.roles.
  2. OAUTH_ALLOWED_ROLES - ๋กœ๊ทธ์ธ ํ—ˆ์šฉ๋˜๋Š” ์—ญํ• ์˜ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ๋ชฉ๋ก (Open WebUI ์—ญํ•  user๋ฅผ ๋ฐ›์Œ).
  3. OAUTH_ADMIN_ROLES - ๊ด€๋ฆฌ์ž ๋กœ๊ทธ์ธ ํ—ˆ์šฉ๋˜๋Š” ์—ญํ• ์˜ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ๋ชฉ๋ก (Open WebUI ์—ญํ•  admin์„ ๋ฐ›์Œ).
์ •๋ณด

๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ ์—ญํ• ์„ ๋ณ€๊ฒฝํ•œ ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ์—ญํ• ์„ ๋ฐ›์œผ๋ ค๋ฉด ๋กœ๊ทธ์•„์›ƒ ํ›„ ๋‹ค์‹œ ๋กœ๊ทธ์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

OAuth ๊ทธ๋ฃน ๊ด€๋ฆฌโ€‹

์•ก์„ธ์Šค ํ† ํฐ์—์„œ ๊ทธ๋ฃน์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  OAuth ๊ณต๊ธ‰์ž๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•  ๋•Œ Open WebUI์˜ ์‚ฌ์šฉ์ž ๊ทธ๋ฃน ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋™๊ธฐํ™”๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ENABLE_OAUTH_GROUP_MANAGEMENT๋ฅผ true๋กœ ์„ค์ •ํ•˜์„ธ์š”.

๋‹ค์Œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  1. OAUTH_GROUP_CLAIM - ID/์•ก์„ธ์Šค ํ† ํฐ์—์„œ ์‚ฌ์šฉ์ž์˜ ๊ทธ๋ฃน ๋ฉค๋ฒ„์‹ญ์ด ํฌํ•จ๋œ ํด๋ ˆ์ž„. ๊ธฐ๋ณธ๊ฐ’์€ groups. ์ค‘์ฒฉ ํ˜•ํƒœ๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค, ์˜ˆ: user.memberOf. ENABLE_OAUTH_GROUP_MANAGEMENT๊ฐ€ true์ธ ๊ฒฝ์šฐ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.
  2. ENABLE_OAUTH_GROUP_CREATION - true๋กœ ์„ค์ •๋˜์–ด ์žˆ๊ณ  (ENABLE_OAUTH_GROUP_MANAGEMENT๋„ true๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ), Open WebUI๋Š” **์ฆ‰์‹œ ๊ทธ๋ฃน ์ƒ์„ฑ(JIT)**์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž์˜ OAuth ํด๋ ˆ์ž„์— ์žˆ๋Š” ๊ทธ๋ฃน์ด ์‹œ์Šคํ…œ์— ์•„์ง ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ OAuth ๋กœ๊ทธ์ธ ๋„์ค‘ ์ž๋™์œผ๋กœ ๊ทธ๋ฃน์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ false์ผ ๊ฒฝ์šฐ, ๊ธฐ์กด Open WebUI ๊ทธ๋ฃน์˜ ๋ฉค๋ฒ„์‹ญ๋งŒ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
์—„๊ฒฉํ•œ ๊ทธ๋ฃน ๋™๊ธฐํ™”

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

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

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

๊ด€๋ฆฌ์ž ์‚ฌ์šฉ์ž

๊ด€๋ฆฌ์ž ์‚ฌ์šฉ์ž์˜ ๊ทธ๋ฃน ๋ฉค๋ฒ„์‹ญ์€ OAuth ๊ทธ๋ฃน ๊ด€๋ฆฌ์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด ๋กœ๊ทธ์ธ ํ•„์š”

์‚ฌ์šฉ์ž์˜ ๊ทธ๋ฃน์ด OAuth ์ œ๊ณต์ž์—์„œ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ, Open WebUI๋ฅผ ๋กœ๊ทธ์•„์›ƒ ํ›„ ๋‹ค์‹œ ๋กœ๊ทธ์ธํ•ด์•ผ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํ—ค๋”โ€‹

Open WebUI๋Š” ์‚ฌ์šฉ์ž์˜ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ HTTP ํ—ค๋”์— ํฌํ•จํ•˜์—ฌ ์ „๋‹ฌํ•˜๋Š” ์ธ์ฆ ์—ญ๋ฐฉํ–ฅ ํ”„๋ก์‹œ๋กœ ์ธ์ฆ์„ ์œ„์ž„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŽ˜์ด์ง€์—๋Š” ์ œ๊ณต๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์‹œ ๊ตฌ์„ฑ๋“ค์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„ํ—˜

์ž˜๋ชป๋œ ๊ตฌ์„ฑ์€ ์‚ฌ์šฉ์ž๋“ค์ด Open WebUI ์ธ์Šคํ„ด์Šค์—์„œ ์ž„์˜์˜ ์‚ฌ์šฉ์ž๋กœ ์ธ์ฆํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HOST=127.0.0.1์„ ์„ค์ •ํ•˜์—ฌ ๋ฃจํ”„๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ๋งŒ ์ˆ˜์‹ ํ•˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๋“ฑ ์ธ์ฆ ํ”„๋ก์‹œ๋งŒ Open WebUI์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ๊ตฌ์„ฑโ€‹

WEBUI_AUTH_TRUSTED_EMAIL_HEADER ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์„ค์ •๋˜๋ฉด, Open WebUI๋Š” ์ง€์ •๋œ ํ—ค๋” ๊ฐ’์„ ์‚ฌ์šฉ์ž์˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™ ๋“ฑ๋ก ๋ฐ ๋กœ๊ทธ์ธ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, WEBUI_AUTH_TRUSTED_EMAIL_HEADER=X-User-Email์„ ์„ค์ •ํ•˜๊ณ  X-User-Email: [email protected] HTTP ํ—ค๋”๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ์ด๋ฉ”์ผ [email protected]์œผ๋กœ ์š”์ฒญ์ด ์ธ์ฆ๋ฉ๋‹ˆ๋‹ค.

์˜ต์…˜์œผ๋กœ, WEBUI_AUTH_TRUSTED_NAME_HEADER๋ฅผ ์ •์˜ํ•˜์—ฌ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํ—ค๋”๋กœ ์ƒ์„ฑ๋œ ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„์„ ๊ฒฐ์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Tailscale Serveโ€‹

Tailscale Serve๋Š” tailnet ๋‚ด์—์„œ ์„œ๋น„์Šค๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Tailscale์€ ์š”์ฒญ์ž์˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ์„ค์ •ํ•˜๋Š” Tailscale-User-Login ํ—ค๋”๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” Tailscale ์‚ฌ์ด๋“œ์นด๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  Open WebUI๋ฅผ tailnet์— ํƒœ๊ทธ open-webui์™€ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„ open-webui๋กœ ๋…ธ์ถœํ•˜๋ฉฐ, https://open-webui.TAILNET_NAME.ts.net์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ๊ตฌ์„ฑ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ๋””๋ฐ”์ด์Šค ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์žˆ๋Š” OAuth ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ TS_AUTHKEY๋กœ Tailscale ์ปจํ…Œ์ด๋„ˆ์— ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

tailscale/serve.json
{
"TCP": {
"443": {
"HTTPS": true
}
},
"Web": {
"${TS_CERT_DOMAIN}:443": {
"Handlers": {
"/": {
"Proxy": "http://open-webui:8080"
}
}
}
}
}

docker-compose.yaml
---
services:
open-webui:
image: ghcr.io/open-webui/open-webui:main
volumes:
- open-webui:/app/backend/data
environment:
- HOST=127.0.0.1
- WEBUI_AUTH_TRUSTED_EMAIL_HEADER=Tailscale-User-Login
- WEBUI_AUTH_TRUSTED_NAME_HEADER=Tailscale-User-Name
restart: unless-stopped
tailscale:
image: tailscale/tailscale:latest
environment:
- TS_AUTH_ONCE=true
- TS_AUTHKEY=${TS_AUTHKEY}
- TS_EXTRA_ARGS=--advertise-tags=tag:open-webui
- TS_SERVE_CONFIG=/config/serve.json
- TS_STATE_DIR=/var/lib/tailscale
- TS_HOSTNAME=open-webui
volumes:
- tailscale:/var/lib/tailscale
- ./tailscale:/config
- /dev/net/tun:/dev/net/tun
cap_add:
- net_admin
- sys_module
restart: unless-stopped

volumes:
open-webui: {}
tailscale: {}
๊ฒฝ๊ณ 

Open WebUI์™€ ๋™์ผํ•œ ๋„คํŠธ์›Œํฌ ์ปจํ…์ŠคํŠธ์—์„œ Tailscale์„ ์‹คํ–‰ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ Serve ํ”„๋ก์‹œ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ์ง์ ‘ Open WebUI์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Tailscale์˜ ACL์„ ์‚ฌ์šฉํ•˜์—ฌ 443๋ฒˆ ํฌํŠธ์—๋งŒ ์ ‘๊ทผ์„ ์ œํ•œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Cloudflare Tunnel๊ณผ Cloudflare Accessโ€‹

Cloudflare Tunnel์€ Cloudflare Access์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ Open WebUI๋ฅผ SSO๋กœ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Cloudflare ๋ฌธ์„œ์—๋Š” ๊ฑฐ์˜ ์„ค๋ช…๋˜์–ด ์žˆ์ง€ ์•Š์ง€๋งŒ Cf-Access-Authenticated-User-Email์€ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” Cloudflare ์‚ฌ์ด๋“œ์นด๋ฅผ ์„ค์ •ํ•˜๋Š” Docker Compose ํŒŒ์ผ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ๊ตฌ์„ฑ์€ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ๋Œ€์‹œ๋ณด๋“œ์—์„œ ํ„ฐ๋„ ํ† ํฐ์„ ๊ฐ€์ ธ์™€ ํ„ฐ๋„ ๋ฐฑ์—”๋“œ๋ฅผ http://open-webui:8080์œผ๋กœ ์„ค์ •ํ•˜๊ณ  "Protect with Access"๊ฐ€ ์„ ํƒ๋˜์–ด ๊ตฌ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

docker-compose.yaml
---
์„œ๋น„์Šค:
open-webui:
์ด๋ฏธ์ง€: ghcr.io/open-webui/open-webui:main
๋ณผ๋ฅจ:
- open-webui:/app/backend/data
ํ™˜๊ฒฝ:
- HOST=127.0.0.1
- WEBUI_AUTH_TRUSTED_EMAIL_HEADER=Cf-Access-Authenticated-User-Email
์žฌ์‹œ์ž‘: unless-stopped
cloudflared:
์ด๋ฏธ์ง€: cloudflare/cloudflared:latest
ํ™˜๊ฒฝ:
- TUNNEL_TOKEN=${TUNNEL_TOKEN}
๋ช…๋ น: tunnel run
์žฌ์‹œ์ž‘: unless-stopped

๋ณผ๋ฅจ:
open-webui: {}

oauth2-proxyโ€‹

oauth2-proxy๋Š” ์†Œ์…œ OAuth ์ œ๊ณต์ž์™€ OIDC ์ง€์›์„ ๊ตฌํ˜„ํ•˜๋Š” ์ธ์ฆ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ์ž…๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ์˜ต์…˜์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์—, ์•„๋ž˜๋Š” Google OAuth๋กœ ์„ค์ •๋œ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. oauth2-proxy์˜ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ž์„ธํ•œ ์„ค์ • ๋ฐ ์ž ์žฌ์ ์ธ ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

docker-compose.yaml
์„œ๋น„์Šค:
open-webui:
์ด๋ฏธ์ง€: ghcr.io/open-webui/open-webui:main
๋ณผ๋ฅจ:
- open-webui:/app/backend/data
ํ™˜๊ฒฝ:
- 'HOST=127.0.0.1'
- 'WEBUI_AUTH_TRUSTED_EMAIL_HEADER=X-Forwarded-Email'
- 'WEBUI_AUTH_TRUSTED_NAME_HEADER=X-Forwarded-User'
์žฌ์‹œ์ž‘: unless-stopped
oauth2-proxy:
์ด๋ฏธ์ง€: quay.io/oauth2-proxy/oauth2-proxy:v7.6.0
ํ™˜๊ฒฝ:
OAUTH2_PROXY_HTTP_ADDRESS: 0.0.0.0:4180
OAUTH2_PROXY_UPSTREAMS: http://open-webui:8080/
OAUTH2_PROXY_PROVIDER: google
OAUTH2_PROXY_CLIENT_ID: REPLACEME_OAUTH_CLIENT_ID
OAUTH2_PROXY_CLIENT_SECRET: REPLACEME_OAUTH_CLIENT_ID
OAUTH2_PROXY_EMAIL_DOMAINS: REPLACEME_ALLOWED_EMAIL_DOMAINS
OAUTH2_PROXY_REDIRECT_URL: REPLACEME_OAUTH_CALLBACK_URL
OAUTH2_PROXY_COOKIE_SECRET: REPLACEME_COOKIE_SECRET
OAUTH2_PROXY_COOKIE_SECURE: "false"
์žฌ์‹œ์ž‘: unless-stopped
ํฌํŠธ:
- 4180:4180/tcp

Authentikโ€‹

Authentik OAuth ํด๋ผ์ด์–ธํŠธ๋ฅผ ์„ค์ •ํ•˜๋ ค๋ฉด ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ OAuth2/OpenID ์ œ๊ณต์ž๋ฅผ ์ƒ์„ฑํ•˜์‹ญ์‹œ์˜ค. ํ—ˆ์šฉ๋œ ๋ฆฌ๋””๋ ‰์…˜ URI์—๋Š” <open-webui>/oauth/oidc/callback์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ œ๊ณต์ž๋ฅผ ์ƒ์„ฑํ•  ๋•Œ App-name, Client-ID, ๊ทธ๋ฆฌ๊ณ  Client-Secret์„ ๊ธฐ๋กํ•˜์—ฌ open-webui ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค:

      - 'ENABLE_OAUTH_SIGNUP=true'
- 'OAUTH_MERGE_ACCOUNTS_BY_EMAIL=true'
- 'OAUTH_PROVIDER_NAME=Authentik'
- 'OPENID_PROVIDER_URL=https://<authentik-url>/application/o/<App-name>/.well-known/openid-configuration'
- 'OAUTH_CLIENT_ID=<Client-ID>'
- 'OAUTH_CLIENT_SECRET=<Client-Secret>'
- 'OAUTH_SCOPES=openid email profile'
- 'OPENID_REDIRECT_URI=https://<open-webui>/oauth/oidc/callback'

Autheliaโ€‹

Authelia๋Š” ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํ—ค๋” ์ธ์ฆ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ—ค๋”๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ๋Š” ์—ฌ๊ธฐ์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

Authelia ๋ฐฐํฌ์˜ ๋ณต์žก์„ฑ ๋•Œ๋ฌธ์— ์˜ˆ์ œ ๊ตฌ์„ฑ์€ ์ œ๊ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.