설명
err.message나 err.toString() 같은 예외 상세 문자열을 HTTP 응답 본문이나 헤더에 그대로 포함하면 내부 파일 경로, SQL 오류, 설정 값, 라이브러리 동작 단서가 외부로 노출될 수 있습니다. 이런 정보는 공격자의 정찰 단계를 돕고 후속 인젝션이나 환경 우회 공격을 더 정교하게 만듭니다.
잠재적 영향
- 내부 경로, 쿼리 구조, 라이브러리 버전, 설정 값이 외부 사용자에게 노출될 수 있습니다.
- 공격자가 오류 메시지를 이용해 후속 공격 페이로드를 조정할 수 있습니다.
- 운영 환경의 예외 처리 방식이 드러나 서비스 구조 파악이 쉬워질 수 있습니다.
해결 방법
- 클라이언트에는 일반화된 오류 메시지만 반환하고 예외 상세 내용은 서버 로그에만 남기세요.
- Express 또는 Node 중앙 오류 핸들러를 사용해 응답 포맷을 일원화하고
err.message를 직접 노출하지 마세요. - 본문, JSON, 헤더 어디에도 예외 상세 문자열을 넣지 마세요.
- 운영 환경에서는 개발용 디버그 오류 응답을 비활성화하세요.
예시
변경 전
javascript
app.get("/profile", async (req, res) => {
try {
const profile = await loadProfile(req.user.id);
res.json(profile);
} catch (err) {
res.status(500).send(err.message);
}
});
변경 후
javascript
app.get("/profile", async (req, res) => {
try {
const profile = await loadProfile(req.user.id);
res.json(profile);
} catch (err) {
logger.error({ err }, "profile load failed");
res.status(500).json({ error: "Internal server error" });
}
});
설명:
- 변경 전: 예외 메시지를 응답에 직접 포함해 내부 오류 상세가 외부로 노출됩니다.
- 변경 후: 상세 예외는 서버 로그에만 남기고 클라이언트에는 일반화된 메시지를 반환합니다.