TPI 웹보안 점검 리포트

전체 위험도: CRITICAL (위험)
발견된 총 취약점 25건 소스코드 및 설정파일 진단
치명적 (Critical) 4건 즉시 조치 필요 (즉시 침투 가능)
높음 (High) 8건 차기 스프린트 내 수정 권장
보안 평가 점수 42 / 100 OWASP ASVS v4.0 준수율
위험도 비율 및 보안 레벨
시스템 위협 맥락 맵 (Interactive Threat Map)
주요 치명적 위험 요소 (Top Critical Findings)
SQL 인젝션을 통한 관리자 권한 탈취 및 데이터 유출 Critical
backend/src/controllers/authController.ts:42
사용자 입력값이 검증 없이 파라미터 조합 쿼리문에 직접 연동되어, 데이터베이스 전체 제어권 획득 위험이 존재합니다.
하드코딩된 JWT Secret Key 및 서명 검증 우회 Critical
config/jwt.json:5
소스코드 내 고정된 비밀키("TPI_SUPER_SECRET_KEY_12345")가 노출되어 임의의 관리자 토큰 위조가 가능합니다.
임의 파일 업로드를 통한 원격 코드 실행 (RCE) Critical
backend/src/routes/upload.ts:88
파일 확장자 및 MIME 타임 검증 미비로 인해 서버 측 실행 파일(.js, .php, .sh) 업로드가 허용됩니다.
TPI 웹 애플리케이션 아키텍처 명세

소스코드 분석 결과 본 애플리케이션은 Node.js (Express) 백엔드와 React 프론트엔드로 구성된 SPA/REST API 단일 아키텍처 구조를 취하고 있습니다. PostgreSQL 및 Redis 메모리 DB가 결합되어 있으며, Docker 컨테이너를 기반으로 배포됩니다.

프론트엔드 (Frontend)

React 18.2.0, Vite, Tailwind CSS, Axios, React Router v6. localStorage에 인증 토큰 저장 구현됨.

백엔드 (Backend)

Node.js v18 LTS, Express.js framework, Sequelize ORM (혼용된 Raw Query 구문 존재), jsonwebtoken.

인증 및 데이터베이스

JWT (JSON Web Token) 기반 stateless 인증. PostgreSQL 14, Redis Cache, Multer 파일 업로드 레포지토리.

