DOCS/troubleshooting/20251013_oauth_jsonb_multi_provider.md
happybell80 0b4a489d01 docs: OAuth JSONB 키 네이밍 및 인덱스 전략 수정
- JSONB 예시 추가: slack, google, naverworks 키 명시
- GIN 인덱스 → B-tree 표현식 인덱스로 변경
- 쿼리 형태: oauth_providers->>'slack' = 'U...'에 최적화
- 3개 프로바이더별 인덱스 분리

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-13 00:08:43 +09:00

2.5 KiB

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
  • 예시: {"slack": "U0925SXQFDK"} 또는 {"google": "100176844464607664427"} 또는 {"naverworks": "user_id"}

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단계: B-tree 인덱스 추가

  • CREATE INDEX idx_user_oauth_slack ON "user" ((oauth_providers->>'slack'))
  • CREATE INDEX idx_user_oauth_google ON "user" ((oauth_providers->>'google'))
  • CREATE INDEX idx_user_oauth_naverworks ON "user" ((oauth_providers->>'naverworks'))

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