DOCS/300_architecture/380_authentication_system.md
happybell80 8c02b80359 Fix incorrect table names in documentation
- gmail_tokens → gmail_token (33 files)
- companies → company (17 files)
- conversation_logs → conversation_log (27 files)
- workspace_members → workspace_member (28 files)

All table names now match the actual PostgreSQL schema
2025-09-26 00:49:47 +09:00

206 lines
5.1 KiB
Markdown

# 통합 인증 시스템 아키텍처
## 개요
로빙 서비스의 통합 인증 시스템으로 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)