diff --git a/plans/000000_unresolved_items_matrix.md b/plans/000000_unresolved_items_matrix.md index f028f28..a75377d 100644 --- a/plans/000000_unresolved_items_matrix.md +++ b/plans/000000_unresolved_items_matrix.md @@ -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) diff --git a/troubleshooting/250827_frontend_backend_preferences_API_연동_완료.md b/troubleshooting/250827_frontend_backend_preferences_API_연동_완료.md index 737d5c3..b3de568 100644 --- a/troubleshooting/250827_frontend_backend_preferences_API_연동_완료.md +++ b/troubleshooting/250827_frontend_backend_preferences_API_연동_완료.md @@ -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" ```