''' HTTP 완벽 가이드 도서를 참고하여 배운 점을 기록한 포스트입니다. 혹시라도 오개념이 있다면 댓글 부탁드립니다. '''
1. HTTP 메시지란
- HTTP 애플리케이션 간에 주고받은 데이터의 블록이다.
- 클라이언트, 서버, 프락시 사이를 흐른다.
2. 메시지 흐름의 방향
- 인 바운드 : 클라이언트 >>> 서버
- 아웃 바운드 : 서버 >>> 클라이언트
- 모든 메시지는 다운 스트림으로 흐른다. 메시지의 발송자는 수신자의 업 스트림이다.
3. 메시지 구성
- 시작줄 + 헤더 블록 + 본문으로 구성한다.
- 시작줄은 이것이 어떤 메시지인지(메타) 서술하고 헤더 블록은 속성을 담는다.
- 본문은 선택적으로 데이터를 담는다.
[요청메시지 형식]
<메서드> <요청URL> <버전>
<헤더>
<엔터티 본문>
[응답메시지 형식]
<버전> <상태코드> <사유 구절>
<헤더>
<엔터티 본문>
3.1 시작줄
- 메서드는 클라이언트 측에서 서버가 리소스에 대해 수행해주길 바라는 동작이다.
- 요청URL은 요청의 대상이 되는 리소스를 지칭하는 URL이다.
- 버전은 이 메시지에서 사용중인 HTTP 버전이다. 메이저, 마이너로 표기한다. 버전번호가 HTTP/1.1로 된 응답을 받았을 때, 이를 응답을 보낸 어플리케이션이 1.1까지 이해할 수 있음을 의미한다.
- 상태 코드는 요청 중에 무엇이 일어나는지 설명하는 세 자리의 숫자다. 각 코드의 첫 번째 자리수는 상태의 일반적인 분류(성공, 에러)를 나타낸다.
- 사유 구절은 숫자로 된 상태 코드의 의미를 사람이 이해할 수 있게 설명해주는 짧은 문구로, 상태 코드 이후부터 줄바꿈 문자열까지가 사유 구절이다.
3.2 헤더
- 이름, 콜론, 선택적인 공백, 값, CRLF가 순서대로 나타낸다.
- 헤더의 목록은 빈 줄(CRLF)로 끝난다.
- HTTP/1.1과 같은 몇몇 버전은 특정 헤더가 있어야 유효한 것으로 간주한다.
- 헤더는 일반 헤더, 요청 헤더, 응답 헤더, 엔티티 헤더, 확장 헤더로 분류된다.
1) 일반 헤더 : 요청과 응답 양쪽에 모두 존재할 수 있다.
2) 요청 헤더 : 요청에 대한 부가 정보를 제공한다.
3) 응답 헤더 : 응답에 대한 부가 정보를 제공한다.
4) 엔티티 헤더 : 본문 크기와 콘텐츠, 혹은 리소스 그 자체를 서술
5) 확장 헤더 : 명세에 정의되지 않은 새로운 헤더
- 예시
1) Date: Tue, 3 Oct 1997 02:16:03 GMT : 서버가 응답을 만들어 낸 시각 (일반 헤더)
2) Content-length: 15040 : 15040 바이트의 데이터를 포함한 엔터티 본문
3) Content-type : image/gif : 엔터티 본문은 gif 이미지이다. (엔터티 헤더)
4) Accept: image/gif, image, image/jpeg, text/html : 클라이언트는 gif, jpeg 이미지와 html를 받아들일 수 있다. (요청헤더)
3.3 엔터티 본문
- 선택적인 데이터 블록으로, 헤더나 엔터티 본문이 없더라도 HTTP 헤더의 집합은 항상 빈줄로 끝나야 한다.
3.1.1 메서드
- 모든 서버가 모든 메서드를 구현하지 않는다.
1) GET : 서버에게 리소스를 달라고 요청하기 위해 사용
2) HEAD : GET 처럼 행동하지만, 서버는 응답으로 엔터티 본문 없이 헤더만을 돌려준다.
- 리소스를 가져오지 않고도 정보를 알아낼 수 있다. Ex. 타입
- 응답의 상태 코드를 통해, 개체가 존재하는지 확인할 수 있다.
- 헤더를 확인하여 리소스가 변경되었는지 검사할 수 있다.
- HTTP/1.1 준수를 위해서는 HEAD 메서드가 꼭 구현되어야 한다.
3) PUT : 서버가 요청의 본문을 가지고 요청 URL의 이름대로 새 문서를 만들거나, 이미 URL 이 존재한다면 본문으로 교체하는 방식이다. API 설계에서는 안 쓰는게 좋다는 의견이 많은 것 같다.
4) POST : 서버에 입력 데이터를 전송하기 위해 설계되었다.
5) TRACE : 주로 진단을 위해 사용된다. 클라이언트가 어떤 요청을 할 때, 그 요청은 방화벽, 프락시, 게이트웨이 등의 애플리케이션을 통과할 수 있고, 이 때 원래의 HTTP 요청이 수정될 수 있다. TRACE 메서드는 클라이언트에게 자신의 요청이 서버에 도달했을 때 어떻게 보이게 되는지 알려준다.
6) OPTIONS : 서버에게 특정 리소스에 대해 어떤 메서드가 지원되는 지 물어볼 수 있다. Allow. 여러 리소스에 실제로 접근하지 않고도 그것들을 어떻게 접근하는 것이 최선인지 확인할 수 있게 한다.
7) DELETE : 서버에게 요청 URL 로 지정한 리소스를 삭제할 것을 요청한다.
8) 확장 메서드 : HTTP/1.1 명세에 정의되지 않은 메서드다.
ex. LOCK, MKCOL, COPY, MOVE
3.1.2 상태 코드
1) 100~199 : 정보성 상태 코드
- 100 continue : 클라이언트 애플리케이션이 서버에 엔터티 본문을 전송하기 전에 그 엔터티 본문을 서버가 받아들일 것인지 확인할 때 사용한다.
- 101 switching protocols : 서버가 프로토콜을 바꾸었음을 의미한다.
2) 200~299 : 성공 상태 코드
- 200-ok : 요청이 정상이고, 엔터티 본문은 요청된 리소스를 포함한다.
- 201 created : 서버 개체를 생성하는 요청에 사용된다. 응답은, 생성된 리소스에 대한 최대한 구체적인 참조가 담긴 로케이션 헤더와 함께, 그 리소스를 참조할 수 있는 url을 본문에 포함해야 한다.
- 202 accepted : 요청은 받아들여졌으나 서버는 아직 그에 대한 어떤 동작도 수행하지 않았다. 엔터티 본문에 요청에 대한 상태와 요청의 처리가 언제 완료될 것인지에 대한 추정 또는 정보링크를 포함해야 한다.
- 203 non-authoritative information : 엔터티 헤더 정보가 원래 서버가 아닌 리소스 사본에서 왔음을 의미한다.
- 204 no content : 사용자에게 보여지는 페이지를 바꾸지 않고 리소스를 업데이트할 때 사용한다.
- 205 reset content : 브라우저에게 현재 페이지에 있는 html 폼에 채워진 모든 값을 비우라는 의미이다.
- 206 partial content : 부분 혹은 범위 요청이 성공했다는 의미이다.
3) 300-399 : 리다이렉션 상태 코드
- 300 multiple choices : 클라이언트가 동시에 여러 리소스를 가리키는 url을 요청한 경우, 그 리소스의 목록과 함께 반환한다. ex. 하나의 html 문서를 영어, 프랑스어로 제공하는 경우
- 301 moved permanently : 요청한 url이 옮겨졌을 때 사용한다. 응답은 로케이션 헤더에 현재 리소스가 존재하는 url을 포함해야 한다.
- 302 found : 301과 동일하나, 클라이언트는 여전히 옮겨지기전 URL로 요청할것을 의미한다.
- 303 see other : 요청받은 행동 수행을 위해서는 다른 URL로 요청 해야함을 의미한다.
- 304 not modified : 이전의 동일한 요청과 비교하여 변화가 없음을 의미한다. (단시간에 반복된 동일 요청에 대한 대응)
- 305 use proxy : 직접적인 요청이 아니라 반드시 프락시(우회경로)를 통해 요청되어야 함을 의미한다.
- 307 temporary redirect : 302와 동일하며, HTTP Method도 변경없이 요청하여야 함을 의미한다.
4) 400-499 : 클라이언트 에러 상태 코드
- 400 Bad request: 클라이언트가 올바르지 못한 요청을 보내고 있음을 의미한다.
- 401 unauthorized : 요청을 위해서는 권한 인증등을 요구함을 의미한다.
- 403 forbidden: 요청이 서버에 의해 거부 되었음을 의미, 서버는 거부 이유를 포함하여 응답할 수 있지만, 보통은 거부 이유를 숨기고 싶을 때 사용된다.
- 404 not found : 요청한 URL을 찾을 수 없음을 의미한다.
- 405 method not allowed : 요청한 URL이 Method를 지원하지 않음을 의미한다. (ex] POST요청에 대한 응답을 하는 URL에 GET으로 요청)
- 406 not acceptable : 리소스가 클라이언트가 받아들일 수 있는 형태가 아님을 명시한다.
- 407 proxy authentication : 401과 동일하나, 프락시(우회경로)를 통하여 인증 할 것을 요구함을 의미한다.
- 408 request timeout : 요청에 응답하는 시간이 너무 많은 시간이 걸림을 의미한다.
- 409 conflict : 클라이언트 요청에 대해 서버에서 충돌 요소가 발생 할 수 있음을 의미한다.
- 410 gone : 요청한 URL이 더 이상 사용되지 않고 사라졌음을 의미한다.
- 411 length required : 클라이언트 요청에 Content-length 헤더가 포함되어야 함을 의미한다.
- 412 precondition failed : 클라이언트가 조건부 요청을 했는데 그중 하나가 실패하였음을 의미한다.
- 413 request entity too large : 요청이 너무 커서 서버가 처리 할 수 없음을 의미한다.
- 414 request uri too long : 요청 URL이 너무 길어 처리 할 수 없음을 의미한다.
- 415 unsupported media type : 서버가 이해 하지 못하는 유형의 컨텐츠를 요청 하였음을 의미한다.
- 416 requested range not satisfiable : 리소스의 특정 범위를 요청했는데 그 범위가 잘못되었거나 맞지 않을 때 사용한다.
- 417 expectation failed : 클라이언트 요청 헤더의 Expect에 대해 서버가 만족 하지 않음을 의미한다.
5) 500-599 : 서버 에러 상태 코드
- 클라이언트가 서버의 제한에 걸린 것일 수 있고, 게이트웨이 리소스와 같은 서버의 보조 구성요소에서 발생한 에러일 수 있다.
- 500 internal server error : 서버에 오류가 발생하여 응답 할 수 없음을 의미한다.
- 501 not implemented : 클라이언트 요청에 대한 서버의 응답 수행 기능이 없음을 의미한다. (ex. 서버가 지원하지 않는 새로운 Method를 사용하여 요청)
- 502 bad gateway : 프락시나 게이트웨이등의 서버에서 응답하며, 서버의 부모 서버에서 오류가 발생하였음을 의미한다.
- 503 service unavailable : 현재 서버가 유지보수 등의 이유로 일시적인 사용 불가함을 의미한다.
- 504 gateway timeout : 408과 비슷하지만, 다른 서버에게 요청을 보내고 응답을 기다리다 타임아웃이 발생한 게이트웨이나 프락시에서 온 응답임을 의미
- 505 http version not supported : 서버가 지원할 수 없거나 올바르지 못한 프로토콜로 요청을 받았음을 의미한다.
3.2.1 헤더
1) 일반 헤더
- connection, date, mime-version, trailer chunked transfer, transfer-encoding, upgrade, via
- 일반 캐세 헤더 cache-control, pragma
2) 요청 헤더
- client-ip, from, host, referer, ua-color, ua-cpu, ua-disp, ua-os, ua-pixels, user-agent
- Accept 관련 헤더 accept, accept-charset, accept-encoding, accept-language, te
- 조건부 요청 헤더 expect, if-match, if-modified-since, if-none-match, if-range, if-unmodified-since, range
- 요청 보안 헤더 authorization, cookie, cookie2
- 프록시 요청 헤더 max-forwards, proxy-authorization, proxy-connection
3) 응답 헤더
- age, public, retry-after, server, title, warning
- 협상 헤더 accept-ranges, vary
- 응답 보안 헤더 proxy-authenticate, set-cookie, www-authenticate
4) 엔터티 헤더
- allow, location
- 콘텐츠 헤더 content-base, content-encoding, content-language, content-length, content-location, content-md5, content-range, content-type
- 엔터티 캐싱 헤더 etag, expires, last-modified
'Book Review > HTTP 완벽 가이드' 카테고리의 다른 글
[HTTP 완벽 가이드] 2장. URL과 리소스 (0) | 2022.01.05 |
---|---|
[HTTP 완벽 가이드] 스터디 시작 (0) | 2022.01.05 |