# 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단계 실행 (기존 컬럼 제거)