Skip to content

inft-auth 모노레포 인증 플랫폼 구축 #4

Description

@filename24

개요

OAuth 2.0 / OIDC / LDAP / 소셜 로그인을 지원하는 자체 인증 플랫폼 inft-auth를 신규 구축한다. 모노레포 + Docker 배포 패키지 + 외부 SDK로 패키지화한다.

목표

  • OAuth 2.0 + OpenID Connect(OIDC) 서버 (Nest.js + oidc-provider)
  • LDAP 인증 (lldap, PostgreSQL 백엔드 기반 신원 데이터 단일 DB)
  • 소셜 로그인 (GitHub, Discord)
  • WebFinger (/.well-known/webfinger) 제공으로 Tailscale 커스텀 OIDC 등 타 플랫폼과 연동
  • 단일 도메인 auth.inft.kr 운영 (WebFinger는 inft.kr)
  • 백엔드/프론트 분리 + 공용 Auth 코어 패키지 + 외부 이용자용 SDK

아키텍처

  • apps/backend — Nest.js 백엔드
    • OIDC 서버 (oidc-provider), WebFinger, LDAP 인증, 소셜 로그인, 세션 관리
  • apps/www — Next.js 프론트
    • 로그인 / consent / logout / signup / settings UI
  • packages/auth-core — 백엔드+프론트 공용 Auth 코어
    • 공유 타입, API 클라이언트, 서버 가드, React hooks(useSession/signIn/signOut), 쿠키 규칙
  • packages/auth-sdk — 외부 이용자용 OIDC SDK (@inft/auth-sdk, npm 배포)
  • packages/shared — 공용 타입·설정
  • packages/scripts — 내부 도구 (docs 분할 생성 등)
  • deploy/ — Docker Compose 배포 패키지 (postgres + lldap + backend + www + cloudflared)

도메인 라우팅

