웹 서버와 웹 클라이언트(사용자의 브라우저)가 데이터를 전송하기 위해 HTTP라는 통신규약을 사용합니다.

클라이언트의 요청 메시지에 대해 서버가 처리한 결과를 응답 메시지로 회신하는 형식으로 동작하는데요,

요청 메시지에는 어떤 내용이 담겨있는지, 헤더값에 포함될 수 있는 필드는 어떤것들이 있는지 알아보도록 하겠습니다.


HTTP 요청 메시지 구조

먼저, 요청 메시지의 구조에 대해 알아보도록 하겠습니다.

클라이언트의 요청 메시지 요청문+헤더+바디로 이루어진 단순한 구조로 구성되어 있습니다.


요청문

(Request Line) 

헤더

(Header)

공백 한 줄

바디

(Body)

 

요청문은 요청방식 + 요청URI + HTTP버전 정보를 포함하고 있고, 각 정보사이는 공백으로 구분을 하게 됩니다.

좀 더 자세히 설명드리자면,

요청방식에는 GET, POST, PUT, DELETE, .. 등의 Method를 입력합니다.

만약, GET Method를 사용했다면 '정보를 요청합니다'라는 의미인데 어떤 정보를 요청하는 것인지 서버에게 알려줘야겠죠 ?!

여기서 `어떤 정보`에 해당하는 내용을 요청URI에 지정해주면 됩니다.

마지막으로, 사용하는 HTTP의 버전을 지정해주면 요청문이 완성됩니다!

HTTP버전에 따라 사용할 수 있는 메소드나 헤더의 종류가 달라지므로 정확하게 지정해줘야 합니다.


헤더부분에는 여러 종류의 필드가 포함될 수 있습니다. 

"필드명 : 필드값"의 형식으로 구성되는데, 필드 종류에 대해서는 ↓아래에서↓ 자세히 살펴보도록 하겠습니다.


바디와 헤더사이에는 공백이 존재하기 때문에, 헤더의 종료와 바디의 시작을 구분할 수 있습니다.

바디부분에는 데이터가 들어갑니다.

예를 들어, 어떤 사이트에 로그인을 하면 사용자가 입력한 아이디와 패스워드를 바디부분에 담아 서버쪽으로 전달하게 됩니다.

물론, 개인정보와 같이 공개되서는 안되는 데이터의 경우에는 HTTPS를 사용해 암호화해서 전달하는 것이 일반적이지만 예를 들어 설명드렸습니다.

HTTPS는 HTTP의 암호화된 버전이라고 생각하시면 됩니다.   


HTTP Header Fields

헤더를 구성하는 여러 종류의 필드가 있지만, 자주 접하게 되는 필드 위주로 정리를 해보았습니다.

이 외의 다른 필드가 궁금하시다면 이곳을 클릭해 5장( Request Header Fields )의 내용을 확인하시면 됩니다~


필드명 

설명 

예 

 Accept

 클라이언트가 처리할 수 있는 데이터 형식을 알려줍니다.

 text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

 Accept-Charset 

 클라이언트가 이해할 수 있는 캐릭터셋이 무엇인지를 알려줍니다. 

서버는 제안된 것 중 하나를 선택하고 그것을 사용하며, [Content-Type] 응답 헤더를 통해 선택된 캐릭터셋을 클라이언트에게 알려줍니다. 

 Accept-Charset: iso-8859-5, unicode-1-1;q=0.8

 Accept-Encoding

 클라이언트가 받아들일 수 있는 인코딩 방식을 지정합니다. 

서버는 제안된 내용 중 하나를 선택하고 그것을 사용하며, [Content-Encoding] 응답 헤더를 이용해 선택된 것을 클라이언트에게  알려줍니다.

 Accept-Encoding: compress, gzip

 Accept-Language

 클라이언트가 이해할 수 있는 언어를 알려줍니다.

서버는 제안 중 하나를 선택한 뒤, 그것을 사용하고 [Content-Language] 응답 헤더와 함께 선택된 내용을 클라이언트에게 알려줍니다.

 Accept-Language: da, en-gb;q=0.8, en;q=0.7

 Authorization

인증을 수행해야 하는 경우 인증정보를 알려줍니다.

 Authorization  = "Authorization" ":" credentials

 From

 현재 사용하고 있는 클라이언트의 전자 우편 주소를 알려줍니다.

 From: webmaster@w3.org

 Proxy-Authorization

 클라이언트가 권한을 요구하는 프록시에 대해 자신을 식별하기 위해 사용합니다.

 Proxy-Authorization = "Proxy-Authorization" ":" credentials

 Referer 요청된 URI를 참조하는 문서의 URI에 전달한다.

 Referer: http://www.w3.org/hypertext/DataSources/Overview.html

 User-Agent

 클라이언트에 의해 사용된 소프트웨어 프로그램 정보를 웹서버에게 알려줍니다. 통계 목적으로 사용되기도 합니다.

 User-Agent: CERN-LineMode/2.15 libwww/2.17b3


요청 메시지 예시

포스팅을 하다보니 실제 요청메시지가 어떻게 생겼는지 궁금해졌습니다.

웹 브라우저에도 디버깅 툴이 내장되어 있지만, "피들러"라는 http 패킷 디버깅 툴을 사용해 보았습니다.

초록색창에서 로그아웃 했을때의 http 패킷 중 하나의 패킷을 캡쳐한 사진인데요~

요청 메시지에 대해 어느정도 숙지를 하고 보니, 전에는 몰랐던 내가 사용한 웹 브라우저가 처리할 수 있는 데이터 형식, 인코딩 방식, 언어 등을 알 수 있게 되었습니다.

응답 메시지에 대한 패킷도 볼 수 있으니, 서버에서 처리한 결과에 대해서도 확인하실 수 있습니다!



서버와 클라이언트가 HTTP 통신을 하기 위해

먼저, 클라이언트가 서버쪽으로 자신이 처리할 수 있는 스펙들에 대해 알려주고 

서버는 클라이언트의 상황에 맞춰 정보를 제공하는 방식으로 동작한다는 것을 알게 되었습니다.

그리고, 클라이언트가 나열할 수 있는 여러가지 스펙들에 대해서도 알아보았습니다.


본문 내용중에 잘못된 정보나 추가되었으면 하는 정보가 있으시다면 의견을 남겨주시면 감사하겠습니다.

이상 마치도록 하겠습니다 :)