DOCS/troubleshooting/250827_JWT_인증_보안_취약점_CRITICAL.md
happybell80 2ece715b1f docs: JWT 인증 보안 취약점 CRITICAL 문서 작성
- 51124 서버 대부분 서비스 JWT 미구현
- X-User-Id 헤더 검증 없이 신뢰
- 인증 우회 및 타인 데이터 접근 가능
- 즉시 조치 필요한 보안 취약점
2025-08-27 17:18:59 +09:00

6.0 KiB

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 - 인증 우회 가능

# 현재 상태 - 위험
user_id = request.headers.get("X-User-Id")  # 검증 없이 신뢰
# 공격자가 X-User-Id: "다른사용자UUID" 설정 가능

3.2 skill-email - 하드코딩된 기본값

# main.py Line 73
user_id: str = "test"  # 하드코딩
# JWT 검증 전혀 없음
# 파라미터로 받은 user_id 그대로 사용

3.3 Gateway - 일관성 없는 검증

# /api/stats 엔드포인트
x_user_id: Optional[str] = Header(None)  # JWT 검증 없음
# 누구나 접근 가능

4. 공격 시나리오

시나리오 1: 타인 이메일 접근

# 공격자가 skill-email 직접 호출
curl -X POST http://192.168.219.52:8501/api/email \
  -H "Content-Type: application/json" \
  -d '{"user_id": "타겟사용자UUID"}'
# → 타겟 사용자의 이메일 데이터 접근

시나리오 2: 통계 조작

# 인증 없이 stats 접근
curl http://gateway:8100/api/stats/rb8001 \
  -H "X-User-Id: 임의UUID"
# → 다른 사용자의 통계 조회/조작

5. 해결 방안

5.1 즉시 조치 (Phase 1)

모든 서비스 JWT 인증 추가

# 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 검증

# 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 보안 테스트

# 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. 관련 문서


10. 결론

🔴 즉시 조치 필요 - 심각한 보안 취약점

현재 51124 서버의 대부분 서비스가 JWT 인증 없이 작동하여 인증 우회가 가능한 상태입니다. 특히 skill-email과 rb10508_micro는 헤더 조작만으로 타인 데이터에 접근할 수 있어 즉시 수정이 필요합니다.

모든 서비스에 JWT 인증을 구현하고, Gateway에서 일관된 검증을 수행해야 합니다.


작성 완료: 2025-08-27 18:30