diff --git a/troubleshooting/250827_UUID_username_혼용_CRITICAL.md b/troubleshooting/250827_UUID_username_혼용_CRITICAL.md index c47d248..bcb891b 100644 --- a/troubleshooting/250827_UUID_username_혼용_CRITICAL.md +++ b/troubleshooting/250827_UUID_username_혼용_CRITICAL.md @@ -18,10 +18,11 @@ ### 실제 사례 - User: happybell80 -- UUID: 1e16e9d5-59f3-54da-a661-8abeabff4230 -- JWT sub: "happybell80" (UUID 아님) -- ChromaDB user_id: "happybell80" (UUID 아님) -- conversation_logs: user_id NULL (UUID 타입이라 username 저장 실패) +- UUID: 1e16e9d5-59f3-54da-a661-8abeabff4230 (UUID4 랜덤 생성) +- JWT sub: "happybell80" (username, UUID 아님) +- ChromaDB user_id: "happybell80" (username으로 저장됨) +- PostgreSQL: "Non-UUID user_id" 로그 발생 +- conversation_logs: user_id NULL, slack_user_id에 우회 저장 --- @@ -39,30 +40,43 @@ jwt_token = create_access_token(data={ ``` **문제**: JWT 표준에서 `sub`는 unique identifier여야 하는데 username 사용 -### 2.2 robeing-gateway (51123) +### 2.2 robeing-gateway (51123) - 확인 완료 ```python -# /home/admin/robeing-gateway/app/main.py:58 -username = payload.get("sub") or payload.get("username") -# username을 user_id처럼 사용 +# /home/admin/robeing-gateway/app/main.py:232-235 +user_info = await get_user_by_username(x_user_id) +if user_info: + user_uuid = user_info['user_id'] # DB 조회로 UUID 획득 + +# database.py:184 +SELECT id::text as user_id # PostgreSQL UUID를 문자열로 변환 ``` -**문제**: username을 UUID로 변환 시도하지만 실패 시 그대로 전달 +**확인된 사항**: +- username → UUID 변환은 DB 조회로만 수행 (계산된 변환 없음) +- UUID4 형식만 사용 (UUID5 사용 안 함) +- users 테이블에 username 없으면 변환 실패 -### 2.3 rb8001 (51124) +### 2.3 rb8001 (51124) - 확인 완료 ```python # auth.py:36 -user_id = payload.get("sub") # username을 user_id로 착각 -# ChromaDB에 username으로 저장 -metadata={"user_id": user_id} # 실제로는 username +user_id = payload.get("sub") # JWT sub(username)를 그대로 사용 +# UUID 변환 없이 ChromaDB에 저장 +metadata={"user_id": user_id} # username이 저장됨 ``` -**문제**: ChromaDB에서 사용자 구분 불가능 (UUID가 아닌 username) +**확인된 문제**: +- ChromaDB에 "happybell80" (username) 형식으로 저장 +- PostgreSQL 저장 시 "Non-UUID user_id" 에러 로그 발생 +- user_id NULL, slack_user_id로 우회 저장 -### 2.4 Frontend +### 2.4 Frontend - 확인 완료 ```typescript -// robeing-api.ts:31, 157, 223, 262, 308, 354, 402, 448, 495 -userId: string = 'test_user' // 하드코딩 -localStorage.getItem('user_id') || 'default_user' // 폴백 +// robeing-api.ts:157 +const userId = localStorage.getItem('user_id') || 'default_user'; +// localStorage의 'user_id'는 Slack ID (U0925SXQFDK 형식) ``` -**문제**: 실제 UUID 대신 임의 문자열 사용 +**확인된 문제**: +- localStorage 'user_id' = Slack ID (예: U0925SXQFDK) +- JWT sub도 아니고 UUID도 아님 +- 완전히 다른 체계 사용 중 ### 2.5 Database ```sql @@ -84,11 +98,12 @@ slack_user_id: 'happybell80' -- 우회 저장 - UUID 사용 표준 부재 - 타입 검증 없는 문자열 전달 -### 3.2 구현 문제 -- auth-server: JWT `sub`에 username 사용 -- Gateway: username → UUID 변환 실패 시 방치 -- Frontend: localStorage에 UUID 저장 안함 -- rb8001: JWT `sub`를 무조건 user_id로 간주 +### 3.2 구현 문제 (확인 완료) +- auth-server: JWT `sub`에 username 사용 (UUID 대신) +- Gateway: DB 조회로만 UUID 변환 (실패 시 원래 값 전달) +- Frontend: localStorage에 Slack ID 저장 (UUID도 username도 아님) +- rb8001: JWT `sub`를 변환 없이 그대로 user_id로 사용 +- skill-email: slack_user_id 컬럼으로 Slack ID 조회 --- @@ -139,18 +154,23 @@ username = payload.get("username") # username ## 5. 테스트 시나리오 -### 5.1 현재 상태 확인 +### 5.1 현재 상태 확인 (검증 완료) ```bash # JWT payload 확인 curl -X POST http://localhost:9000/auth/gmail/login +# sub: "happybell80" (username) # DB 확인 SELECT id, username FROM users WHERE username='happybell80'; -# UUID: 1e16e9d5-59f3-54da-a661-8abeabff4230 +# UUID: 1e16e9d5-59f3-54da-a661-8abeabff4230 (UUID4) # conversation_logs 확인 SELECT user_id, slack_user_id FROM conversation_logs; -# user_id: NULL, slack_user_id: 'happybell80' +# user_id: NULL (UUID 타입이라 username 저장 실패) +# slack_user_id: 'happybell80' (우회 저장) + +# PostgreSQL 로그 +# "Non-UUID user_id" 에러 발생 ``` ### 5.2 수정 후 검증