From 5b1a6fdc3b0177fc5c1dbb8070dfebc63ca60578 Mon Sep 17 00:00:00 2001 From: Claude-51124 Date: Wed, 27 Aug 2025 10:58:52 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20ChromaDB=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=20=EA=B2=A9=EB=A6=AC=20=EB=B0=8F=20skill-email=20=ED=86=A0?= =?UTF-8?q?=ED=81=B0=20=EA=B0=B1=EC=8B=A0=20=EB=AC=B8=EC=A0=9C=20=ED=8A=B8?= =?UTF-8?q?=EB=9F=AC=EB=B8=94=EC=8A=88=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - rb8001 ChromaDB 사용자별 대화 격리 문제 분석 - skill-email OAuth 토큰 자동 갱신 미구현 문제 추가 - auth-server API 이미 구현 완료 상태 반영 --- .../250827_claude_chromadb_user_isolation.md | 200 ++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 troubleshooting/250827_claude_chromadb_user_isolation.md diff --git a/troubleshooting/250827_claude_chromadb_user_isolation.md b/troubleshooting/250827_claude_chromadb_user_isolation.md new file mode 100644 index 0000000..ca14c29 --- /dev/null +++ b/troubleshooting/250827_claude_chromadb_user_isolation.md @@ -0,0 +1,200 @@ +# 51124 서버 주요 이슈 - ChromaDB 격리 및 OAuth 토큰 갱신 + +## 문제 발생일 +2025-08-27 + +## 작성자 +Claude Code + +## 문제 1: ChromaDB 사용자 대화 격리 문제 + +### 문제 설명 +rb8001 서비스에서 ChromaDB에 모든 사용자의 대화가 하나의 컬렉션에 저장되어, 사용자 간 대화 내용이 섞일 수 있는 보안 및 프라이버시 문제 발견 + +### 현상 +1. **rb8001 현재 구조** + - 컬렉션명: `robeing_rb8001_memories` (고정) + - 모든 사용자 대화가 동일 컬렉션에 저장 + - metadata의 user_id 필드로만 구분 + +2. **발생 가능한 문제** + - 메모리 검색 시 다른 사용자의 대화 내용 노출 가능 + - 사용자 A가 질문할 때 사용자 B의 대화 맥락이 참조될 수 있음 + - 개인정보 유출 위험 + +### 원인 분석 + +#### rb8001 코드 분석 +```python +# /home/admin/ivada_project/rb8001/app/memory/manager.py:40 +self.collection_name = f"robeing_{robeing_id}_memories" + +# /home/admin/ivada_project/rb8001/app/router/router.py:327-336 +await self.memory_manager.store_memory( + content=f"User: {message}\nAssistant: {response}", + metadata={ + "user_id": user_id, # metadata에만 저장 + "channel_id": channel, + "intent": intent, + "confidence": confidence + }, + memory_type="conversation" +) +``` + +#### rb10508_micro 올바른 구조 (참고) +```python +# /home/admin/ivada_project/rb10508_micro/app/core/memory/storage.py:88 +collection_name = f"{settings.ROBEING_ID}_{username if username else 'default'}_{memory_type}" +# 예: rb10508_test_김종태_episodic +``` + +### 해결 방안 + +#### 1. 즉시 적용 가능한 임시 조치 +- 메모리 검색 시 user_id 필터링 강화 +- `where` 조건에 user_id 필수 포함 + +#### 2. 근본적 해결책 (권장) +rb8001의 MemoryManager 클래스를 rb10508 방식으로 수정: + +```python +# 수정 전 +self.collection_name = f"robeing_{robeing_id}_memories" + +# 수정 후 +def get_collection_name(self, user_id: str, memory_type: str = "conversation"): + """사용자별 컬렉션명 생성""" + return f"robeing_{self.robeing_id}_{user_id}_{memory_type}" +``` + +#### 3. 구현 시 고려사항 +- 기존 데이터 마이그레이션 필요 +- 컬렉션 생성 시점 조정 (사용자별 동적 생성) +- 메모리 검색 로직 수정 + +### 영향 범위 +- **영향받는 서비스**: rb8001 +- **영향받지 않는 서비스**: rb10508_micro (이미 사용자별 분리) +- **데이터 보안**: HIGH (개인정보 노출 위험) +- **긴급도**: HIGH + +### 테스트 방법 +```bash +# 1. 현재 컬렉션 구조 확인 +docker exec -it rb8001 python -c " +import chromadb +client = chromadb.PersistentClient(path='/app/chroma_db') +print(client.list_collections()) +" + +# 2. 특정 사용자 대화만 조회 테스트 +curl -X POST http://localhost:8001/api/memory/search \ + -H "Content-Type: application/json" \ + -d '{ + "query": "test", + "user_id": "U0925SXQFDK", + "limit": 5 + }' +``` + +--- + +## 문제 2: skill-email OAuth 토큰 자동 갱신 부재 + +### 문제 설명 +skill-email 서비스가 Gmail OAuth 토큰의 자동 갱신 기능이 구현되지 않아, 토큰 만료 시 수동 갱신 필요 + +### 현상 +1. **토큰 갱신 미구현** + - `/skill_email/services/gmail_service.py:62` TODO 주석 확인 + - refresh_credentials 함수가 실제 갱신 없이 그대로 반환 + +2. **auth-server 연동 부재** + - auth-server API 호출 코드 전혀 없음 + - 파일 시스템에서 토큰 읽기만 수행 (`/auth-server/tokens`) + - 토큰 만료 체크 로직 없음 + +### 원인 분석 + +#### 현재 상태 (2025-08-27 확인) +1. **auth-server (51123)**: ✅ 토큰 갱신 API 구현 완료 + - `/api/gmail/refresh/{user_id}` - 토큰 자동 갱신 + - `/api/gmail/check/{user_id}` - 토큰 상태 확인 + - 2025-08-23 문서에서 구현 확인됨 + +2. **skill-email (51124)**: ❌ auth-server API 미연동 + ```python + # /skill_email/services/gmail_service.py:60-63 + def refresh_credentials(self, user_id: str, creds: Credentials) -> Result[Credentials, EmailError]: + """토큰 갱신 (추후 구현)""" + # TODO: refresh token으로 새 access token 받기 + return Ok(creds) + ``` + +#### 문제점 +- skill-email이 auth-server의 준비된 갱신 API를 호출하지 않음 +- 파일 기반 토큰 읽기만 수행 (TOKEN_BASE 환경변수) +- 토큰 만료 체크 로직 부재 + +### 해결 방안 + +#### 1. auth-server의 기존 API 활용 (51124 서버 작업 필요) +```python +# skill-email에서 호출해야 할 auth-server API +async def refresh_token_via_auth_server(self, user_id: str): + """auth-server의 기존 갱신 API 호출""" + response = await httpx.post( + f"http://192.168.219.45:3000/api/gmail/refresh/{user_id}" + ) + return response.json() +``` + +#### 2. 토큰 만료 체크 및 자동 갱신 +```python +if creds.expired and creds.refresh_token: + creds = await self.refresh_token_via_auth_server(user_id, creds.refresh_token) +``` + +#### 3. 구현 위치 +- `/skill_email/services/gmail_service.py`의 refresh_credentials 함수 +- `_get_gmail_service` 함수에서 토큰 체크 로직 추가 + +### 영향 범위 +- **영향받는 서비스**: skill-email +- **관련 서비스**: auth-server (51123 서버) +- **긴급도**: MEDIUM (토큰 만료 시 서비스 중단) + +### 테스트 방법 +```bash +# 1. 현재 토큰 상태 확인 (skill-email에서) +docker exec -it skill-email python -c " +from services.db_credentials_provider import DBCredentialsProvider +provider = DBCredentialsProvider() +creds = provider.get_credentials('U0925SXQFDK') +print(f'Token expiry: {creds.expiry if creds else None}') +" + +# 2. auth-server의 토큰 상태 확인 API (이미 구현됨) +curl http://192.168.219.45:3000/api/gmail/check/U0925SXQFDK + +# 3. auth-server의 토큰 갱신 API 테스트 (이미 구현됨) +curl -X POST http://192.168.219.45:3000/api/gmail/refresh/U0925SXQFDK +``` + +## 교훈 +1. **보안 우선 설계**: 멀티테넌트 환경에서는 데이터 격리가 필수 +2. **일관성 유지**: rb10508은 올바르게 구현되었으나 rb8001과 불일치 +3. **코드 리뷰 중요성**: 서비스 간 구조 차이 조기 발견 필요 +4. **TODO 관리**: TODO 주석은 반드시 추적하고 구현 필요 +5. **토큰 수명 관리**: OAuth 토큰은 자동 갱신 메커니즘 필수 + +## 참고 문서 +- rb10508_micro 메모리 구조: `/home/admin/ivada_project/rb10508_micro/app/core/memory/storage.py` +- rb8001 메모리 관리자: `/home/admin/ivada_project/rb8001/app/memory/manager.py` +- skill-email Gmail 서비스: `/home/admin/ivada_project/skill_email/services/gmail_service.py` +- auth-server 토큰 디렉토리: `/home/admin/auth-server/tokens` + +## 업데이트 이력 +- 2025-08-27: 초기 문서 작성 - ChromaDB 격리 문제 (Claude Code) +- 2025-08-27: skill-email OAuth 토큰 자동 갱신 문제 추가 (Claude Code) \ No newline at end of file