docs: OAuth 다중 프로바이더 지원 구현 문서 작성
- ideas → troubleshooting 이동 및 날짜 변경 (250924 → 20251013) - 실제 파일명:줄번호 명시 (6개 파일) - 의사코드 제거, 실행 단계로 변경 - 문제: slack.py:287-288에서 oauth_provider 덮어씀 - 해결: oauth_providers JSONB로 다중 프로바이더 지원 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
733f4bece4
commit
45c74a64d7
@ -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. 기존 컬럼 제거
|
|
||||||
|
|
||||||
이 구조로 변경하면 사용자 경험 향상과 시스템 확장성을 동시에 확보할 수 있습니다.
|
|
||||||
65
troubleshooting/20251013_oauth_jsonb_multi_provider.md
Normal file
65
troubleshooting/20251013_oauth_jsonb_multi_provider.md
Normal file
@ -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단계 실행 (기존 컬럼 제거)
|
||||||
Loading…
x
Reference in New Issue
Block a user