HTTPQUERY
한국어

400 Bad Request

사용법

400 Bad Request 오류가 도착하면, 실패 원인을 더 파악하기 위해 메시지 본문을 살펴보는 것은 클라이언트의 몫입니다. 서버는 클라이언트가 문제를 바로잡을 수 있을 만큼 충분한 정보를 반환합니다. 400 Bad Request 응답이 발생하는 흔한 이유는 다음과 같습니다.

이러한 오류가 발생하면 클라이언트는 URL을 다시 확인하거나, 브라우저 쿠키를 지우거나, 지나치게 큰 파일을 압축한 뒤 다시 전송해 볼 수 있습니다.

참고

400 오류는 클라이언트 오류(요청이 잘못된 형식)이고, 500 오류는 서버 실패(유효한 요청을 처리하다 서버가 깨짐)입니다. 400은 일시적인 것이 아닙니다. 같은 요청을 다시 보내면 같은 오류가 납니다. 클라이언트는 재시도 전에 요청을 고쳐야 합니다. 잘못된 형식의 헤더를 주입하는 브라우저 확장 프로그램이나 애드웨어는 예상치 못한 400 오류의 흔한 원인입니다. 확장 프로그램을 비활성화해 보면 진단에 도움이 됩니다.

SEO 영향

Google 같은 검색 엔진은 400 상태를 반환하는 URL을 색인하지 않습니다. 이전에 색인되었다가 이 상태 코드를 반환하는 URL은 검색 결과에서 제거됩니다. 이 코드를 반환하는 페이지는 크롤 예산을 낭비하지 않습니다.

예시

클라이언트가 경로에 중괄호 문자가 들어간 리소스를 요청합니다. 이는 URL에서 유효하지 않으므로 서버는 400 Bad Request로 응답합니다.

요청

GET /index{15}.html HTTP/1.1
Host: example.com

응답

HTTP/1.1 400 Bad Request
Content-Type: text/html; charset=UTF-8
Content-Length: 131

<html>
  <head>
    <title>Malformed URL</title>
  </head>
  <body>
    <p>Invalid characters in HTTP request</p>
  </body>
</html>

해결 방법

400 Bad Request는 클라이언트 측 형식 문제로 서버가 요청을 거부했다는 뜻입니다.

URL에 인코딩 오류가 없는지 확인하세요. 중괄호, 공백, 비 ASCII 문자 같은 특수 문자는 퍼센트 인코딩이 필요합니다. 전체 요청 경로와 쿼리 문자열을 점검하세요. 잘못된 바이트 시퀀스를 잡아내려면 URL을 검증기에 통과시키세요.

요청 헤더를 검증하세요. 잘못된 형식의 Host 헤더, 지나치게 큰 Cookie 헤더, 필수 헤더 누락이 이 오류를 유발합니다. 헤더를 API 명세와 비교하세요. 브라우저 개발자 도구(네트워크 탭)나 curl -v로 요청과 함께 전송된 원시 헤더를 확인하세요.

요청 본문에 문법 오류가 없는지 점검하세요. 유효하지 않은 JSON, 깨진 폼 인코딩, 또는 Content-Type 헤더와 실제 본문 형식의 불일치가 거부를 유발합니다. JSON 페이로드는 보내기 전에 린터로 검증하세요.

브라우저 캐시와 쿠키를 지우세요. 손상되었거나 만료된 쿠키는 잘못된 형식의 요청 헤더를 만듭니다. 서버 버퍼 한도를 넘는 큰 쿠키 값이 자주 원인이 됩니다. 저장된 데이터를 지우고 다시 시도하세요.

Content-Length가 실제 본문 크기와 맞는지 확인하세요. 선언된 바이트 수와 실제 전송된 바이트 수가 어긋나면 잘못된 요청 응답이 돌아옵니다.

서버 측 크기 제한을 점검하세요. nginx는 헤더가 large_client_header_buffers로 설정된 버퍼(기본값: 8 KB 버퍼 4개)를 초과하면 400으로 거부합니다. nginx.conf에서 값을 늘리세요.

large_client_header_buffers 4 16k;

Apache는 LimitRequestFieldSize(기본 8190바이트)와 LimitRequestLine을 적용합니다. 서버 설정이나 가상 호스트에서 이 값들을 올리세요.

LimitRequestFieldSize 16384
LimitRequestLine 16384

정확한 원인을 파악하려면 디버그 로깅을 켜세요. nginx는 거부 사유를 info 레벨로 기록합니다. error_log를 info로 설정하고 /var/log/nginx/error.log를 살펴보세요. Apache는 LogLevel info에서 문제가 된 헤더 이름을 오류 로그에 기록합니다.

리버스 프록시의 헤더 전달을 점검하세요. nginx나 Apache가 리버스 프록시로 동작할 때 Host, X-Forwarded-For, X-Real-IP 헤더가 잘못 설정되면 백엔드가 요청을 거부합니다. proxy_set_header 지시문이 유효한 값을 전달하는지 확인하세요.

코드 참고

.NET

HttpStatusCode.BadRequest

Rust

http::StatusCode::BAD_REQUEST

Rails

:bad_request

Go

http.StatusBadRequest

Symfony

Response::HTTP_BAD_REQUEST

Python3.5+

http.HTTPStatus.BAD_REQUEST

Java

java.net.HttpURLConnection.HTTP_BAD_REQUEST

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_BAD_REQUEST

Angular

@angular/common/http/HttpStatusCode.BadRequest