NodeJS Fundamentals: __proto__
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
JavaScript/Node.js 개발자, React/Vue 프론트엔드 개발자, 기존 코드베이스 유지보수자
난이도: 중간 (ES6 이상 기초 지식 필요)
핵심 요약
__proto__
는 비표준이며, 보안 취약점과 성능 저하를 유발할 수 있음Object.setPrototypeOf()
와Object.getPrototypeOf()
를 대체하여 사용해야 함- 프로토타입 오염(Prototype Pollution)은 모든 객체에 악성 코드 삽입 가능, 절대 사용 금지
- 성능 최적화를 위해 프로토타입 수정 최소화, 직접 속성 접근이 더 효율적임
섹션별 세부 요약
1. __proto__ 개요
__proto__
는 객체의 프로토타입을 직접 참조하는 비표준 속성Object.getPrototypeOf()
/Object.setPrototypeOf()
가 표준 방법Object.create(null)
을 제외한 모든 객체는Object.prototype
을 상속
2. 런타임 행동 및 호환성
- 브라우저: 대부분 지원 (IE 오래된 버전 제외)
- Node.js: 완전 지원
- 엄격 모드:
__proto__
사용 시 오류 발생 가능 Object.setPrototypeOf()
는 ES6 도입, 더 안정적
3. 주요 사용 사례
- 동적 기능 플래그: 런타임 조건에 따라 프로토타입에 메서드 추가
- 구식 환경에서의 메서드 추가:
Array
등에 메서드 삽입 (일반적으로 비추천) - React/Vue 컴포넌트 확장: 공유 유틸리티 함수 삽입 (보일러플레이트 줄임)
- 테스트 시 의존성 모킹: 단위 테스트 중 프로토타입 임시 교체
4. 성능 분석
- 프로토타입 조회는 직접 속성 접근보다 2~3배 느림 (Benchmark 결과: 200-300ms vs 50-100ms)
- Lighthouse 점수에 부정적 영향 (성능 카테고리 감소)
5. 보안 리스크
- 프로토타입 오염:
Object.prototype
수정 시 모든 객체에 악성 코드 삽입 가능 - MITIGATION 전략:
Object.freeze()
로 중요 객체 보호- 사용자 입력 검증 (DOMPurify, zod 사용)
- 내장 프로토타입 수정 금지
6. 테스트 전략
- Jest/Vitest: 프로토타입 수정 후 정리 (test 종료 시
delete
로 메서드 제거) - Playwright/Cypress: 브라우저 환경에서 프로토타입 의존 컴포넌트 테스트
- 엣지 케이스: 동적 프로토타입 수정, 중첩 프로토타입, 속성 덮어쓰기
결론
__proto__
는 사용 시 엄격한 검증이 필요하며, Object.setPrototypeOf()를 대체해야 함- 프로토타입 수정 최소화 및 구성 중심 설계가 권장됨
- 보안 위험 방지를 위해 내장 프로토타입 수정은 절대 금지하고, 입력 검증과 객체 동결을 적용해야 함