# 통합 인증 시스템 아키텍처

## 개요
로빙 서비스의 통합 인증 시스템으로 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 테이블
```sql
- id: UUID (Primary Key)
- email: VARCHAR(255) UNIQUE
- username: VARCHAR(100) UNIQUE  
- name: VARCHAR(255)
- created_at: TIMESTAMP
```

#### slack_user_mapping 테이블
```sql
- 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 테이블
```sql
- id: UUID
- user_id: UUID (FK → users.id)
- access_token: TEXT (암호화 필요)
- refresh_token: TEXT
- expires_at: TIMESTAMP
```

### 4. 인증 플로우

```mermaid
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 관리
- 사용자 자동 생성/연동

### 임시 해결책 ⚠️
1. **Frontend-Backend 불일치**
   - Frontend가 `/auth/verify` 방식 사용
   - Slack도 임시 코드 방식으로 맞춤
   
2. **DB 스키마 불일치**
   - company vs workspaces 테이블 공존
   - relationship 주석 처리

3. **하드코딩된 값**
   - redirect_uri: "http://localhost:3000"
   - callback_url: "https://auth.ro-being.com/..."

## Gmail Passport 시스템

### 엔드포인트
1. **발급 시작**: `GET /auth/gmail/passport`
   - Parameters:
     - `user_id`: 사용자 ID (필수)
     - `return_url`: OAuth 완료 후 돌아갈 URL (선택)
   - Response: Google OAuth 페이지로 302 Redirect

2. **콜백 처리**: `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 서명 검증


## 환경 변수

### 필수 설정
```env
# 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주)
1. DB 스키마 통일 (company → workspaces)
2. Frontend 인증 방식 통일
3. 환경변수 정리

### 중기 (1개월)
1. Refresh Token 구현
2. 다중 OAuth 제공자 통합 관리
3. 권한 시스템 고도화

### 장기 (3개월)
1. SSO (Single Sign-On) 구현
2. 2FA (Two-Factor Authentication)
3. 감사 로그 시스템

## 관련 문서
- [Slack OAuth 구현 상세](/home/heejae/DOCS/troubleshooting/250831_slack_oauth_login_implementation.md)
- [UUID 변환 시스템](./uuid_conversion_system.md)
- [Gateway Proxy Patterns](./gateway_proxy_patterns.md)
