IDOR 취약점 5건 전수 수정

발견

API 엔드포인트 전수 조사에서 user_id를 경로·바디 파라미터로 받아 다른 사용자의 리소스에 접근할 수 있는 IDOR(Insecure Direct Object Reference) 취약점 5건을 발견했다.

취약점 목록

# 엔드포인트 취약 유형
1 mypage 경로에 user_id 직접 노출
2 profile 바디 파라미터로 user_id 수신
3 watchlist 다른 사용자의 찜 목록 접근 가능
4 picks 추천 이력 타인 열람 가능
5 chat 채팅 기록 타인 접근 가능

수정 방법

모든 엔드포인트에서 user_id를 클라이언트 입력 대신 JWT 토큰에서 추출하도록 전환했다.

# Before (취약)
@router.get("/mypage/{user_id}")
async def get_mypage(user_id: int):
    ...

# After (수정)
@router.get("/mypage")
async def get_mypage(user=Depends(require_user)):
    user_id = user.user_id  # JWT 토큰에서 추출
    ...

3계층 토큰 전달

프론트엔드 → API 프록시 → 백엔드 전 구간에서 JWT 토큰이 전달되도록 보장했다.

클라이언트 (Bearer Token)
    │
    ▼
route.ts 프록시 (Authorization 헤더 전달)
    │
    ▼
백엔드 (require_user / require_admin 가드)
    │
    └→ JWT 디코딩 → user_id 추출 → 소유권 검증

결과

  • IDOR 취약점 0건 (전수 조사 완료)
  • 모든 리소스 접근에 토큰 기반 소유권 검증 적용