Skip to content

잘못된 형태의 요청이 500+Slack/Sentry 알림으로 새던 문제 수정 - #254

Merged
unam98 merged 1 commit into
mainfrom
feature/misclassified-client-error-noise
Aug 24, 2026
Merged

잘못된 형태의 요청이 500+Slack/Sentry 알림으로 새던 문제 수정#254
unam98 merged 1 commit into
mainfrom
feature/misclassified-client-error-noise

Conversation

@unam98

@unam98 unam98 commented Aug 24, 2026

Copy link
Copy Markdown
Collaborator

작업 배경

  • prod Grafana 대시보드에서 최근 7일간 5xx 40건을 확인했는데, 전부 정상 매칭되는 API 경로가 아닌 곳에서 발생했다.
  • 실제 로그를 직접 조회해보니 GET /api/auth(POST만 지원), 잘못된 Content-Type의 POST /api/auth처럼 정상 앱이라면 보낼 수 없는 요청과, .env//etc/passwd/.aws/credentials 경로를 노리는 취약점 스캐너 프로빙이었다 — 실제 장애가 아니라 클라이언트(또는 봇)가 잘못 요청한 것.
  • 그런데 이런 경우까지 ControllerExceptionAdvice의 범용 @ExceptionHandler(Exception.class)가 500으로 응답하고 Slack/Sentry 알림까지 매번 보내고 있어, 진짜 장애가 아닌데 알림만 계속 쌓이는 구조였다.

변경 사항

영역 내용
ErrorStatus INVALID_HTTP_METHOD_EXCEPTION(405), UNSUPPORTED_MEDIA_TYPE_EXCEPTION(415) 추가
ControllerExceptionAdvice HttpRequestMethodNotSupportedException(405), HttpMediaTypeNotSupportedException(415), HttpMediaTypeNotAcceptableException(406) 전용 핸들러 추가 — WARN 로그만 남기고 Slack/Sentry는 호출하지 않음

406(HttpMediaTypeNotAcceptableException)은 응답 본문(JSON)을 만들려는 시도 자체가 다시 협상 실패로 이어질 수 있어(실제 prod 로그에서 Failure in @ExceptionHandler ... handleExceptionDefaultHandlerExceptionResolver로 전파되는 이중 오류를 확인) 본문 없이 상태 코드만 응답하도록 분리했다.

영향 범위

  • 클라이언트가 잘못된 HTTP 메서드/Content-Type/Accept로 요청하는 경로에만 영향. 정상 요청 경로는 무변경.
  • 런타임 영향: 이런 요청이 더 이상 500·Slack·Sentry를 유발하지 않음 — 알림 노이즈 감소.

검증 매트릭스

영향 범위 테스트 코드
POST만 지원하는 엔드포인트에 GET 요청 시 405 응답, Slack 알림 미호출 지원하지_않는_메서드
JSON을 기대하는 엔드포인트에 multipart 요청 시 415 응답, Slack 알림 미호출 지원하지_않는_컨텐츠타입

두 테스트 모두 수정 전 코드에 대해 먼저 실행해 실제로 500이 나는 것을 확인한 뒤, 수정 후 405/415로 정상화되고 Slack 알림이 호출되지 않음을 재검증했다.

Test Plan

  • 위 재현 테스트 2건 (수정 전 실패 확인 → 수정 후 통과 확인)
  • 전체 테스트 스위트 270건 통과 (회귀 없음)
  • 실제 배포 후 Grafana 5xx 카운트가 실제 장애만 반영하는지 모니터링

🤖 Generated with Claude Code

prod Grafana 로그 확인 결과 최근 7일간 5xx 40건이 전부 정상 앱 트래픽이
아니라 Postman 등으로 잘못된 메서드/형식을 직접 찌른 요청(GET /api/auth,
잘못된 Content-Type의 POST /api/auth)과 취약점 스캐너 프로빙(.env,
/etc/passwd 경로 접근 시도)이었다. 원래 405/415/406으로 응답해야 할
요청인데, ControllerExceptionAdvice의 범용 Exception 핸들러가 전부
500으로 뭉개고 Slack/Sentry 알림까지 매번 보내고 있었다 — 실제 장애가
아닌데 알림만 계속 쌓이는 구조.

HttpRequestMethodNotSupportedException(405)/HttpMediaTypeNotSupportedException
(415)/HttpMediaTypeNotAcceptableException(406) 전용 핸들러를 추가해
WARN 로그만 남기고 정상 상태 코드로 응답하도록 분리했다. 406은 본문(JSON)을
만들려는 시도 자체가 다시 협상 실패로 이어질 수 있어(실제 로그에서
"Failure in @ExceptionHandler" 이중 오류로 확인) 본문 없이 상태 코드만
응답한다.

MockMvc로 수정 전 실제로 500이 나고, 수정 후 405/415가 나며 Slack 알림이
호출되지 않음을 재현 테스트로 검증했다.
@coderabbitai

coderabbitai Bot commented Aug 24, 2026

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 581aec85-beb5-4d5c-b900-03aed78c0a36


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@unam98
unam98 merged commit 700dafb into main Aug 24, 2026
2 checks passed
@unam98
unam98 deleted the feature/misclassified-client-error-noise branch August 24, 2026 07:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants