diff --git a/troubleshooting/250827_JWT_인증_보안_취약점_CRITICAL.md b/troubleshooting/250827_JWT_인증_보안_취약점_CRITICAL.md index 87bd10d..2dacd18 100644 --- a/troubleshooting/250827_JWT_인증_보안_취약점_CRITICAL.md +++ b/troubleshooting/250827_JWT_인증_보안_취약점_CRITICAL.md @@ -1,10 +1,7 @@ -# JWT 인증 체계 보안 취약점 - CRITICAL +# JWT 인증 체계 개선 - Slack 아이템화 -## 작성일: 2025-08-27 -## 작성자: 51123 서버 관리자 -## 상태: 🔴 CRITICAL - 인증 우회 가능한 보안 취약점 발견 -## 영향 범위: 51124 전체 서비스 (rb10508_micro, skill-email, skill-news) -## 위험 수준: 매우 높음 +## 상태: 해결 방안 제시 (2025-08-27) +## 해결: Slack 권한 아이템 방식 --- @@ -109,51 +106,40 @@ curl http://gateway:8100/api/stats/rb8001 \ --- -## 5. 해결 방안 +## 5. 해결 방안: Slack 권한 아이템화 -### 5.1 즉시 조치 (Phase 1) +### 핵심 개념 +- Slack을 Gmail처럼 권한 아이템으로 관리 +- 웹에서 Slack OAuth 연결 시작 +- slack_tokens 테이블로 매핑 관리 -#### 1. Slack 경로 JWT 추가 또는 분리 -```python -# 옵션 1: Slack 이벤트에도 JWT 요구 -@app.post("/api/slack/events") -async def slack_events( - request: Request, - auth: Optional[str] = Depends(verify_jwt_optional) -): - if not auth: - # Slack 서명 검증로 대체 - verify_slack_signature(request) - -# 옵션 2: Slack과 웹을 완전 분리 -# Slack 전용 서비스로 분리 고려 +### 구현 단계 + +#### 1. slack_tokens 테이블 생성 +```sql +CREATE TABLE slack_tokens ( + user_id UUID NOT NULL, + slack_user_id VARCHAR(100), + slack_team_id VARCHAR(100), + access_token TEXT, + is_equipped BOOLEAN DEFAULT false, + equipped_to VARCHAR(50) +); ``` -#### 2. Gateway /api/stats JWT 검증 추가 -```python -# Gateway main.py Line 283 수정 -@app.get("/api/stats/{robeing_id}") -async def get_stats( - robeing_id: str, - x_user_id: str = Depends(get_verified_user) # JWT 검증 추가 -): - # 현재는 x_user_id: Optional[str] = Header(None)로 취약 -``` +#### 2. Slack OAuth 플로우 +- 웹 로그인 → Slack 연결 버튼 +- Slack OAuth → 토큰 저장 +- 아이템 획듍 → 장착 -### 5.2 중기 개선 (Phase 2) +#### 3. Slack 이벤트 처리 +- slack_user_id로 slack_tokens 조회 +- user_id(UUID) 획듍 +- 모든 처리 UUID로 통일 -1. **인증 체계 통합** - - Slack과 웹 경로 통합 또는 명확한 분리 - - 모든 서비스에 일관된 인증 정책 - - X-User-Id 헤더 직접 신뢰 제거 - -2. **서비스 간 통신 보안** - - 내부 API 키 또는 mTLS 적용 - - 서비스 메시 아키텍처 검토 - -3. **감사 로깅** - - 모든 인증 시도 기록 - - 실패한 접근 모니터링 +#### 4. 기존 개선사항 +- Gateway /api/stats JWT 검증 추가 +- X-User-Id 직접 신뢰 제거 --- @@ -213,15 +199,13 @@ curl -X GET http://gateway:8100/api/stats/rb8001 \ ## 10. 결론 -**🔴 이중 인증 체계 문제 - 통합 필요** +**Slack 권한 아이템화로 통합 인증 체계 구축** -확인된 주요 문제: -1. **웹 vs Slack**: JWT/UUID vs Slack ID 이중 체계 -2. **Gateway**: /api/stats 엔드포인트 JWT 검증 누락 -3. **서비스 간 통신**: 통일된 인증 없이 파라미터 신뢰 -4. **rb10508_micro**: X-User-Id 헤더만 신뢰 - -모든 경로에 일관된 인증 체계를 구축하거나, Slack과 웹을 명확히 분리해야 합니다. +해결 방안: +1. **Slack을 아이템으로**: Gmail과 동일한 UX +2. **웹 UUID 중심**: 모든 채널 UUID로 통합 +3. **매핑 테이블**: slack_tokens로 관리 +4. **기억 통합**: 모든 대화 하나의 사용자로 관리 모든 서비스에 JWT 인증을 구현하고, Gateway에서 일관된 검증을 수행해야 합니다. diff --git a/troubleshooting/250827_claude_conversation_log_user_mapping.md b/troubleshooting/250827_claude_conversation_log_user_mapping.md index 0b8e2e2..e97c3c6 100644 --- a/troubleshooting/250827_claude_conversation_log_user_mapping.md +++ b/troubleshooting/250827_claude_conversation_log_user_mapping.md @@ -20,26 +20,45 @@ - 채널 간 대화 기록 단절 - 개인화 컨텍스트 손실 -## 해결 방안: 분리 운영 +## 해결 방안: Slack 권한 아이템화 -### 선택한 방안 -- **Slack과 웹을 별도 체계로 운영** -- Slack: Slack ID + Slack 서명 검증 -- 웹: UUID + JWT 검증 +### 새로운 방안 +- **Slack을 아이템으로 관리** +- 웹에서 Slack OAuth 인증 → slack_tokens 테이블 저장 +- Gmail 아이템과 동일한 방식으로 장착/해제 ### 구현 -1. conversation_logs 테이블 현 구조 유지 - - slack_user_id: Slack 사용자만 - - user_id: 웹 사용자만 +1. **slack_tokens 테이블 생성** +```sql +CREATE TABLE slack_tokens ( + id SERIAL PRIMARY KEY, + user_id UUID NOT NULL, -- 웹 사용자 UUID + slack_user_id VARCHAR(100), -- Slack ID + slack_team_id VARCHAR(100), -- Workspace ID + access_token TEXT, + is_equipped BOOLEAN DEFAULT false, + equipped_to VARCHAR(50), -- 장착된 로빙 + created_at TIMESTAMP DEFAULT NOW() +); +``` -2. 통계 조회 시 JOIN - - slack_user_mapping 테이블 활용 - - WHERE user_id = ? OR slack_user_id IN (SELECT...) +2. **인증 플로우** + - 웹 로그인 (JWT) → Slack 연결 버튼 + - Slack OAuth → slack_tokens 저장 + - Slack 아이템 획득 → 장착 시 활성화 + +3. **Slack 이벤트 처리** + - slack_user_id로 slack_tokens 조회 + - user_id(UUID) 획득 → 이후 UUID로 모든 처리 + +## 장점 +- **완벽한 ID 통합**: 웹 UUID가 primary identifier +- **일관된 UX**: Gmail과 동일한 아이템 시스템 +- **권한 제어**: 장착/해제로 Slack 기능 활성화 +- **기억 통합**: 모든 채널의 대화가 하나의 UUID로 관리 ## 결론 -- 분리 운영이 가장 현실적 -- 각 채널 특성에 맞는 인증 체계 유지 -- 필요 시 slack_user_mapping 테이블로 통합 조회 +Slack을 아이템으로 관리하면 분리 운영 문제 완전 해결. 웹에서 시작하여 Slack을 연결하는 방식으로 통합 인증 체계 구축. --- *작성: Claude*