함께 성장하는 프로독학러

HTTP 요청/응답 및 HTTP 요청 method feat. Restful API 본문

Programming/Utilities || ETC

HTTP 요청/응답 및 HTTP 요청 method feat. Restful API

프로독학러 2018. 7. 4. 11:52

안녕하세요, 프로독학러입니다.


이번 포스팅에서는 HTTP 의 요청과 응답의 메시지 구조와, 클라이언트 측에서 요청을 할 때 어떤 method 를 사용함에 따라 요청 메시지가 어떻게 달라지는지에 대해서 알아보도록 하겠습니다.


0. HTTP


요청/응답 메시지와 요청 method 를 이해하기 위해서 먼저 HTTP 가 무엇인지 이해할 필요가 있습니다.


HTTP (HyperText Transfer Protocol) 란 HTML 문서와 같은 리소스들을 서버로부터 가져올 수 있도록 해주는 프로토콜(protocol)입니다.

여기서 프로토콜이란, 시스템이 다른 시스템과 원할하게 통신할 수 있도록 해주는 통신 규약, 약속이라고 생각하면 됩니다.

HTTP 는 가장 성공적인 인터넷 프로토콜이며, 어플리케이션 레벨의 프로토콜로 TCP/IP 위에서 작동합니다.


HTTP 는 서버/클라이언트 모델을 통해서 작동합니다. 클라이언트에서 요청(request)를 보내면 서버는 요청을 처리해서 응답(response)합니다.



클라이언트는 서버에 요청하는 클라이언트 소프트웨어가 설치된 컴퓨터로, 여기서 클라이언트 소프트웨어는 IE, Chrome, Firefox 등의 웹브라우저를 의미합니다. 클라이언트는 URI 를 이용하여 서버에 접속하고, 데이터를 요청할 수 있습니다.

서버는 클라이언트의 요청을 받아 그 요청을 해석하고 응답을 하는 소프트웨어가 설치된 컴퓨터입니다.


웹서버는 보통 표준 포트인 80번 포트로 서비스합니다.


* URI / URL 

URI (Uniform Resource Identifier) - 통합 자원 식별자, 인터넷에 있는 자원을 나타내는 유일한 주소

URL (Uniform Resource Locator) - 파일 리소스의 위치, 네트워크상의 자원의 위치 

ex) http://sample.com/login => REST 서비스 (URL)

ex) http://sample.com/main/sports.pdf => sample.com 서버의 main 폴더안의 sports.pdf 파일을 요청하는 URL 

* URI 안에 URL 이 포함된다.

* 출처: https://blog.lael.be/post/61


* 출처: https://www.joinc.co.kr/w/Site/Network_Programing/AdvancedComm/HTTP


1. HTTP 요청 헤더 포멧


요청은 클라이언트에서 서버로 보내는 메시지이며, 아래와 같은 구조로 생겼습니다.



위의 그림과 같이 메시지의 최상단에는 요청라인(Request-Line) 이 있고, 다음 라인에 HTTP 헤더 정보가 있습니다.

헤더 이후에 한 줄의 공백이 나온 다음 바디가 오게 됩니다.


요청라인은 아래와 같은 정보를 포함하며, 각각은 공백으로 구분됩니다.


요청 방식(Method), 요청 URI, HTTP 버젼


그럼 실제로 HTTP 요청이 어떻게 생겼는지 알아보겠습니다.

(크롬 확장도구인 'Live HTTP Headers'를 통해 확인했습니다)


GET / HTTP/1.1

Host: localhost:4000

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

Accept-Encoding: gzip, deflate, br

Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7

Cookie: hblid=gupPzH3lCNmZhozG3m39N0GYB8Br6rH4; olfsk=olfsk957851537899227; connect.sid=s%3Adx8XBNTOX08FkVT8c2WsATIvIESlGujp.aH3cDWPLxXPV6pkFyI3AAAGi5zLTmmmxgPmgf%2FNOaJ4; key=eyJpc0xvZ2dlZEluIjp0cnVlLCJ1c2VybmFtZSI6IjExMTEifQ==

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36

X-DevTools-Emulate-Network-Conditions-Client-Id: 2829E8CC4902FCCF69EF66EA4993993E


위의 HTTP 요청은 의 경로에 GET 방식으로 http://localhost:4000/ 에 접속한 요청에 대한 정보입니다.

요청 데이터의 첫 번째 줄이 요청 라인입니다.

GET / HTTP/1.1 이라고 적혀있는데, 이는 공백을 기준으로 처음부터 요청방식, 요청 URI, HTTP 버전입니다.

즉, GET 방식으로 '/' URI 에 요청했으며, HTTP 버전은 1.1 이다 라는 의미입니다.

아래의 Host 부터는 Header 영역으로, 요청과 요청 데이터에 대한 메타정보들이 포함되어 있습니다.


Body 영역은 HTTP 메소드에 따라 있을 수도 없을 수도 있는데, 이는 아래에서 자세히 알아보겠습니다.

* GET 방식의 요청에는 Body 가 없습니다.


2. HTTP 응답 헤더 포멧


서버가 클라이언트의 요청에 대해 응답하는 HTTP 응답헤더의 구조는 다음과 같습니다.



전체적인 모양은 요청 헤더의 포맷과 동일합니다.

다른점이 있다면 요청 헤더에서는 Request Line (요청라인) 이엇던 것이 응답에서는 Status Line 으로 바뀐 점입니다.


헤더다음에 한 줄을 비우고 바디가 오는 것 역시 요청과 동일합니다.


Status Line 에는 다음고 같은 정보를 포함합니다.


HTTP 버젼, 상태코드, 응답이유


