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:
parent
a8f3af04fb
commit
d2179739f6
@ -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)
|
||||
|
||||
@ -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"
|
||||
```
|
||||
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user