fix: 본인 확인 검증 문제 해결 완료

- JWT.sub 매칭 구현 및 테스트 완료 (403 Forbidden 정상 작동)
- Gateway commit 8ca5c6b, robeing-monitor commit f3b0235
- Critical 항목에서 제거 (3개→2개)
- 테스트 결과 문서화

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
happybell80 2025-09-15 13:46:55 +09:00
parent a8f3af04fb
commit d2179739f6
2 changed files with 16 additions and 15 deletions

View File

@ -1,9 +1,8 @@
# 미해결 항목 매트릭스
## 🔴 Critical (중요+긴급)
1. **본인 확인 검증** - JWT.sub 매칭 미구현 [→250827](../troubleshooting/250827_frontend_backend_preferences_API_연동_완료.md)
2. **Rate Limiting** - API 무제한 호출 가능 [→380](../300_architecture/380_authentication_system.md)
3. **Preferences DB 정합** - slack_user_id 컬럼 누락 [→250827](../troubleshooting/250827_frontend_backend_preferences_API_연동_완료.md)
1. **Rate Limiting** - API 무제한 호출 가능 [→380](../300_architecture/380_authentication_system.md)
2. **Preferences DB 정합** - slack_user_id 컬럼 누락 [→250827](../troubleshooting/250827_frontend_backend_preferences_API_연동_완료.md)
## 🔵 Strategic (중요+비긴급)
1. **사용자 식별 통합** - UserIdentityService 설계 [→250831](250831_todo_and_tech_debt.md)

View File

@ -105,7 +105,7 @@ const scheduledTasks: ScheduledTask[] = [...]; // 하드코딩
- localStorage 기반으로 다른 디바이스와 동기화 안됨
- WebSocket이나 polling 구현 없음
### 3.7 🔴 권한 검증 누락 (본인 확인 미구현)
### 3.7 ✅ 권한 검증 구현 완료 (2025-09-15 해결)
#### 확인된 사실 (2025-09-15)
@ -131,21 +131,23 @@ const scheduledTasks: ScheduledTask[] = [...]; // 하드코딩
- 파라미터: URL의 {user_id}만 사용, Request 객체 없음
- **문제점**: JWT/헤더 검증 불가능
#### 취약점 핵심: JWT.sub ≠ URL.user_id 검증 없음
#### ✅ 해결 완료: JWT.sub = URL.user_id 검증 구현
**문제**: URL의 user_id를 아무나 바꿔서 타인 데이터를 조회/수정 가능
- JWT의 sub(본인 UUID)과 URL의 user_id(대상 UUID)가 같은지 확인 안 함
**해결된 문제**: 타인 데이터 접근 차단
- Gateway: Line 372-374에 `if path != user_uuid: raise 403` 추가
- robeing-monitor: commit f3b0235로 헤더 검증 추가
**테스트 결과 (2025-09-15):**
```bash
# 정상 요청 (자기 데이터)
PUT /api/preferences/1e16e9d5-59f3-54da-a661-8abeabff4230
Authorization: Bearer [JWT with sub=1e16e9d5-59f3-54da-a661-8abeabff4230]
# TEST 1: 본인 데이터 접근 → 성공
GET /api/preferences/53529291-5050-4daa-89fb-008b546feb63
Authorization: Bearer [JWT with sub=53529291... (happybell80)]
Response: 200 OK (또는 500 서비스 문제)
# 취약 요청 (타인 데이터 수정 가능)
PUT /api/preferences/b6ea2ee0-a15a-5cf4-93a9-a9ca20d4c4a0
Authorization: Bearer [JWT with sub=1e16e9d5-59f3-54da-a661-8abeabff4230]
# Gateway는 X-User-Id: 1e16e9d5를 전달하지만
# robeing-monitor는 URL의 b6ea2ee0를 사용
# TEST 2: 타인 데이터 접근 시도 → 차단 ✅
GET /api/preferences/b6ea2ee0-a15a-5cf4-93a9-a9ca20d4c4a0
Authorization: Bearer [JWT with sub=53529291... (happybell80)]
Response: 403 Forbidden - "Can only access your own preferences"
```