티스토리 뷰

반응형

미니 Web Application Server(WAS)를 짜려다보니...


HTTP의 요청 프로토콜과 응답 프로토콜에 대한 이해가 먼저 필요했다.



왜냐면 HTTP는 요청과 응답의 한 세트로 모든 일이 일어나기 때문!


그래서 이번 포스트에서는 요청 프로토콜에 대해 다뤄보도록 하겠다.



요청 프로토콜(Request Protocol)

HTTP 요청 형식은 다음과 같다.


Request-Line CRLF 

 { 메시지헤더 CRLF } * 

 CRLF

 message-body



참고로 CRLF는 줄바꿈을 말한다. 그니까 '엔터'치는거 말이다.


Request-Line이 한 줄 오고 줄 바꿈 후, 메시지 헤더가 온다.

메시지 헤더에는 general, request, entity header가 있는데, 이 3개는 여러 개가 올 수 있다.

메서지 헤더는 하나 당 한 번이 줄 바꿈이 있어야 하고 메시지 헤더가 모두 끝나면 빈 줄이 꼭 있어야 한다.

그런 담에 메시지 본문이 오면 끗.


각각을 좀 더 디테일하게 살펴보겠다.


1. Request-Line(요청 라인)

요청 라인은 요청 대상을 가리키는 한 줄의 문자열이다.

이 요청 라인은 이렇게 구성이 되어 있다.

GET 

http://www.tistory.com/index.html

HTTP/1.1 

 메소드

URI 

HTTP 버전 


메소드

메소드는 요청의 종류를 말한다. 
어떤 종류의 요청인지를 가리는 데에 사용된다고 보면 된다.
메소드는 몇 가지 종류가 있는데, GET, POST가 가장 대표적이다. 
GET은 자원 조회 요청에 주로 사용되고, POST는 자원을 추가하거나 변경하는 것과 같은 요청에 사용된다.

메소드는 이 두 가지 말고도 몇 개가 더 있다.
HEAD - 생성일, 크기 등 자원의 정보면 요청할 때 사용
PUT - 자원 추가 요청 시 사용
DELETE - 자원 제거 요청 시 사용

뭐 이 정도만 알아도 많이 아는거다. 헿


URI

메소드가 어떤 종류의 요청인지를 알려주는 거라면, 이 친구는 '뭘 요청했나?'를 알려주는 친구다.
우리가 웹브라우저 주소 창에 www.daum.net를 입력하면 그에 대한 응답으로 우리에게 다음 홈 화면을 주는거다.

HTTP 버전

이건 말 그대로 HTTP 버전을 나타낸다.
버전에 따라서 이용할 수 있는 메소드 종류도 다르고, 요청 헤더 종류도 달라지기 때문에 어떤 버전에 따른 요청인지 지정해줘야 한다.

2. Message Header(메시지 헤더)

메시지 헤더는 요청에 대한 부가 설명은 담은 데이터로, 3 가지 종류가 있다.
 => 일반 정보(general header), 요청 정보(request header), 엔티티 정보(entity header)


이걸 쓰는 문법은 이렇다.

 => 헤더명: 값 CRLF

General Header

요청과 응답 모두에 사용되는 정보이다.

Request Header

요청할 때만 전달되는 정보이다.

Entity Header

보내는 데이터에 대한 정보이다.
무언가 데이터를 보낸다는 것은 POST 요청이라는 말이기 때문에, 이 정보는 POST 요청일 때만 보낸다.

참고로 GET 요청은 URL에 보내는 데이터가 포함되기 때문에 entity header가 필요하지 않다.


3. Message-body(메시지 본문)

이것은 말 그대로 요청하는 데이터 본문을 말하는데, 데이터를 보낸다는 것은 POST요청이라는 말이다.
때문에 이것도 POST 요청인 경우에만 추가된다.



이그잼쁠


GET /app/test/list.json HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
Origin: null
Accept: *
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4

=> 이 예는 GET 방식 요청이기 때문에 Request Line과 메시지 헤더로만 구성되어 있다.



반응형
댓글
  • 프로필사진 EomJinyoung 오호라 2017.06.01 18:06
  • 프로필사진 H 우왕~ 나중에 또 읽어봐야짓!! 2017.06.03 15:29
  • 프로필사진 jaehee 감사합니다 :-)
    정리가 잘 되어있어서 이해하기 좋았어요!
    2018.12.28 15:35
  • 프로필사진 workingmoon5000 이해가 쉽도록 과정을 잘 설명해주시네요.
    저는 원래 delphi/c#/c++ 같은 것만 사용했습니다.
    작년부터 java 계열과 이클립스를 사용하면서 삽질(?) 을 많이 했었는데요.
    특히 이클립스 툴에 대해서 멘붕이었고요.

    글을 보면서 좀 이해가 되는게, 이클립스가 나온지 꽤 되서 그런지 아주 기초외엔 중간팁 같은건 없고
    익히는 과정중에 여러 삽질을 했습니다.

    지금도 오류가 나거나, 애처러운 부분이 많이 생기는데...
    이클립스 툴에 대해서도 글을 남겨주세요.
    2019.01.09 10:15
  • 프로필사진 너무 이그잼플까지 완벽합니다 2022.03.17 19:33
댓글쓰기 폼