Part 1

Integration Setup

How to connect your institution's system with aiedu.nextain.io. Covers key issuance, SSO integration, and domain registration.

Overview

aiedu.nextain.io๋Š” Nextain์ด ์šด์˜ํ•˜๋Š” AI ํŠœํ„ฐ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. ๊ธฐ๊ด€์€ ์ž์ฒด ์ธ์ฆ ์‹œ์Šคํ…œ์— SSO๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ , ํ•™์ƒ๋ณ„ API ํ‚ค๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์•„ ํ”Œ๋žซํผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ „์ฒด ํ๋ฆ„

text
Nextain admin
  โ””โ”€ ๊ธฐ๊ด€ ํ‚ค(org_key) ๋ฐœ๊ธ‰ โ†’ ๊ธฐ๊ด€ ๋‹ด๋‹น์ž์—๊ฒŒ ์ „๋‹ฌ
       โ””โ”€ ๊ธฐ๊ด€ ์‹œ์Šคํ…œ์ด ํ•™์ƒ ํ‚ค(user_key) ๋ฐœ๊ธ‰ (API ํ˜ธ์ถœ)
            โ””โ”€ ํ•™์ƒ์ด user_key๋กœ AI ํŠœํ„ฐ ์ด์šฉ

๊ฐœ๋ฐœ์ž๋‹˜์ด ์ง์ ‘ ๊ตฌํ˜„ํ•  ๋ถ€๋ถ„์€ SSO ์—ฐ๋™๊ณผ ํ•™์ƒ ํ‚ค ๋ฐœ๊ธ‰ ๋‘ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€๋Š” ์ €ํฌ๊ฐ€ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Key Structure

ํ‚ค ์ข…๋ฅ˜๋ฐœ๊ธ‰ ์ฃผ์ฒด์šฉ๋„
org_keyNextain (์ €ํฌ)๊ธฐ๊ด€ ์‹๋ณ„, ํŽ˜๋ฅด์†Œ๋‚˜/๋ชจ๋ธ ์„ค์ • ์ €์žฅ
user_key๊ธฐ๊ด€ ์‹œ์Šคํ…œ (๊ฐœ๋ฐœ์ž๋‹˜)ํ•™์ƒ ๊ฐœ์ธ ์ธ์ฆ, AI ํ˜ธ์ถœ
  • โ†’org_key๋Š” ์ €ํฌ๊ฐ€ ๋ฐœ๊ธ‰ํ•ด์„œ ์ „๋‹ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ฝ”๋“œ์— ์ง์ ‘ ๋„ฃ์ง€ ์•Š๊ณ  ์„œ๋ฒ„ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ๋งŒ ๋ณด๊ด€ํ•˜์„ธ์š”.
  • โ†’user_key๋Š” ํ•™์ƒ ๋กœ๊ทธ์ธ ์‹œ ๊ธฐ๊ด€ ์‹œ์Šคํ…œ์ด ์ €ํฌ API๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์ž๋™ ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

Auth Flow

text
[๊ธฐ๊ด€ ๋กœ๊ทธ์ธ ์‹œ์Šคํ…œ (SSO)]
        โ”‚
        โ”‚ ๋กœ๊ทธ์ธ ์„ฑ๊ณต โ†’ ์œ ์ € ์ •๋ณด (์ด๋ฆ„, ์ด๋ฉ”์ผ ๋“ฑ)
        โ–ผ
[๊ธฐ๊ด€ ๋ฐฑ์—”๋“œ (์–ธ์–ด ๋ฌด๊ด€)]
        โ”‚
        โ”‚ POST /v1/keys  (org_key + ์œ ์ € ์ •๋ณด)
        โ”‚ โ†’ user_key ๋ฐœ๊ธ‰ ๋˜๋Š” ๊ธฐ์กด ํ‚ค ๋ฐ˜ํ™˜
        โ–ผ
[๋ธŒ๋ผ์šฐ์ € / ํด๋ผ์ด์–ธํŠธ]
        โ”‚
        โ”‚ POST /api/ai  (user_key + ๋ฉ”์‹œ์ง€ + ์ฝ˜ํ…์ธ )
        โ–ผ
[aiedu.nextain.io]
        โ”‚
        โ”‚ user_key ๊ฒ€์ฆ โ†’ ์œ ์ € ์‹๋ณ„ โ†’ ํŽ˜๋ฅด์†Œ๋‚˜ ๋กœ๋“œ
        โ”‚ โ†’ AI ์‘๋‹ต ๋ฐ˜ํ™˜
        โ–ผ
[AI ํŠœํ„ฐ ์‘๋‹ต]

SSO Integration

๋ฐฉ์‹์„ค๋ช…
OIDC (๊ถŒ์žฅ)OAuth2 ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ. ์ตœ์‹  ์‹œ์Šคํ…œ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ.
SAML 2.0๊ธฐ์—…ยท๊ธฐ๊ด€ ๋ ˆ๊ฑฐ์‹œ ์‹œ์Šคํ…œ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ. XML ๊ธฐ๋ฐ˜.
๋ชจ๋ฅด์‹œ๋ฉด ๊ธฐ๊ด€ IT ๋‹ด๋‹น์ž์—๊ฒŒ "๋กœ๊ทธ์ธ ์‹œ์Šคํ…œ์ด SAML์ธ์ง€ OIDC์ธ์ง€" ํ™•์ธ ํ›„ ์•Œ๋ ค์ฃผ์„ธ์š”.

OIDC ์—ฐ๋™

์ €ํฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” client_id์™€ client_secret์„ ํ™˜๊ฒฝ๋ณ€์ˆ˜์— ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

.env
AIEDU_CLIENT_ID=...
AIEDU_CLIENT_SECRET=...
ORG_KEY=org_...          # Nextain์ด ์ „๋‹ฌํ•˜๋Š” ๊ธฐ๊ด€ ํ‚ค