auth.inft.kr
├── /oauth2/*, /.well-known/openid-configuration, /.well-known/jwks.json → backend
├── /.well-known/webfinger                                              → backend
├── /api/*                                                              → backend
├── /login, /consent, /logout, /signup, /settings                       → www
inft.kr
└── /.well-known/webfinger                                              → backend

데이터 구조

PostgreSQL (신원 데이터 단일 DB)
├── auth DB   → backend (OAuth2 클라이언트, interaction/세션 상태) [Prisma]
└── lldap DB  → lldap (사용자 신원: 이메일/이름/그룹/비밀번호)

작업 항목

  • 모노레포 초기화 (pnpm workspaces + Turborepo), 공용 패키지 스캐폴딩
  • packages/shared 구현 (공용 상수·타입)
  • packages/auth-core 구현 (types / client / server guard / React hooks / shared)
  • packages/auth-sdk 구현 (OIDC discovery / PKCE / code exchange / userinfo / JWT 검증 / refresh / logout)
  • 패키지 docs 파이프라인 (api-extractor + generate-split-documentation, 멤버별 markdown)
  • apps/backend 구현 — PR feat(backend): nest.js OIDC provider, session API and admin client management #5 머지 완료
    • lldap 연동 및 LDAP bind 인증 (인증 위주, CRUD는 lldap 소유 정책)
    • 로그인 세션 쿠키 관리
    • WebFinger 엔드포인트
    • OIDC 서버 (oidc-provider, 발급/검증/claims)
    • 소셜 로그인 (GitHub, Discord) — 소셜 계정–lldap 사용자 연결 정책 (후속 작업)
  • apps/www UI 구현 (auth-core 기반) — PR feat(www): Next.js App Router 프론트 구현 (socket), #6 머지 완료
  • packages/auth-sdk npm 배포 준비 (README/package.json/vitest 테스트/dry-run 완료)
  • packages/auth-sdk npm 공개 배포 (@INFT scope 소유 확인 후 별도 진행)
  • deploy/ 배포 패키지 — PR feat(deploy): add self-hosted Docker Compose deployment #7 (feat/deploy → develop, 머지 대기)
    • lldap 컨테이너 (PostgreSQL 백엔드)
    • postgres init (auth/lldap DB 생성)
    • cloudflared ingress 설정 (locally-managed, 실 config(config.yml/credentials.json)는 gitignore, 템플릿만 추적)
    • compose.yaml (postgres + lldap + backend + www + cloudflared, cloudflared는 --profile tunnel)
    • Copilot 리뷰 반영 (9fb9695) — DB 자격증명 로그 redact, npx --no-install, TCP 프로브 타임아웃, check_tools 호출, tunnel 프로파일
  • Tailscale 커스텀 OIDC 클라이언트 등록 (https://login.tailscale.com/a/oauth_response, scope: openid profile email)
  • 검증
    • OIDC discovery (auth.inft.kr/.well-known/openid-configuration) 200 확인
    • WebFinger lookup (backend 직접 200 확인, 도메인 라우팅 후 재확인 필요)
    • LDAP 로그인 실사용 검증 (더미 유저 dummy@inft.kr 생성, POST /api/v1/auth/ldap 201 + inft_session 쿠키 + GET /api/v1/session 200)
    • Tailscale OIDC 로그인 테스트 — OIDC authorize flow 차단 확인, 다음 세션 진행
      • cloudflared ingress를 실제 OIDC 라우트(/auth, /token, /interaction/* 등)로 매핑 (현재 /oauth2*만 backend, 루트 경로가 www로 샘 → 404)
      • 소비 서비스 인가 flow interaction UI (production에서 devInteractions off, www에 로그인/consent 처리 필요)
      • discovery가 http:// 엔드포인트를 노출 (x-forwarded-proto/trust proxy 처리)
    • 소셜 로그인 / 기존 OIDC 서비스 연동 테스트 (후속)
  • README 및 운영 문서(docs/) 작성 — deploy/README.md 작성 완료, 나머지 후속

진행 기록

  • feat(backend): nest.js OIDC provider, session API and admin client management #5 feat/backend → stable 머지 (8e105f0) — Nest.js OIDC/세션 API, admin 클라이언트 API, LDAP bind 인증, WebFinger, 권한 비트필드
  • feat(www): Next.js App Router 프론트 구현 (socket), #6 feat/www → develop 머지 (fe86396) — Next.js 스캐폴딩(shadcn/ui + 포털 테마), 홈/로그인/로그아웃/signup·consent, settings(+admin OIDC 클라이언트 관리)
  • 백엔드 추가 변경 사항은 stable에서 develop으로 패스트포워드 병합됨
  • feat(deploy): add self-hosted Docker Compose deployment #7 feat/deploy → develop (머지 대기) — Docker Compose 배포 패키지(deploy/), locally-managed cloudflared, setup.sh .env 생성 + 터널 자산 생성, Copilot 리뷰 반영 완료
  • 실환경 검증deploy/ 스택 기동 후 실 도메인(auth.inft.kr)으로 OIDC discovery/WebFinger 200, LDAP 로그인(더미 유저 dummy@inft.kr) 201 + 세션 200 확인
  • OIDC authorize flow 차단 확인 — ingress가 /oauth2*만 backend로 매핑, 실제 oidc-provider 라우트(/auth, /token, /interaction/* 등 루트 경로)가 www로 샘 → 404. discovery가 http:// 엔드포인트 노출(x-forwarded-proto 미처리). 다음 세션에서 ingress + interaction UI + trust proxy 처리 예정

관련 사항

  • 도메인: auth.inft.kr (OIDC issuer), inft.kr (WebFinger) — Cloudflare Tunnel 사용
  • 소셜 연결 정책: 동일 이메일 자동 병합 금지
  • 세션 쿠키: HttpOnly; Secure; SameSite=Lax
  • ORM: Prisma (auth DB만 관리, lldap DB는 lldap 소유)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions