docs: Slack 권한 아이템화 방안으로 문서 업데이트

- Slack을 Gmail과 같은 권한 아이템으로 관리
- 웹에서 Slack OAuth 연결 시작
- slack_tokens 테이블로 매핑 관리
- 모든 채널 UUID로 통합하여 기억 일원화
This commit is contained in:
happybell80 2025-08-27 19:31:25 +09:00
parent e851a072d7
commit 5c888055e8
2 changed files with 70 additions and 67 deletions

View File

@ -1,10 +1,7 @@
# JWT 인증 체계 보안 취약점 - CRITICAL # JWT 인증 체계 개선 - Slack 아이템화
## 작성일: 2025-08-27 ## 상태: 해결 방안 제시 (2025-08-27)
## 작성자: 51123 서버 관리자 ## 해결: Slack 권한 아이템 방식
## 상태: 🔴 CRITICAL - 인증 우회 가능한 보안 취약점 발견
## 영향 범위: 51124 전체 서비스 (rb10508_micro, skill-email, skill-news)
## 위험 수준: 매우 높음
--- ---
@ -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 요구 #### 1. slack_tokens 테이블 생성
@app.post("/api/slack/events") ```sql
async def slack_events( CREATE TABLE slack_tokens (
request: Request, user_id UUID NOT NULL,
auth: Optional[str] = Depends(verify_jwt_optional) slack_user_id VARCHAR(100),
): slack_team_id VARCHAR(100),
if not auth: access_token TEXT,
# Slack 서명 검증로 대체 is_equipped BOOLEAN DEFAULT false,
verify_slack_signature(request) equipped_to VARCHAR(50)
);
# 옵션 2: Slack과 웹을 완전 분리
# Slack 전용 서비스로 분리 고려
``` ```
#### 2. Gateway /api/stats JWT 검증 추가 #### 2. Slack OAuth 플로우
```python - 웹 로그인 → Slack 연결 버튼
# Gateway main.py Line 283 수정 - Slack OAuth → 토큰 저장
@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)로 취약
```
### 5.2 중기 개선 (Phase 2) #### 3. Slack 이벤트 처리
- slack_user_id로 slack_tokens 조회
- user_id(UUID) 획듍
- 모든 처리 UUID로 통일
1. **인증 체계 통합** #### 4. 기존 개선사항
- Slack과 웹 경로 통합 또는 명확한 분리 - Gateway /api/stats JWT 검증 추가
- 모든 서비스에 일관된 인증 정책 - X-User-Id 직접 신뢰 제거
- X-User-Id 헤더 직접 신뢰 제거
2. **서비스 간 통신 보안**
- 내부 API 키 또는 mTLS 적용
- 서비스 메시 아키텍처 검토
3. **감사 로깅**
- 모든 인증 시도 기록
- 실패한 접근 모니터링
--- ---
@ -213,15 +199,13 @@ curl -X GET http://gateway:8100/api/stats/rb8001 \
## 10. 결론 ## 10. 결론
**🔴 이중 인증 체계 문제 - 통합 필요** **Slack 권한 아이템화로 통합 인증 체계 구축**
확인된 주요 문제: 해결 방안:
1. **웹 vs Slack**: JWT/UUID vs Slack ID 이중 체계 1. **Slack을 아이템으로**: Gmail과 동일한 UX
2. **Gateway**: /api/stats 엔드포인트 JWT 검증 누락 2. **웹 UUID 중심**: 모든 채널 UUID로 통합
3. **서비스 간 통신**: 통일된 인증 없이 파라미터 신뢰 3. **매핑 테이블**: slack_tokens로 관리
4. **rb10508_micro**: X-User-Id 헤더만 신뢰 4. **기억 통합**: 모든 대화 하나의 사용자로 관리
모든 경로에 일관된 인증 체계를 구축하거나, Slack과 웹을 명확히 분리해야 합니다.
모든 서비스에 JWT 인증을 구현하고, Gateway에서 일관된 검증을 수행해야 합니다. 모든 서비스에 JWT 인증을 구현하고, Gateway에서 일관된 검증을 수행해야 합니다.

View File

@ -20,26 +20,45 @@
- 채널 간 대화 기록 단절 - 채널 간 대화 기록 단절
- 개인화 컨텍스트 손실 - 개인화 컨텍스트 손실
## 해결 방안: 분리 운영 ## 해결 방안: Slack 권한 아이템화
### 선택한 방안 ### 새로운 방안
- **Slack과 웹을 별도 체계로 운영** - **Slack을 아이템으로 관리**
- Slack: Slack ID + Slack 서명 검증 - 웹에서 Slack OAuth 인증 → slack_tokens 테이블 저장
- 웹: UUID + JWT 검증 - Gmail 아이템과 동일한 방식으로 장착/해제
### 구현 ### 구현
1. conversation_logs 테이블 현 구조 유지 1. **slack_tokens 테이블 생성**
- slack_user_id: Slack 사용자만 ```sql
- user_id: 웹 사용자만 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 2. **인증 플로우**
- slack_user_mapping 테이블 활용 - 웹 로그인 (JWT) → Slack 연결 버튼
- WHERE user_id = ? OR slack_user_id IN (SELECT...) - 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을 아이템으로 관리하면 분리 운영 문제 완전 해결. 웹에서 시작하여 Slack을 연결하는 방식으로 통합 인증 체계 구축.
- 각 채널 특성에 맞는 인증 체계 유지
- 필요 시 slack_user_mapping 테이블로 통합 조회
--- ---
*작성: Claude* *작성: Claude*