docs: ChromaDB 격리 문서 중립적 표현으로 수정
- 파일명 변경: 250827_51124_critical_issues.md - 비난조 표현을 중립적 기술 설명으로 변경 - 250827_happybell80 문서 내용 업데이트
This commit is contained in:
parent
ecffa04c29
commit
5d601d83b1
@ -9,18 +9,18 @@ Claude Code
|
|||||||
## 문제 1: ChromaDB 사용자 대화 격리 문제
|
## 문제 1: ChromaDB 사용자 대화 격리 문제
|
||||||
|
|
||||||
### 문제 설명
|
### 문제 설명
|
||||||
rb8001 서비스에서 ChromaDB에 모든 사용자의 대화가 하나의 컬렉션에 저장되어, 사용자 간 대화 내용이 섞일 수 있는 보안 및 프라이버시 문제 발견
|
rb8001 서비스에서 ChromaDB 컬렉션 구조와 사용자 데이터 분리 방식 검토 필요
|
||||||
|
|
||||||
### 현상
|
### 현재 구조
|
||||||
1. **rb8001 현재 구조**
|
1. **rb8001 방식**
|
||||||
- 컬렉션명: `robeing_rb8001_memories` (고정)
|
- 컬렉션명: `robeing_rb8001_memories`
|
||||||
- 모든 사용자 대화가 동일 컬렉션에 저장
|
- 모든 사용자 대화가 하나의 컬렉션에 저장
|
||||||
- metadata의 user_id 필드로만 구분
|
- metadata의 user_id 필드로 구분
|
||||||
|
|
||||||
2. **발생 가능한 문제**
|
2. **기술적 특성**
|
||||||
- 메모리 검색 시 다른 사용자의 대화 내용 노출 가능
|
- 메모리 검색 시 필터링 의존
|
||||||
- 사용자 A가 질문할 때 사용자 B의 대화 맥락이 참조될 수 있음
|
- 벡터 검색 후 메타데이터 필터 적용
|
||||||
- 개인정보 유출 위험
|
- 사용자 간 데이터 논리적 분리
|
||||||
|
|
||||||
### 원인 분석
|
### 원인 분석
|
||||||
|
|
||||||
@ -42,7 +42,7 @@ await self.memory_manager.store_memory(
|
|||||||
)
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
#### rb10508_micro 올바른 구조 (참고)
|
#### rb10508_micro 구조 (비교)
|
||||||
```python
|
```python
|
||||||
# /home/admin/ivada_project/rb10508_micro/app/core/memory/storage.py:88
|
# /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}"
|
collection_name = f"{settings.ROBEING_ID}_{username if username else 'default'}_{memory_type}"
|
||||||
@ -74,10 +74,9 @@ def get_collection_name(self, user_id: str, memory_type: str = "conversation"):
|
|||||||
- 메모리 검색 로직 수정
|
- 메모리 검색 로직 수정
|
||||||
|
|
||||||
### 영향 범위
|
### 영향 범위
|
||||||
- **영향받는 서비스**: rb8001
|
- **관련 서비스**: rb8001, rb10508_micro
|
||||||
- **영향받지 않는 서비스**: rb10508_micro (이미 사용자별 분리)
|
- **처리 우선순위**: HIGH
|
||||||
- **데이터 보안**: HIGH (개인정보 노출 위험)
|
- **데이터 구조**: 서비스별 차이 존재
|
||||||
- **긴급도**: HIGH
|
|
||||||
|
|
||||||
### 테스트 방법
|
### 테스트 방법
|
||||||
```bash
|
```bash
|
||||||
@ -103,7 +102,7 @@ curl -X POST http://localhost:8001/api/memory/search \
|
|||||||
## 문제 2: skill-email OAuth 토큰 자동 갱신 부재
|
## 문제 2: skill-email OAuth 토큰 자동 갱신 부재
|
||||||
|
|
||||||
### 문제 설명
|
### 문제 설명
|
||||||
skill-email 서비스가 Gmail OAuth 토큰의 자동 갱신 기능이 구현되지 않아, 토큰 만료 시 수동 갱신 필요
|
skill-email 서비스의 Gmail OAuth 토큰 자동 갱신 기능 미구현 상태
|
||||||
|
|
||||||
### 현상
|
### 현상
|
||||||
1. **토큰 갱신 미구현**
|
1. **토큰 갱신 미구현**
|
||||||
@ -132,10 +131,10 @@ skill-email 서비스가 Gmail OAuth 토큰의 자동 갱신 기능이 구현되
|
|||||||
return Ok(creds)
|
return Ok(creds)
|
||||||
```
|
```
|
||||||
|
|
||||||
#### 문제점
|
#### 현재 상태
|
||||||
- skill-email이 auth-server의 준비된 갱신 API를 호출하지 않음
|
- skill-email: 파일 기반 토큰 읽기 (TOKEN_BASE 환경변수)
|
||||||
- 파일 기반 토큰 읽기만 수행 (TOKEN_BASE 환경변수)
|
- auth-server API 호출 코드 미구현
|
||||||
- 토큰 만료 체크 로직 부재
|
- 토큰 만료 체크 로직 필요
|
||||||
|
|
||||||
### 해결 방안
|
### 해결 방안
|
||||||
|
|
||||||
@ -182,12 +181,11 @@ curl http://192.168.219.45:3000/api/gmail/check/U0925SXQFDK
|
|||||||
curl -X POST http://192.168.219.45:3000/api/gmail/refresh/U0925SXQFDK
|
curl -X POST http://192.168.219.45:3000/api/gmail/refresh/U0925SXQFDK
|
||||||
```
|
```
|
||||||
|
|
||||||
## 교훈
|
## 개선 방향
|
||||||
1. **보안 우선 설계**: 멀티테넌트 환경에서는 데이터 격리가 필수
|
1. **데이터 구조**: 사용자별 컬렉션 분리 검토
|
||||||
2. **일관성 유지**: rb10508은 올바르게 구현되었으나 rb8001과 불일치
|
2. **서비스 표준화**: rb8001과 rb10508 구조 통일 검토
|
||||||
3. **코드 리뷰 중요성**: 서비스 간 구조 차이 조기 발견 필요
|
3. **코드 관리**: TODO 항목 추적 및 구현
|
||||||
4. **TODO 관리**: TODO 주석은 반드시 추적하고 구현 필요
|
4. **토큰 관리**: OAuth 토큰 자동 갱신 체계 구축
|
||||||
5. **토큰 수명 관리**: OAuth 토큰은 자동 갱신 메커니즘 필수
|
|
||||||
|
|
||||||
## 참고 문서
|
## 참고 문서
|
||||||
- rb10508_micro 메모리 구조: `/home/admin/ivada_project/rb10508_micro/app/core/memory/storage.py`
|
- rb10508_micro 메모리 구조: `/home/admin/ivada_project/rb10508_micro/app/core/memory/storage.py`
|
||||||
@ -95,15 +95,18 @@ model: Optional[Literal[..., "gemini-2.5-flash-lite"]] = None
|
|||||||
**심각도: HIGH**
|
**심각도: HIGH**
|
||||||
|
|
||||||
rb8001이 모든 사용자 대화를 하나의 ChromaDB 컬렉션에 저장:
|
rb8001이 모든 사용자 대화를 하나의 ChromaDB 컬렉션에 저장:
|
||||||
- 컬렉션명: `robeing_rb8001_memories` (고정)
|
- 컬렉션명: `robeing_rb8001_memories` (모든 Slack 사용자 공유)
|
||||||
- 사용자 간 대화 내용 섞일 위험
|
- metadata의 user_id(Slack ID)로만 구분
|
||||||
- 개인정보 노출 가능성
|
- 필터링 실패 시 타 사용자 대화 노출 위험
|
||||||
|
|
||||||
|
**올바른 구조 (rb10508):**
|
||||||
|
- 컬렉션명: `rb10508_test_{slack_id}_episodic`
|
||||||
|
- 사용자별 완전 격리
|
||||||
|
|
||||||
**해결 방안:**
|
**해결 방안:**
|
||||||
1. 임시: 검색 시 user_id 필터링 강화
|
- rb8001의 MemoryManager를 rb10508 방식으로 수정 필요
|
||||||
2. 근본: 사용자별 컬렉션 분리 (rb10508 방식 적용)
|
|
||||||
|
|
||||||
**관련 문서:** `/DOCS/troubleshooting/250827_claude_chromadb_user_isolation.md`
|
**관련 문서:** `/DOCS/troubleshooting/250827_51124_critical_issues.md`
|
||||||
|
|
||||||
### 3.2 보안 공격 차단 업데이트 ✅
|
### 3.2 보안 공격 차단 업데이트 ✅
|
||||||
- 10개 IP 차단 (3차에 걸쳐 추가)
|
- 10개 IP 차단 (3차에 걸쳐 추가)
|
||||||
@ -167,7 +170,7 @@ rb8001이 모든 사용자 대화를 하나의 ChromaDB 컬렉션에 저장:
|
|||||||
## 7. 참고 문서
|
## 7. 참고 문서
|
||||||
|
|
||||||
- [Frontend-Backend 불일치 분석](./250827_frontend_backend_user_preferences_mismatch.md)
|
- [Frontend-Backend 불일치 분석](./250827_frontend_backend_user_preferences_mismatch.md)
|
||||||
- [ChromaDB 격리 문제](./250827_claude_chromadb_user_isolation.md)
|
- [51124 서버 핵심 이슈 (ChromaDB/토큰)](./250827_51124_critical_issues.md)
|
||||||
- [ID 체계 표준화](./250826_slack_id_column_standardization.md)
|
- [ID 체계 표준화](./250826_slack_id_column_standardization.md)
|
||||||
- [보안 공격 차단](./250826_security_attack_detection.md)
|
- [보안 공격 차단](./250826_security_attack_detection.md)
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user