417 Expectation Failed
사용법
417 Expectation Failed 오류 메시지를 받는 경우, 클라이언트가 요청의 Expect 헤더에 사전 협상을 위한 조건을 하나 이상 지정한 상황입니다. 이는 정보성 응답인 100과 관련이 있습니다.
Expect: 100-continue 헤더로 요청이 제출되면 서버는 요청의 관련 세부 사항을 검토합니다. 여기에는 Content-Type이나 Content-Length 헤더 필드가 포함됩니다. 서버가 메시지 본문을 받아들일 의사가 있으면 100 정보성 응답이 반환됩니다.
서버가 메시지 본문을 받아들일 의사가 없으면 401이나 405 같은 적절한 상태가 전송됩니다. 417 Expectation Failed 오류는 서버나 응답 경로가 expectation을 지원하지 않을 때만 반환됩니다. 이 메시지를 받으면 클라이언트는 Expect 헤더 없이 요청을 다시 보냅니다.
SEO 영향
Google 같은 검색 엔진은 417 Expectation Failed 응답 상태를 가진 URL을 색인하지 않습니다. 이전에 색인된 URL은 검색 결과에서 제거됩니다.
클라이언트를 위한 특별 고려 사항
Expect: 100-continue를 보내는 클라이언트가 특정 시간만큼 기다려야 하는 것은 아닙니다. 클라이언트는 응답을 먼저 받지 않고도 메시지 본문 전송을 진행합니다. HTTP/1.0 서버는 expectation을 지원하지 않으므로, 그런 서버가 중계자로 끼어 있을 때 클라이언트는 메시지 본문을 보내기 전에 무한정 기다리지 않습니다.
서버를 위한 특별 고려 사항
서버가 HTTP/1.0 요청의 일부로 Expect: 100-continue를 받으면 그 expectation은 무시해야 합니다. 메시지 본문을 이미 수신했거나 메시지 본문이 존재하지 않는다면 서버가 100으로 응답할 필요는 없습니다.
서버가 100을 보낸 경우에는 그 전에 연결이 끊기지 않는 한 결국 200 같은 최종 상태가 뒤따라야 합니다.
서버가 메시지 본문 전체를 받기 전에 최종 응답을 보낸다면, 그 응답은 서버가 연결을 어떻게 할 것인지, 즉 연결을 닫을 것인지 아니면 계속 읽어 요청 메시지를 버릴 것인지를 나타냅니다.
예시
클라이언트가 10K 크기의 PDF 파일을 보내겠다고 요청합니다. expectation이 지원되지 않으므로 서버는 417 Expectation Failed로 응답합니다.
요청
PUT /docs HTTP/1.1
Host: example.com
Content-Type: application/pdf
Content-Length: 10000
Expect: 100-continue
응답
HTTP/1.1 417 Expectation Failed
Content-Type: text/html
Content-Length: 159
<html>
<head>
<title>Expectations not supported</title>
</head>
<body>
<p>Expectations are not supported by this server.
</p>
</body>
</html>
해결 방법
Expect: 100-continue 헤더를 제거하고 본문 전체를 포함해 요청을 다시 보내세요. 서버나 중간 프록시가 100-continue 메커니즘을 지원하지 않는 것입니다.
많은 HTTP 클라이언트 라이브러리가 명시적인 지시 없이도 큰 페이로드에 대해 Expect: 100-continue 헤더를 자동으로 추가합니다. 라이브러리 수준에서 이 동작을 비활성화하세요.
프록시 및 중계자 문제. HTTP/1.0 프록시, 로드 밸런서, 구형 게이트웨이는 Expect: 100-continue 핸드셰이크를 이해하지 못합니다. 요청이 그런 중계자를 거치면, 오리진 서버가 expectation을 처리하기도 전에 프록시가 요청을 거부합니다. 이런 환경에서는 프록시를 업그레이드하거나 HTTP/1.0 중계자를 우회해 라우팅하면 문제가 해소됩니다.
서버 측에서 이 상태는 현대적인 HTTP 스택에서는 드뭅니다. 대부분의 서버는 Expect: 100-continue를 존중하거나 해당 헤더를 조용히 무시합니다. 417을 반환하는 것은 요청에서 expectation을 빼라는 의도적인 신호입니다.
코드 참고
.NET
HttpStatusCode.ExpectationFailed
Rust
http::StatusCode::EXPECTATION_FAILED
Rails
:expectation_failed
Go
http.StatusExpectationFailed
Symfony
Response::HTTP_EXPECTATION_FAILED
Python3.5+
http.HTTPStatus.EXPECTATION_FAILED
Java
HttpServletResponse.SC_EXPECTATION_FAILED
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_EXPECTATION_FAILED
Angular
@angular/common/http/HttpStatusCode.ExpectationFailed