전체 가이드
중간 심각도오류 처리 및 복원력

프로덕션의 상세한 오류 페이지와 스택 트레이스

처리되지 않은 예외나 존재하지 않는 라우트에 대한 탐색으로 프로덕션에서 프레임워크의 디버그 오류 화면이 표시되면, 파일 경로, 줄 번호, 라이브러리 버전, 때로는 환경 변수까지 서버의 지도를 공격자에게 넘겨주게 됩니다. 해결책은 사용자에게는 일반적인 오류 응답을 반환하고, 전체 세부 정보는 팀이 관리하는 서버 측 서비스에만 기록하는 것입니다.

무엇인가요

모든 웹 프레임워크에는 기본 디버그 오류 화면이 있습니다. Django의 노란색 예외 페이지, Laravel의 Ignition 화면, Next.js의 개발용 오버레이, Express의 기본 예외 덤프 등입니다. 개발 중에는 매우 유용하지만 프로덕션 빌드에서는 의도적으로 비활성화됩니다. 위험한 것은 디버그 모드를 끄지 않아 활성 상태로 남은 프레임워크 오류 페이지나, 원시 예외 객체를 응답 본문에 그대로 반환하는 사용자 정의 오류 핸들러입니다.

AppSafe는 사이트에 존재하지 않아야 할 경로를 요청하여 상세한 오류를 탐지합니다. 응답 본문이 프레임워크 오류 페이지에 흔한 패턴(Python 트레이스백, Node.js 예외 덤프, .NET 예외 세부 정보, Rails.root 경로 등)과 일치하면 '오류 처리 및 복원력' 카테고리에서 중간 심각도로 보고합니다.

왜 중요한가요

스택 트레이스는 언어와 프레임워크 버전, 앱의 내부 디렉터리 구조, 실패한 정확한 파일과 줄, 그곳에 이르는 호출 체인을 드러냅니다. CVE 데이터베이스와 결합하면 이 정보는 발견부터 표적 익스플로잇까지의 시간을 단축합니다. 특정 프레임워크나 라이브러리 버전의 알려진 취약점이라면 더욱 그렇습니다.

디버그 페이지에는 요청 데이터, 일부 환경 변수, SQL 조각이 렌더링되어 포함될 수도 있어, 브라우저에 절대 도달해서는 안 되는 사용자 입력이나 서버 내부 값이 의도치 않게 유출될 수 있습니다.

고치는 방법

원시 예외를 클라이언트에 반환하지 않기

Next.js API 라우트와 Route Handler에서는 예외를 명시적으로 잡아 전체 오류는 서버 측에 기록하고, 호출자에게는 일반적인 상태를 반환하세요.

// app/api/example/route.ts
export async function GET() {
  try {
    // ... handler logic ...
  } catch (err) {
    console.error(err); // logs stack trace to your server/monitoring only
    return new Response("Internal Server Error", { status: 500 });
  }
}
사용자 정의 오류 페이지 설정하기

Next.js는 프로덕션에서 처리되지 않은 오류에 대해 pages/500.tsx(App Router에서는 app/error.tsx)를 렌더링합니다. 기술적 세부 정보 없이 친절한 메시지를 넣고, Sentry 같은 오류 모니터링 서비스를 연결해 실제 예외를 수집하세요.

프록시 계층에서 가로채기

앱 계층을 빠져나온 오류에 대해서는 nginx가 모든 5xx 응답을 브라우저에 도달하기 전에 정적 페이지로 대체할 수 있습니다.

error_page 500 502 503 504 /50x.html;
location = /50x.html {
  root /usr/share/nginx/html;
  internal;
}

자주 묻는 질문

Next.js는 프로덕션 빌드에서 스택 트레이스를 표시하나요?

개발용 오버레이는 프로덕션에서 이미 표시되지 않습니다. 실제 위험은 예외를 잡아서 응답에 그대로 직렬화하는 사용자 정의 Route Handler나 API 라우트입니다. 이는 프레임워크가 스스로 막아 주지 않습니다.

AppSafe는 상세한 오류를 어떻게 탐색하나요?

사이트에 존재하지 않는 URL을 요청하고, 응답 본문에서 'Traceback (most recent call last)', 'Stack trace:', 'Unhandled Runtime Error', 'Exception Details:' 등 Python, Node.js, PHP, Java, Ruby, .NET 프레임워크 특유의 표식이 되는 문구를 찾습니다.

404 페이지에 스택 트레이스가 표시되지 않는데 AppSafe가 보고했습니다. 왜 그런가요?

스캐너는 폭넓은 패턴을 대조하며, 그중 일부는 부분적이거나 가려진 오류 응답에도 나타납니다. 404 또는 500 응답 본문 어딘가에 예외 클래스 이름, 내부 파일 경로, 프레임워크 식별자가 포함되어 있는지 확인하세요. 주석이나 숨겨진 요소 안도 포함됩니다.

내 앱도 영향을 받나요?

AppSafe는 이 문제와 수십 가지 다른 문제를 한 번의 무료 스캔으로 점검합니다.

내 앱 무료 스캔