위의 요청에서 살펴봤던 헤더를 서버에 요청했을 때 서버측에서 응답한 내용을 살펴보겠습니다.


HTTP/1.1 200 OK

accept-ranges: bytes

cache-control: public, max-age=0

content-length: 928

content-type: text/html; charset=UTF-8

date: Wed, 04 Jul 2018 01:42:11 GMT

etag: W/"3a0-16462bb9496"

last-modified: Wed, 04 Jul 2018 00:40:17 GMT

x-powered-by: Express


응답헤더의 첫 번째 줄은 상태라인입니다.

HTTP 버젼은 1.1 이고, 응답한 상태코드는 200, 응답이유는 OK 입니다.

상태코드는 응답의 상태를 세 자리의 숫자로 표현한 것으로, 100 번 대 부터 500 번 대 까지 있습니다.

* HTTP 상태코드 (status) 가 숫자별로 무슨 의미인지 자세히 알고싶으신 분들은 아래의 링크(위키백과)를 참조해 주세요.

<HTTP 상태코드>


응답헤더는 서버의 여러 상태정보를 포함합니다.

날짜, 서버 프로그램 및 스크립트 정보, 컨텐츠 길이, 수정일, 캐쉬제어 방식, Keep Alive 기능 설정 등의 내용이 포합됩니다.


3. HTTP 메소드


위의 HTTP 요청에서 method 에 관해서 언급했습니다.

그럼 이 method 가 뭘 의미하는지 알아보도록 하겠습니다.


HTTP 메소드는 서버에 요청을 보내는 방법으로, 서버에 임무를 부여하는 것이라고 생각하면 좋습니다.

서버는 클라이언트로 전달받은 요청에서 주어진 메소드에 해당하는 일을 수행합니다.


HTTP 메소드의 종류와 역할은 다음과 같습니다.


  • GET: URI 에 해당하는 정보의 전송요청을 보냄
  • HEAD: URI 에 해당하는 정보의 전송을 요청. GET 과는 다르게 Meta 정보만을 요청
  • POST: 서버가 처리할 수 있는 자료를 보냄
  • PUT: 자료를 전송하여 해당 URI 에 자료를 저장
  • DELETE: 해당 URI 의 자원/정보를 삭제
  • CONNECT: 프록시가 사용하고, 연결을 요청
  • OPTIONS: 요청한 URI 에 어떤 메소드가 가능한지 질문
  • TRACE: 이전까지 요청한 정보들의 목록을 요청
  • PATCH: 자원의 부분 교체


위의 메소드들을 요청/응답의 body 유무와 안전, 멱등, 캐시기능으로 요약하면 다음표와 같습니다.

(출처 - 위키백과 https://ko.wikipedia.org/wiki/HTTP)

HTTP 메소드RFC요청에 Body가 있음응답에 Body가 있음안전멱등(Idempotent)캐시 가능
GETRFC 7231아니오
HEADRFC 7231아니오아니오
POSTRFC 7231아니오아니오
PUTRFC 7231아니오아니오
DELETERFC 7231아니오아니오아니오
CONNECTRFC 7231아니오아니오아니오
OPTIONSRFC 7231선택 사항아니오
TRACERFC 7231아니오아니오
PATCHRFC 5789아니오아니오


위의 요청 헤더를 살펴봤을때 GET 방식을 예로 봤기 때문에 요청에 Body 가 포함되어 있지 않았습니다.

POST 방식을 이용하면 요청에 Body 값을 통하여 서버로 데이터를 전송합니다.


위의 HTTP 메소드를 이용하여 서버와 통신하는 것을 RESTful 이라고 합니다.

Restful 은 Representational State Transfer 의 약자로, 웹의 장접을 최대한 활용할 수 있는 아키텍쳐를 의미합니다.

Restful 에서는 주로 GET, POST, PUT, DELETE 의 메소드를 이용하여 서버와 통신합니다.


Restful 은 주로 데이터의 CRUD 를 위해 사용하며, 

Create(생성) 에는 POST 메소드를, 

Retrieve(읽기) 에는 GET 메소드를, 

Update(수정) 에는 PUT 메소드를,

Delete(삭제) 에는 DELETE 메소드를 이용합니다.


여기서 POST 와 PUT 은 모두 업데이트에 사용될 수 있는데, 수정에는 PUT 을 사용합니다.

이는 PUT 메소드를 사용하면 리소스의 위치를 저장할 수 있어 멱등하기 때문입니다.

* POST 와 PUT 의 차이점에 대해 자세히 알고싶으신 분들은 아래 링크의 1ambda 님의 블로그를 참고해주세요.

<POST vs PUT - 1ambda>


여기까지...


클라이언트가 서버에게 요청을 보내고, 서버가 그에 대한 응답을 하는 과정에 대해서 알아보았습니다.

요청을 보낼때 어떤 방식으로 요청을 보내는지 (HTTP 메소드),

그에 대한 응답이 어떤 결과를 포함하는지 (HTTP status) 등을 이해하고 Restful API 를 만드는데 도움이 되시길 바라겠습니다.


감사합니다.


**참고 자료 (항상 감사드립니다)

http://withbundo.blogspot.com/2017/07/http-10-http.html

https://blog.lael.be/post/61

https://www.joinc.co.kr/w/Site/Network_Programing/AdvancedComm/HTTP

https://ko.wikipedia.org/wiki/HTTP

https://1ambda.github.io/javascripts/rest-api-put-vs-post/


*이 포스팅이 도움이 되셨다면 다녀가셨다는 표시로 공감 부탁드릴게요! (로그인 하지 않으셔도 공감은 가능합니다 ㅎㅎ)

Comments