docs: JWT 인증 보안 취약점 CRITICAL 문서 작성
- 51124 서버 대부분 서비스 JWT 미구현 - X-User-Id 헤더 검증 없이 신뢰 - 인증 우회 및 타인 데이터 접근 가능 - 즉시 조치 필요한 보안 취약점
This commit is contained in:
parent
ce07864236
commit
2ece715b1f
202
troubleshooting/250827_JWT_인증_보안_취약점_CRITICAL.md
Normal file
202
troubleshooting/250827_JWT_인증_보안_취약점_CRITICAL.md
Normal file
@ -0,0 +1,202 @@
|
||||
# JWT 인증 체계 보안 취약점 - CRITICAL
|
||||
|
||||
## 작성일: 2025-08-27
|
||||
## 작성자: 51123 서버 관리자
|
||||
## 상태: 🔴 CRITICAL - 인증 우회 가능한 보안 취약점 발견
|
||||
## 영향 범위: 51124 전체 서비스 (rb10508_micro, skill-email, skill-news)
|
||||
## 위험 수준: 매우 높음
|
||||
|
||||
---
|
||||
|
||||
## 1. 문제 요약
|
||||
|
||||
### 🚨 핵심 문제
|
||||
**51124 서버의 대부분 서비스가 JWT 인증 없이 작동**
|
||||
- X-User-Id 헤더만 신뢰하는 서비스 존재
|
||||
- 파라미터로 받은 user_id를 검증 없이 사용
|
||||
- Gateway의 일부 엔드포인트가 JWT 검증 누락
|
||||
|
||||
### 보안 영향
|
||||
- **인증 우회**: 헤더 조작으로 다른 사용자 행세 가능
|
||||
- **데이터 접근**: 타인의 이메일, 통계 등 민감 정보 접근 가능
|
||||
- **무결성 파괴**: 사용자 식별 체계 불일치로 데이터 오염
|
||||
|
||||
---
|
||||
|
||||
## 2. 서비스별 현황 분석
|
||||
|
||||
### 2.1 JWT 인증 구현 상태
|
||||
|
||||
| 서비스 | JWT 인증 | user_id 처리 | Authorization 헤더 | 위험도 |
|
||||
|--------|---------|--------------|-------------------|--------|
|
||||
| **rb8001** | ✅ 구현 | UUID (JWT sub) + username | ✅ Bearer 토큰 | 안전 |
|
||||
| **rb10508_micro** | ❌ 없음 | X-User-Id 헤더만 | ❌ 없음 | 🔴 위험 |
|
||||
| **skill-email** | ❌ 없음 | 파라미터 "test" | ❌ 없음 | 🔴 위험 |
|
||||
| **skill-news** | ❌ 없음 | 미구현 | ❌ 없음 | 🟡 중간 |
|
||||
| **robeing-monitor** | ❌ 없음 | 미구현 | ❌ 없음 | 🟡 중간 |
|
||||
|
||||
### 2.2 Gateway 라우팅 현황
|
||||
|
||||
| 엔드포인트 | JWT 검증 | Authorization 전달 | 문제점 |
|
||||
|-----------|---------|-------------------|--------|
|
||||
| `/api/chat/*` | ✅ 검증 | ✅ 전달 | 정상 |
|
||||
| `/api/stats/*` | ❌ 없음 | ❌ 없음 | X-User-Id만 신뢰 |
|
||||
| `/api/items/*` | ✅ 검증 | ❌ 없음 | 헤더 전달 누락 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 취약점 상세
|
||||
|
||||
### 3.1 rb10508_micro - 인증 우회 가능
|
||||
```python
|
||||
# 현재 상태 - 위험
|
||||
user_id = request.headers.get("X-User-Id") # 검증 없이 신뢰
|
||||
# 공격자가 X-User-Id: "다른사용자UUID" 설정 가능
|
||||
```
|
||||
|
||||
### 3.2 skill-email - 하드코딩된 기본값
|
||||
```python
|
||||
# main.py Line 73
|
||||
user_id: str = "test" # 하드코딩
|
||||
# JWT 검증 전혀 없음
|
||||
# 파라미터로 받은 user_id 그대로 사용
|
||||
```
|
||||
|
||||
### 3.3 Gateway - 일관성 없는 검증
|
||||
```python
|
||||
# /api/stats 엔드포인트
|
||||
x_user_id: Optional[str] = Header(None) # JWT 검증 없음
|
||||
# 누구나 접근 가능
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 공격 시나리오
|
||||
|
||||
### 시나리오 1: 타인 이메일 접근
|
||||
```bash
|
||||
# 공격자가 skill-email 직접 호출
|
||||
curl -X POST http://192.168.219.52:8501/api/email \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"user_id": "타겟사용자UUID"}'
|
||||
# → 타겟 사용자의 이메일 데이터 접근
|
||||
```
|
||||
|
||||
### 시나리오 2: 통계 조작
|
||||
```bash
|
||||
# 인증 없이 stats 접근
|
||||
curl http://gateway:8100/api/stats/rb8001 \
|
||||
-H "X-User-Id: 임의UUID"
|
||||
# → 다른 사용자의 통계 조회/조작
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. 해결 방안
|
||||
|
||||
### 5.1 즉시 조치 (Phase 1)
|
||||
|
||||
#### 모든 서비스 JWT 인증 추가
|
||||
```python
|
||||
# rb10508_micro, skill-email에 추가 필요
|
||||
from app.auth import verify_jwt_token
|
||||
|
||||
async def get_current_user(authorization: str = Header(...)):
|
||||
if not authorization.startswith("Bearer "):
|
||||
raise HTTPException(401, "Invalid authorization")
|
||||
token = authorization.replace("Bearer ", "")
|
||||
user_uuid, username = verify_jwt_token(token)
|
||||
return user_uuid
|
||||
```
|
||||
|
||||
#### Gateway 모든 엔드포인트 JWT 검증
|
||||
```python
|
||||
# main.py 수정
|
||||
@app.get("/api/stats/{robeing_id}")
|
||||
async def get_stats(
|
||||
robeing_id: str,
|
||||
x_user_id: str = Depends(get_verified_user) # JWT 검증 추가
|
||||
):
|
||||
```
|
||||
|
||||
### 5.2 중기 개선 (Phase 2)
|
||||
|
||||
1. **통합 인증 미들웨어**
|
||||
- 모든 서비스에 공통 JWT 검증 미들웨어
|
||||
- X-User-Id 헤더 완전 제거
|
||||
|
||||
2. **서비스 간 통신 보안**
|
||||
- 내부 API 키 또는 mTLS 적용
|
||||
- 서비스 메시 아키텍처 검토
|
||||
|
||||
3. **감사 로깅**
|
||||
- 모든 인증 시도 기록
|
||||
- 실패한 접근 모니터링
|
||||
|
||||
---
|
||||
|
||||
## 6. 영향도 평가
|
||||
|
||||
| 영역 | 영향도 | 설명 |
|
||||
|-----|-------|------|
|
||||
| **보안** | 🔴 극심 | 인증 우회로 전체 시스템 침해 가능 |
|
||||
| **데이터** | 🔴 극심 | 타인 데이터 접근 및 조작 가능 |
|
||||
| **서비스** | 🟡 중간 | 일부 서비스만 영향 |
|
||||
| **사용자** | 🔴 높음 | 개인정보 유출 위험 |
|
||||
|
||||
---
|
||||
|
||||
## 7. 구현 우선순위
|
||||
|
||||
| 우선순위 | 작업 | 담당 | 예상 시간 |
|
||||
|---------|-----|------|----------|
|
||||
| 1 | skill-email JWT 인증 구현 | 로컬 개발자 | 2시간 |
|
||||
| 2 | rb10508_micro JWT 인증 구현 | 로컬 개발자 | 2시간 |
|
||||
| 3 | Gateway /api/stats JWT 검증 추가 | 로컬 개발자 | 1시간 |
|
||||
| 4 | X-User-Id 헤더 의존성 제거 | 로컬 개발자 | 3시간 |
|
||||
| 5 | 통합 테스트 및 검증 | 51123 관리자 | 2시간 |
|
||||
|
||||
---
|
||||
|
||||
## 8. 검증 방법
|
||||
|
||||
### 8.1 보안 테스트
|
||||
```bash
|
||||
# JWT 없이 접근 시도 - 실패해야 함
|
||||
curl -X GET http://gateway:8100/api/stats/rb8001 \
|
||||
-H "X-User-Id: fake-uuid"
|
||||
# Expected: 401 Unauthorized
|
||||
|
||||
# 유효한 JWT로 접근 - 성공해야 함
|
||||
curl -X GET http://gateway:8100/api/stats/rb8001 \
|
||||
-H "Authorization: Bearer $JWT_TOKEN"
|
||||
# Expected: 200 OK
|
||||
```
|
||||
|
||||
### 8.2 서비스별 검증
|
||||
- rb10508_micro: JWT 없이 접근 → 401
|
||||
- skill-email: JWT 없이 접근 → 401
|
||||
- Gateway 모든 엔드포인트: JWT 검증 확인
|
||||
|
||||
---
|
||||
|
||||
## 9. 관련 문서
|
||||
|
||||
- [UUID vs username 혼용 문제](./250827_UUID_username_혼용_CRITICAL.md)
|
||||
- [JWT 인증 구현](./250827_JWT_인증_구현_COMPLETED.md)
|
||||
- [시스템 아키텍처](../300_architecture/310_전체_시스템_구조_컨테이너와_마이크로서비스.md)
|
||||
|
||||
---
|
||||
|
||||
## 10. 결론
|
||||
|
||||
**🔴 즉시 조치 필요 - 심각한 보안 취약점**
|
||||
|
||||
현재 51124 서버의 대부분 서비스가 JWT 인증 없이 작동하여 인증 우회가 가능한 상태입니다.
|
||||
특히 skill-email과 rb10508_micro는 헤더 조작만으로 타인 데이터에 접근할 수 있어 즉시 수정이 필요합니다.
|
||||
|
||||
모든 서비스에 JWT 인증을 구현하고, Gateway에서 일관된 검증을 수행해야 합니다.
|
||||
|
||||
---
|
||||
|
||||
*작성 완료: 2025-08-27 18:30*
|
||||
Loading…
x
Reference in New Issue
Block a user