설정 파일 및 배포 보안 분석 (Configuration & Deployment)
Dockerfile ROOT 계정 실행 설정 High
Dockerfile:18
USER 지정이 누락되어 컨테이너가 기본 root 권한으로 동작합니다. 컨테이너 탈출 공격 시 호스트 시스템 침범 위험이 높습니다.
Dockerfile비교 검토
18- CMD ["node", "dist/server.js"]
18+ USER node
19+ CMD ["node", "dist/server.js"]
CORS (Cross-Origin Resource Sharing) 와일드카드 오픈 Medium
backend/src/app.ts:24
app.use(cors({ origin: '*' })) 설정으로 모든 도메인에서의 인증 요청 접근을 허용하고 있습니다.
인증 및 세션 관리 점검 (Authentication & Session)
취약한 비밀번호 해싱 알고리즘 사용 (MD5 사용) High
backend/src/utils/crypto.ts:12
비밀번호 저장 시 솔트(Salt) 없이 단방향 MD5 알고리즘을 사용 중입니다. 레인보우 테이블 공격에 매우 취약합니다.
backend/src/utils/crypto.ts취약점 취득 코드
12- return crypto.createHash('md5').update(password).digest('hex');
12+ return await bcrypt.hash(password, 12);
권한 부여 및 인가 취약점 (Authorization & IDOR)
사용자 프로필 조회 시 객체 수준 참조 (IDOR) 취약점 High
backend/src/controllers/userController.ts:65
요청 URL의 userId 파라미터를 요청한 세션 소유자와 검증하지 않고 타인의 개인정보를 그대로 반환합니다.
입력 검증 및 인젝션 취약점 (Injection Vectors)
로그인 API의 SQL Injection (인증 우회) Critical
backend/src/controllers/authController.ts:42
Raw Query 조합 방식 사용: `SELECT * FROM users WHERE email = '${req.body.email}'`
저장형 크로스 사이트 스크립팅 (Stored XSS) High
frontend/src/pages/BoardDetail.jsx:104
게시판 내용 출력 시 dangerouslySetInnerHTML을 사용하여 악성 스크립트 실행이 가능합니다.
REST API 보안 점검 (API Security)
API 속도 제한(Rate Limiting) 미적용 Medium
backend/src/routes/api.ts:10
무제한 API 호출이 허용되어 무차별 대입 공격 및 서비스 거부(DoS)에 노출되어 있습니다.
비즈니스 로직 및 클라이언트 측 보안
결제 금액 클라이언트 위변조 가능성 High
frontend/src/components/Checkout.jsx:45
서버측 검증 없이 클라이언트가 전달한 `amount` 값을 그대로 결제 모듈로 전달하는 로직 오류가 존재합니다.
암호화 및 민감정보 노출 진단
Git 저장소 내 AWS API Key 및 DB 암호 하드코딩 Critical
config/database.js:14
비밀키 및 데이터베이스 접속 비밀번호가 평문으로 포함되어 버전 관리 시스템에 누출되었습니다.
외부 라이브러리 및 공급망 취약점 (Supply Chain)
구버전 Node 모듈 취약점 (CVE-2023-26136) High
package.json:34 (async 모듈 v2.6.3 사용 중)
프로토타입 오염(Prototype Pollution) 취약점이 알려진 구버전 패키지가 포함되어 있습니다.
취약점 종합 요약 매트릭스
취약점 명칭 위험도 위치 (File & Line) 설명 권장 조치사항
단계별 보안 패치 및 조치 로드맵
Phase 1: 즉시 조치 (1~3일 이내)

치명적 취약점 패치 및 자격증명 교체

1. SQL 인젝션 구문을 Sequelize Prepared Statement로 전체 교체.
2. 하드코딩된 JWT Secret Key 및 AWS API 키 즉시 재발급 후 환경변수(.env) 이관.
3. 파일 업로드 확장자 화이트리스트 검증 및 저장 경로 실행 권한 제거.

Phase 2: 단기 개선 (다음 스프린트)

인증 구조 강화 및 IDOR 조치

1. 비밀번호 저장 알고리즘 MD5 → bcrypt (Cost Factor 12) 변경 및 재설정 유도.
2. IDOR 방지를 위한 사용자 객체 소유권 미들웨어 검증 적용.
3. XSS 방지를 위한 innerHTML 제거 및 DOMPurify 도입.

Phase 3: 지속적 보안 체계 구축

컨테이너 보안 및 CI/CD SAST 도입

1. Dockerfile 비권한 사용자(non-root) 실행 설정 및 보안 헤더(Helmet) 일괄 적용.
2. GitHub Actions CI 파이프라인 내 SonarQube / Trivy 정적 분석 도구 자동화.

보안 진단 결론 및 종합 제언

본 TPI 웹 애플리케이션 보안 진단 결과, 소스코드 및 설정 관리 측면에서 Critical 등급 4건을 포함한 다수의 심각한 취약점이 발견되었습니다. 특히 소스코드 내부 비밀키 유출, 인증 없는 RAW SQL 쿼리 처리, 검증 없는 파일 업로드는 시스템 전체의 권한 탈취로 이어질 수 있는 심각한 상태입니다.

제공해 드린 우선순위 조치 로드맵에 따라 Phase 1의 치명적 항목을 즉시 조치할 것을 강력히 권고하며, 향후 개발 주기(SDLC) 내에 보안 코드 리뷰 및 정적 코드 분석 도구(SAST)를 연동하여 지속적인 보안성을 확보하시기 바랍니다.

안내: 본 보고서는 교육 및 보안 개선 목적으로 제공되었으며, 수록된 코드 조치 가이드를 통해 애플리케이션의 보안성을 신속히 강화할 수 있습니다.
자동 가이드 투어 실행 중 (클릭 시 수동 조작으로 전환)