SAML ์—ฐ๋™

SAML Assertion์—์„œ ์ถ”์ถœํ•œ ์ด๋ฉ”์ผ๊ณผ ์ด๋ฆ„์„ ํ•™์ƒ ํ‚ค ๋ฐœ๊ธ‰ API์— ์ „๋‹ฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. SAML ํŒŒ์‹ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ธฐ๊ด€ ๊ธฐ์ˆ  ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ์„ ํƒํ•˜์„ธ์š”.

Issue Student Key

ํ•™์ƒ์ด ๋กœ๊ทธ์ธํ•˜๋ฉด ๊ธฐ๊ด€ ๋ฐฑ์—”๋“œ์—์„œ ์•„๋ž˜ API๋ฅผ ํ˜ธ์ถœํ•ด user_key๋ฅผ ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ user_id๋กœ ์žฌํ˜ธ์ถœํ•˜๋ฉด ๊ธฐ์กด ํ‚ค๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค (์ค‘๋ณต ๋ฐœ๊ธ‰ ์—†์Œ).

์š”์ฒญ ์ŠคํŽ™ โ€” ์–ธ์–ด ๋ฌด๊ด€

Method POST

URL {GATEWAY_URL}/v1/keys

Header Authorization: Bearer {ORG_KEY}

json
{
  "user_id": "student@example.com",
  "name": "ํ™๊ธธ๋™",
  "metadata": {
    "type": "user_key",
    "org_key_id": "<์ €ํฌ๊ฐ€ ์•Œ๋ ค๋“œ๋ฆฌ๋Š” ๊ฐ’>"
  }
}

Response { "key": "user_..." }

Python ์˜ˆ์‹œ:

python
import requests, os

ORG_KEY = os.environ["ORG_KEY"]
GATEWAY_URL = "https://naia-gateway-181404717065.asia-northeast3.run.app"

def issue_user_key(user_name: str, user_email: str) -> str:
    res = requests.post(
        f"{GATEWAY_URL}/v1/keys",
        headers={"Authorization": f"Bearer {ORG_KEY}"},
        json={
            "user_id": user_email,
            "name": user_name,
            "metadata": {
                "type": "user_key",
                "org_key_id": "<์ €ํฌ๊ฐ€ ์•Œ๋ ค๋“œ๋ฆฌ๋Š” ๊ฐ’>",
            },
        },
    )
    res.raise_for_status()
    return res.json()["key"]

Domain Registration

๊ธฐ๊ด€ ์ „์šฉ ์ ‘์† ์ฃผ์†Œ๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ: learn.example.com โ†’ ํ•ด๋‹น ๊ธฐ๊ด€ ํ•™์ƒ๋งŒ ์ ‘์†, ํ•ด๋‹น ๊ธฐ๊ด€ SSO ์ž๋™ ์ ์šฉ.

๋“ฑ๋ก ์ ˆ์ฐจ

  1. 1

    ๋„๋ฉ”์ธ ๋“ฑ๋ก ์š”์ฒญ

    ์•„๋ž˜ ํ•„์š” ์ •๋ณด๋ฅผ ์ด๋ฉ”์ผ๋กœ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค.

  2. 2

    ์ธ์ฆ ํ† ํฐ ์ˆ˜๋ น

    ์ €ํฌ๊ฐ€ ๋„๋ฉ”์ธ ์†Œ์œ ๊ถŒ ํ™•์ธ์šฉ TXT ๋ ˆ์ฝ”๋“œ ๊ฐ’์„ ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

  3. 3

    DNS TXT ๋ ˆ์ฝ”๋“œ ์ถ”๊ฐ€

    ๊ธฐ๊ด€ DNS ๊ด€๋ฆฌ์ž์—๊ฒŒ ์š”์ฒญํ•ด TXT ๋ ˆ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  4. 4

    ์ธ์ฆ ํ™•์ธ ํ›„ ํ™œ์„ฑํ™”

    ์ €ํฌ๊ฐ€ ๋ ˆ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜๋ฉด ๋„๋ฉ”์ธ ๋“ฑ๋ก์ด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

DNS TXT ๋ ˆ์ฝ”๋“œ ์˜ˆ์‹œ

dns
# ๋ ˆ์ฝ”๋“œ ํƒ€์ž…: TXT
# ํ˜ธ์ŠคํŠธ: _aiedu-challenge.learn.example.com
# ๊ฐ’: aiedu-challenge=abc123xyz (์ €ํฌ๊ฐ€ ๋ฐœ๊ธ‰ํ•˜๋Š” ํ† ํฐ)

DNS ์ „ํŒŒ๋Š” ์ตœ๋Œ€ 48์‹œ๊ฐ„ ์†Œ์š”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ํ›„ ์ €ํฌ์—๊ฒŒ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋“ฑ๋ก ์‹œ ํ•„์š” ์ •๋ณด

ํ•ญ๋ชฉ์„ค๋ช…์˜ˆ์‹œ
๋„๋ฉ”์ธ๊ธฐ๊ด€ ์ „์šฉ ์ ‘์† ์ฃผ์†Œlearn.example.com
SSO ๋ฐฉ์‹ํ•ด๋‹น ๋„๋ฉ”์ธ์— ์ ์šฉํ•  ์ธ์ฆ ๋ฐฉ์‹SAML / OIDC
SSO ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ URLIdP ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ฃผ์†Œhttps://idp.example.com/metadata
ํ—ˆ์šฉ ์ด๋ฉ”์ผ ๋„๋ฉ”์ธ์ ‘์† ํ—ˆ์šฉํ•  ์ด๋ฉ”์ผ ํŒจํ„ด@example.com