- 7-8월 초기 구축 문서 12개를 _archive/troubleshooting/2025_07-08_initial_setup/로 이동 - book/300_architecture/390_human_in_the_loop_intent_learning.md를 journey/research/intent_classification/로 이동 (개발 여정 문서) - 빈 폴더 제거 (journey/assets/*)
5.1 KiB
5.1 KiB
통합 인증 시스템 아키텍처
개요
로빙 서비스의 통합 인증 시스템으로 Gmail, Slack 등 다양한 OAuth 제공자를 지원합니다.
시스템 구성
1. Auth Server (포트 9000)
- 위치:
/home/admin/auth-server - 기술 스택: FastAPI, PostgreSQL, Redis
- 주요 기능:
- OAuth 2.0/OIDC 인증
- JWT 토큰 발급 및 검증
- 사용자 관리
- 워크스페이스 권한 관리
2. 인증 제공자 (Providers)
Gmail OAuth
- 엔드포인트:
/auth/gmail/login - 콜백:
/auth/gmail/callback - 특징:
- 임시 코드 방식 (
/auth/verify) - Redis에 60초간 토큰 저장
- JWT 토큰 30일 유효
- 임시 코드 방식 (
Slack OAuth (OIDC)
- 엔드포인트:
/auth/slack/login/ - 콜백:
/auth/slack/login/callback - 특징:
- OIDC with form_post
- GET/POST 콜백 모두 지원
- 하이브리드 사용자 매핑
NAVER WORKS OAuth
- 엔드포인트:
/auth/naverworks/login - 콜백:
/auth/naverworks/callback - 특징:
- OAuth 2.0 + OpenID Connect
- Service Account (JWT) 지원
- Access Token 1시간, Refresh Token Rotation
- 결정필요: Redirect URL 도메인 (auth.ro-being.com vs auth.robeing.com)
3. 데이터베이스 구조
users 테이블
- id: UUID (Primary Key)
- email: VARCHAR(255) UNIQUE
- username: VARCHAR(100) UNIQUE
- name: VARCHAR(255)
- created_at: TIMESTAMP
slack_user_mapping 테이블
- slack_user_id: VARCHAR(100)
- slack_workspace_id: UUID
- user_id: UUID (FK → users.id)
- created_at: TIMESTAMP
- PRIMARY KEY (slack_user_id, slack_workspace_id)
gmail_token 테이블
- id: UUID
- user_id: UUID (FK → users.id)
- access_token: TEXT (암호화 필요)
- refresh_token: TEXT
- expires_at: TIMESTAMP
4. 인증 플로우
sequenceDiagram
participant U as User
participant F as Frontend
participant A as Auth Server
participant O as OAuth Provider
participant R as Redis
participant D as Database
U->>F: 로그인 클릭
F->>A: GET /auth/{provider}/login
A->>R: state 저장 (CSRF 방지)
A->>O: Redirect to OAuth
O->>U: 권한 요청
U->>O: 승인
O->>A: POST/GET callback with code
A->>O: Exchange code for token
O->>A: Return user info
A->>D: 사용자 조회/생성
A->>R: 임시 코드 저장
A->>F: Redirect with temp code
F->>A: POST /auth/verify
A->>R: 코드 검증
A->>F: Return JWT token
F->>F: localStorage 저장
현재 구현 상태
완료된 기능 ✅
- Gmail OAuth 로그인
- Slack OIDC 로그인
- JWT 토큰 발급 (30일)
- Redis 기반 state 관리
- 사용자 자동 생성/연동
임시 해결책 ⚠️
-
Frontend-Backend 불일치
- Frontend가
/auth/verify방식 사용 - Slack도 임시 코드 방식으로 맞춤
- Frontend가
-
DB 스키마 불일치
- company vs workspaces 테이블 공존
- relationship 주석 처리
-
하드코딩된 값
- redirect_uri: "http://localhost:3000"
- callback_url: "https://auth.ro-being.com/..."
Gmail Passport 시스템
엔드포인트
-
발급 시작:
GET /auth/gmail/passport- Parameters:
user_id: 사용자 ID (필수)return_url: OAuth 완료 후 돌아갈 URL (선택)
- Response: Google OAuth 페이지로 302 Redirect
- Parameters:
-
콜백 처리:
GET /auth/gmail/passport/callback- Google OAuth 콜백 자동 처리
- 토큰 저장 후 return_url 또는 /game으로 리다이렉트
- 성공 시:
?gmail=success&email={email}파라미터 추가
특징
- 원페이지 복귀: OAuth 인증 후 원래 있던 페이지로 자동 복귀
- 상태 관리: state 파라미터에 return_url 포함하여 전달
- 토큰 저장: gmail_token 테이블에 암호화 저장
보안 고려사항
구현된 보안 기능
- CSRF 방지 (state 파라미터)
- 1회용 임시 코드 (60초 TTL)
- HTTPS only cookies
- JWT 서명 검증
환경 변수
필수 설정
# JWT
JWT_SECRET_KEY=your-secret-key
JWT_ALGORITHM=HS256
JWT_EXPIRATION_DAYS=30
# Slack OAuth
SLACK_CLIENT_ID=
SLACK_CLIENT_SECRET=
SLACK_REDIRECT_URI=
# Gmail OAuth
GMAIL_CLIENT_ID=
GMAIL_CLIENT_SECRET=
GMAIL_REDIRECT_URI=
# NAVER WORKS OAuth
NAVERWORKS_CLIENT_ID=
NAVERWORKS_CLIENT_SECRET=
NAVERWORKS_REDIRECT_URI=
NAVERWORKS_SERVICE_ACCOUNT=
NAVERWORKS_PRIVATE_KEY_PATH=
# Redis
REDIS_URL=redis://localhost:6379/0
# PostgreSQL
DATABASE_URL=postgresql://robeings:password@localhost/main_db
향후 개선 계획
단기 (1-2주)
- DB 스키마 통일 (company → workspaces)
- Frontend 인증 방식 통일
- 환경변수 정리
중기 (1개월)
- Refresh Token 구현
- 다중 OAuth 제공자 통합 관리
- 권한 시스템 고도화
장기 (3개월)
- SSO (Single Sign-On) 구현
- 2FA (Two-Factor Authentication)
- 감사 로그 시스템