HTTP Response (응답)


HTTP Response messages (응답 메시지)

서버는 요청이 들어오면 다음과 같은 응답 메시지를 반환한다.

HTTP/1.1 200 OK
Date: Sun, 11 Jan 2014 16:06:23 GMT
Server: Apache/1.3.22 (Unix) (Red-Hat/Linux)
Last-Modified: Sun, 07 Dec 2013 12:34:18 GMT
ETag: "1dba6-131b-3fd31e4a"
Accept-Ranges: bytes
Content-Length: 4891
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html

<!DOCTYPE html>
<html>
  :
</html>

응답 메시지는 다음 구문으로 구성된다.

응답 행(Response line) 또는 상태 행(Status line)

HTTP/1.1 200 OK  

HTTP 응답 헤더 (HTTP Response Header)

Date: Sun, 11 Jan 2014 16:06:23 GMT
Server: Apache/1.3.22 (Unix) (Red-Hat/Linux)
Last-Modified: Sun, 07 Dec 2013 12:34:18 GMT
ETag: "1dba6-131b-3fd31e4a"
Accept-Ranges: bytes
Content-Length: 4891
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html

빈 라인(blank line) : (헤더의 끝을 의미함)

CR LF

HTTP 본문 (HTTP Body)

<!DOCTYPE html>
<html>
  :
</html>

줄 바꿈 코드는 Windows 형식의CR LF("\r\n")이다. 첫 번째 라인에는 요청 행 또는 응답 행이 있고, 헤더는 여러 라인이 있고, 빈 라인은 한 라인이 있고, 메시지 바디는 여러 라인이다.

Start line (응답 시작 라인)

HTTP 응답의 시작 라인(상태 라인)에는 다음 세 가지 요소가 있다.

  • HTTP 프로토콜 버전 (HTTP 요청 메시지와 동일)
  • Response Status Code (응답 상태 코드)
  • 상태 문자열

이후에는 특히 중요한 “HTTP 응답 상태 코드"와 “상태 문자열"에 대해 설명한다.

응답 시작 라인은 다음 형식으로 표시된다.

시작 라인:

[HTTP 프로토콜 버전] [응답 상태 코드] [상태 문자열]

상태 문자열는 OK 및 Not Found와 같은 상태 번호의 의미와 세부 정보를 보완하는 메시지를 반환한다.

실제 예제로 시작 라인을 확인해 보자.

시작 라인 확인:

% curl http://google.com/ --head
HTTP/1.1 301 Moved Permanently
  • HTTP 프로토콜 버전 : HTTP/1.1
  • 응답 상태 코드 : 301
  • 상태 문자열 : Moved Permanently

HTTP 프로토콜 버전

HTTP 요청 메시지와 동일하게 HTTP 버전을 나타낸다. 일반적으로 HTTP/1.1 or 2.0 이다.

Response Status Code(응답 상태 코드)와 상태 문자열

HTTP/1.1 상태 코드 정의는 RFC 2616에 규정되어 있는데 간단히 정리하면 다음과 같다.

응답 코드 의미 설명
1xx Informational 정보 제공
2xx Successful 성공 응답
3xx Rediection 추가작업(리디렉션)
4xx Client Error 클라이언트측 오류
5xx Server Error 서버측 오류

1xx, 2xx, 3xx 코드는 서버와 User Agent간의 상태를 표시한 것이기 때문에 일반 사용자가 그 내용을 볼 수 없지만, 4xx, 5xx 코드는 일반 사용자도 흔히 볼 수 있는 내용이다.

어떤 이유로든 웹 페이지가 브라우저 상에 정상적으로 뜨지 않는다면 이는 3xx, 4xx 오류에 해당한다. 때문에 오류의 원인을 이해하고 이를 복구하기 위해서는 오류코드가 의미하는 바를 잘 대충이라도 알아야 한다.

