📦

HTTP?


HTTP?

HTTP는 현대 인터넷의 공용어다. 웹 브라우저, 서버 웹 어플은 모두 HTTP를 통해 서로 대화한다. 따라서, 웹을 이해하기 위해서는 HTTP를 잘 알아야 할 필요가 있다.

URL과 리소스

우리는 누구의 집이 어디에 있다는 것을 정확하게 표현하기 위해 '도로명 주소'나 '지번 주소'를 사용할 수 있다. 주소는 작명 표준이기 때문에 누구나 같은 주소 형식을 사용하고, 어떤 주소든 해석하고 위치를 찾을 수 있다.

마찬가지로 인터넷에서는 어떤 리소스의 주소를 표현하기 위해 'URL'(Uniform Resource Locator)를 사용한다. URL은 브라우저가 정보를 찾는데 필요한 리소스의 위치를 가리킨다. 그리고 URL을 통해 사람들은 HTTP 및 다른 프로토콜을 통해 리소스에 접근할 수 있다. ㄹ URL의 문법은 일반적으로 9개 부분으로 나눈다. 각 부분을 '컴포넌트'라고 부른다.

1<스킴>://<사용자이름>:<비밀번호>@<호스트>:<포트>/<경로>;<파라미터>?<질의>#<프래그먼트>
  • 스킴: 사용할 프로토콜이다.
  • 호스트와 포트: 리소스를 호스팅하고 있는 장비와, 그 장비 내에서 리소스에 접근할 수 있는 서버가 어디 있는지 나타낸다.
  • 사용자 이름과 비밀번호: 대표적으로 FTP 서버의 경우 데이터에 접근하기 위해 사용자 이름과 비밀번호를 요구한다.
  • 경로: 리소스가 서버의 어디에 있는지 알려준다.
  • 파라미터: 서버에 정확한 요청을 하기 위해 필요한 입력 파라미터를 받는데 사용한다.
  • 질의: 요청받을 리소스 형식의 범위를 좁히는데 사용한다. &로 나뉜 이름=값 쌍 형식을 사용한다.
  • 프래그먼트: 클라이언트가 이를 사용해 리소스의 일부만 볼 수 있다. 서버에 전송하지 않는 컴포넌트다.

HTTP 메시지

HTTP가 인터넷의 배달원이라면, HTTP 메시지는 보낼 것을 담은 택배다.

HTTP 메시지는 HTTP 애플리케이션 간에 주고받은 데이터의 블록들이다. 데이터 블록들은 메시지의 내용과 의미를 설명하는 '텍스트 메타 정보'와 그 다음에 선택적으로 데이터가 올 수 있다.

HTTP 메시지는 시작줄, 헤더 블록 ,본문의 세 부분으로 이루어진다.

1HTTP/1.0 200 OK
2Content-type: text/plain
3Content-length: 19
4
5Hello, World!

시작줄은 어떤 메시지인지 알려주고, 헤더 블록은 속성을, 본문은 데이터를 담고 있다. 본문은 선택적이다.

시작줄과 헤더는 그냥 줄 단위로 분리된 아스키 문자열이다. 각 줄은 캐리지 리턴(CR, \r)과 개행 문자(LF, \n)로 구성된 두 글자의 줄바꿈 문자열로 끝난다. 이 줄바꿈 문자열을 합쳐 'CLRF'라고 부른다. 헤더의 목록은 빈 줄(CRLF)로 끝나 헤더 목록의 끝과 본문의 시작을 표시한다.

Carrage Return(CR)은 커서를 줄 올림 없이 앞으로 옮겨주고 Line Feed(LF)는 커서는 그대로 두고 종이를 한 줄 올리듯 줄바꿈 한다.

HTTP 문법

HTTP 메시지는 요청 메시지와 응답 메시지로 분류된다.

  • 요청
1<메서드> <요청 URL> <버전>
2<헤더>
3
4<본문>

메서드는 서버에게 무엇을 해야하는지 말해준다. 예를 들어, GET 메서드는 서버에게 리소스를 달라고 요청하기 위해 쓰인다.

HTTP/1.1을 준수하기 위해서는 GET과 HEAD 메서드가 반드시 구현되어 있어야 한다.

HEAD는 GET처럼 행동하지만, 서버는 응답으로 헤더만을 돌려준다. 이때 헤더는 GET으로 얻은 것과 같아야 한다.

  • 응답
1<버전> <상태 코드> <사유 구절>
2<헤더>
3
4<본문>

상태 코드는 클라이언트에게 무엇이 일어났는지 말해준다. 현재 버전의 HTTP에 정의된 상태 코드는 아래와 같다

전체 범위정의된 범위분류
100-199100-101정보
200-299200-206성공
300-399300-305리다이렉션
400-499400-415클라이언트 에러
500-599500-505서버 에러

버전 번호는 자신이 지원하는 가장 높은 단계의 버전을 나타낸다. 즉, HTTP/1.1로 응답을 받았다면 메시지가 HTTP/1.1로 작성되었다는 뜻이 아니다. 버전 번호는 분수로 다뤄지지 않고, HTTP/x.yxy는 각각 분리된 숫자로 다뤄진다.


참조: