diff --git a/ideas/250924_happybell80_oauth_jsonb_multi_provider.md b/ideas/250924_happybell80_oauth_jsonb_multi_provider.md deleted file mode 100644 index 16665ba..0000000 --- a/ideas/250924_happybell80_oauth_jsonb_multi_provider.md +++ /dev/null @@ -1,83 +0,0 @@ -# OAuth 다중 프로바이더 지원을 위한 JSONB 구조 개선안 - -## 작성일: 2025-09-24 -## 작성자: happybell80 - ---- - -## 현재 문제점 - -### 1. 단일 OAuth 구조의 한계 -- `oauth_id` VARCHAR: 하나의 프로바이더만 지원 -- `oauth_provider` VARCHAR: 단일 값만 저장 가능 -- 사용자가 여러 플랫폼(Slack + Google + 네이버웍스) 동시 사용 불가 - -### 2. 실제 발생한 문제 사례 -- 김종태: Google(100176844464607664427) + Slack(U0925SXQFDK) 분리된 계정 -- JWT에는 Slack ID 포함되지만 DB에서 변환 실패 -- 테스트 시 실제 사용자 ID 찾기 어려움 - -## 해결책: JSONB 다중 프로바이더 구조 - -### 제안 스키마 -```sql -ALTER TABLE "user" -DROP COLUMN oauth_id, -DROP COLUMN oauth_provider, -ADD COLUMN oauth_providers JSONB DEFAULT '{}'; -``` - -### 데이터 구조 예시 -```json -{ - "slack": "U0925SXQFDK", - "google": "100176844464607664427", - "works": "네이버웍스_사용자ID" -} -``` - -## 장점 - -### 1. 확장성 -- 새 OAuth 프로바이더 추가 용이 -- 기존 데이터 마이그레이션 가능 -- 향후 Microsoft, Apple 등 추가 지원 - -### 2. 사용자 편의성 -- 하나의 계정으로 다중 플랫폼 접근 -- 플랫폼별 기능 제한 없음 -- 통합된 사용자 경험 - -### 3. 시스템 안정성 -- UUID 중심 아키텍처 유지 -- 프로바이더 장애 시 다른 방법으로 접근 가능 - -## 구현 고려사항 - -### 1. 마이그레이션 스크립트 -```sql -UPDATE "user" SET oauth_providers = - json_build_object(oauth_provider, oauth_id)::jsonb -WHERE oauth_id IS NOT NULL; -``` - -### 2. 코드 수정 영역 -- `slack_user_to_uuid()`: JSONB 쿼리로 변경 -- JWT 생성: 다중 프로바이더 정보 포함 -- 인증 로직: 프로바이더별 처리 - -### 3. 인덱스 최적화 -```sql -CREATE INDEX idx_user_oauth_slack ON "user" -USING GIN ((oauth_providers->'slack')); -``` - -## 마이그레이션 전략 -1. 기존 데이터 백업 -2. JSONB 컬럼 추가 -3. 데이터 변환 스크립트 실행 -4. 애플리케이션 코드 수정 -5. 테스트 및 검증 -6. 기존 컬럼 제거 - -이 구조로 변경하면 사용자 경험 향상과 시스템 확장성을 동시에 확보할 수 있습니다. \ No newline at end of file diff --git a/troubleshooting/20251013_oauth_jsonb_multi_provider.md b/troubleshooting/20251013_oauth_jsonb_multi_provider.md new file mode 100644 index 0000000..334e05f --- /dev/null +++ b/troubleshooting/20251013_oauth_jsonb_multi_provider.md @@ -0,0 +1,65 @@ +# OAuth 다중 프로바이더 지원 구현 + +## 작성일: 2025-10-13 +## 작성자: happybell80 + +--- + +## 현재 상황 + +### user 테이블 스키마 +- oauth_provider VARCHAR(50) +- oauth_id VARCHAR(255) +- 한 사용자당 하나의 OAuth 프로바이더만 저장 가능 + +### 코드 위치 +- robeing-gateway/app/database.py:353,368-369 - slack_user_to_uuid +- robeing-gateway/app/models.py:22-23 - User 모델 +- auth-server/app/providers/slack.py:275-276,287-288 - Slack OAuth +- auth-server/app/providers/gmail.py:164-165,174-175 - Google OAuth +- auth-server/app/providers/naverworks.py:225-226,233-234,243-244 - NaverWorks OAuth +- auth-server/app/models/user.py:26-27 - User 모델 + +### 문제 +auth-server/app/providers/slack.py:287-288에서 기존 사용자의 oauth_provider를 덮어씀: +- 사용자가 Google로 먼저 로그인 → oauth_provider='google' +- 같은 사용자가 Slack으로 로그인 → oauth_provider='slack'으로 덮어씀 +- Google 정보 손실, Slack으로만 로그인 가능 + +--- + +## 해결 방법 + +### 1단계: JSONB 컬럼 추가 (기존 컬럼 유지) +- ALTER TABLE "user" ADD COLUMN oauth_providers JSONB DEFAULT '{}' + +### 2단계: 기존 데이터 변환 +- UPDATE "user" SET oauth_providers = json_build_object(oauth_provider, oauth_id)::jsonb WHERE oauth_id IS NOT NULL + +### 3단계: 코드 수정 (6개 파일) + +#### robeing-gateway +- app/database.py:368-369 - oauth_providers->>'slack' 쿼리로 변경 +- app/models.py:22-23 - oauth_providers JSONB 추가 + +#### auth-server +- app/providers/slack.py:275-276,287-288 - oauth_providers JSONB 병합 +- app/providers/gmail.py:164-165,174-175 - oauth_providers JSONB 병합 +- app/providers/naverworks.py:225-226,233-234,243-244 - oauth_providers JSONB 병합 +- app/models/user.py:26-27 - oauth_providers JSONB 추가 + +### 4단계: GIN 인덱스 추가 +- CREATE INDEX idx_user_oauth_providers ON "user" USING GIN (oauth_providers) + +### 5단계: 테스트 후 기존 컬럼 제거 +- ALTER TABLE "user" DROP COLUMN oauth_provider, DROP COLUMN oauth_id + +--- + +## 구현 순서 +1. 1단계 실행 (JSONB 컬럼 추가) +2. 2단계 실행 (데이터 변환) +3. 3단계 실행 (코드 수정 6개 파일) +4. 테스트 (Google → Slack → NaverWorks 순차 로그인) +5. 4단계 실행 (인덱스 추가) +6. 5단계 실행 (기존 컬럼 제거)