응답 코드 의미 설명
100 Continue 클라이언트로 부터 일부 요청을 받았으며 나머지 정보를 계속 요청한다.
101 Switching protocols 프로토콜 전환. 요청자가 서버에 프로토콜 전환을 요청했으며 서버는 이를 승인하는 중이다.
200 OK 요청이 성공적으로 수행되었다.
201 Created 성공적으로 요청되었으며, 서버가 새 리소스를 작성하였다.
202 Accepted 웹 서버가 요청을 접수했지만 아직 처리하지 않았다.
203 Non-authoritative information 신뢰할 수 없는 정보, 서버가 요청을 성공적으로 처리되었지만 다른 소스에서 수신된 정보를 제공하고 있다.
204 No content 콘텐츠 없음. 서버가 요청을 성공적으로 처리했지만 콘텐츠를 제공하지 않았다.
205 Reset Content 콘텐츠 재설정. 서버가 요청을 성공적으로 처리했지만 콘텐츠를 제공하지 않았다.
206 Partial content 일부 콘텐츠. 서버가 GET요청의 일부만 성공적으로 처리했다.
300 Multiple Choices 컨텐츠를 얻는 방법에 대한 여러 가지 옵션이 있다.
301 Moved permanently 요구한 데이터를 변경된 타 URL에 요청하였다.
302 Not temporarily 요구한 데이터를 변경된 임시 URL에서 찾았음
304 Not modified 업데이트되지 않았고, 컴퓨터 로컬의 캐시 정보를 이용하였다. 보통 gif 등은 웹 서버에 요청하지 않았다. If-Modified-Since 헤더를 사용했을 경우에 반환된다.
305 Use Proxy Location 헤더에 지정된 프록시를 사용한다.
306 (Unused) 미사용.
307 Temporary Redirect 다른 위치로 일시적으로 이동 중이다.
400 Bad request 요청이 잘못되었다. 사용자의 잘못된 요청을 처리할 수 없다.
401 Unauthorized 인증되지 않았다. 인증이 필요한 페이지를 요청한 경우에 발생한다.
402 Payment required 예약됨. 지불이 필요하다.
403 Forbidden 액세스가 허용되지 않는다. 접근 금지(디렉터리 리스팅 요청 및 관리자 페이지 접근 등을 차단).
404 Not found 요청한 페이지가 없다. 찾을 수 없습니다.
405 Method not allowed 허용되지 않는 HTTP Method 사용하였다. 지정한 메소드는 지원되지 않는다.
407 Proxy authentication required 프록시 인증이 필요하다.
408 Request timeout 요청이 시간 초과 되었다.
410 Gone 영구적으로 사용 금지. 요청한 콘텐츠가 사라졌다.
411 Length Required Content-Length 헤더를 추가하여 요청해라.
412 Precondition failed 전체 조건 실패. If-… 헤더에 지정된 조건에 부합하지 않았다.
414 Request-URI too long 요청 URL 길이가 긴 경우임
415 Unsupported Media Type 지원되지 않는 미디어 유형이다.
416 Requested Range Not Satisfiable 요청한 범위가 잘못되었다.
417 Expectation Failed Expect 헤더에 지정된 확장 요청이 실패했다.
500 Internal server error 내부 서버 오류. 서버에서 예기치 않은 오류가 발생하였다.
501 Not implemented 웹 서버가 처리할 수 없다.
502 Bad Gateway 게이트웨이가 잘못되었다.
503 Service unnailable 서비스 제공 불가. 서비스는 사용할 수 없다.
504 Gateway timeout 게이트웨이가 시간 초과되었다.
505 HTTP version not supported 해당 HTTP 버전 지원되지 않는다.

HTTP Header (응답 헤더)

응답 헤더에는 다음 세 가지 유형이 있다

헤더 유형 설명
응답 헤더 응답 본문의 데이터와 관련이 없는 헤더 - Location
일반 헤더 검색할 리소스 - Date
- Cache-Control
엔티티 헤더 응답 본문에 적용 - Content-Type
- Content-Length
- Expires

HTTP Body (응답 본문)

리소스(파일)의 내용을 포함한다.

% curl http://www.devkuma.com
<!DOCTYPE html>
<html lang="ko">
<head>