Computer Science/Network

[Network] REST API와 Http Protocal

ooeunz 2019. 10. 9. 21:01
반응형

REST API

서버에 요청을 보낼 때는 주소를 통해 요청의 내용을 표현한다. 주소가 /index.html이면 서버에 index.html을 보내달라는 뜻인 것처럼 말이다. 하지만 요청이 항상 html일 필요는 없다. 예를 들어 /login이라는 주소를 통해 html을 요청하는 대신 세션 저장이라는 동작을 취할 수 있다. 이렇게 요청이 주소를 통해 들어오므로 서버가 이해하기 쉬운 주소를 사용하는 것이 좋다. 이기서 이번 포스팅의 주제인 REST API가 등장한다.

 

REST API란 REpresentational State Transfer의 약자이다. 네트워크 구조의 한 형식으로 서버의 자원을 정의하고, 자원에 대한 주소를 지정하는 방법을 가리킨다. 주소는 의미를 명확히 전달하기 위해 명사로 구성된다. 예를 들어 /user이면 사용자 정보에 관련된 자원을 요청하는 것이고, /post라면 게시글에 관련된 자원을 요청하는 것이라고 추측할 수 있다.

 

이러한 REST API를 사용하게 된 이유는 프론트 엔드와 백엔드의 분리가 되었기 때문이다. 과거에는 전통 MVC형태의 프로젝트에서는 백엔드와 프론트엔드의 경계가 명확하지 않았다. 하지만 프론트 엔드와 백엔드가 분리되기 시작하면서 자원(resource) 형태로 데이터(json/xml과 같은)를 받아오게 되었다. 이러한 데이터를 제공하는 것을 API(Application Programming Interface)라고 하고 전통 MVC 방식과 다르게 VIEW 영역이 포함되지 않은 서버 사이드 개발을 진행하게 되었다. 즉 VIEW를 제공하는 대신 데이터를 제공하게 되는 것이다.

 

REST API는 주소 외에도 HTTP 요청 메서드라는 것을 사용한다.

  • GET : 서버 자원을 가져오고자 할 때 사용한다. 요청의 본문(body)에 데이터를 넣지 않는다. 데이터를 서버로 보내야 한다면 querystring을 사용한다.
  • POST : 서버에 자원을 새로 등록하고자 할 때 사용한다. 요청의 본문에 새로 등록할 데이터를 넣어서 보낸다.
  • PUT : 서버의 자원을  요청에 들어 있는 자원으로 치환하고자 할 때 사용한다. 요청의 본문에 치환할 데이터를 넣어 보낸다.
  • PATCH : 서버 자원이 일부만 수정하고자 할 때 사용한다. 요청의 본문에 일부 수정할 데이터를 넣어 보낸다.
  • DELETE : 서버의 자원을 삭제하고자 할 때 사용한다.

(아래에서 좀 더 자세히 다루겠다)

 

주소 하나에 요청 메서드를 여러 개 가질 수 있다. 예를 들어 GET 메서드의 /user 주소로 요청을 보내면 사용자 정보를 가져오는 요청이라는 것을 알 수 있고, POST 메서드의 /user 주소로 요청을 보내면 새로운 사용자를 등록하려 한다는 것을 알 수 있다.

 

그리고 HTTP 프로토콜을 사용하면 클라이언트가 누구든 상관없이 사용할 수 있다. 안드로이드, IOS, 웹이 모두 같은 주소로 요청을 보낼 수 있다. 즉, 서버와 클라이언트가 분리되어 있다는 뜻이다. 이렇게 서버와 클라이언트가 분리되어 있다면 이후에 서버를 확장하거나 유지보수 측면에서 많은 부분 자유로워질 수 있다.

 

또한 REST API를 따르는 서버를 RESTful하다고 표현한다.

 

 

인터넷 통신 프로토콜에는 TCP/IP, FTP, SMTP, HTTP 등 수없이 많은 종류의 프로토콜이 있다. 그 중 HTTP(HyperText Transfer Protocol)은 가장 대표적인 웹 브라우저 통신에 관한 프로토콜이다.

 

HTTP 요청과 응답 구조

HTTP는 Connectless 방식으로 작동한다. 서버에 연결하고, 요청해서 응답을 받으면 연결을 끊어버린다. 

이러한 모델을 서버 / 클라이언트 모델이라고 한다. 클라이언트에서 요청(request)를 보내면 서버는 요청을 처리해서 응답(response)한다. 요청과 응답 메세지의 형태는 아래와 같다.

 

 

기본적으로http메서드와 접근할 주소 정보 그리고 서버에 전달할 데이터인 form parameter로 구성되어 있다. 이정 대표적인 것이 get메서드와 post메서드이다.

 

Get 방식

  • 전송할 파라미터 값들을 URL 정보에 붙여서 같이 전송한다.
  • 때문에 데이터 크기의 제약이 있고, URL을 통해 모든 파라미터가 노출되기 때문에 보안에 취약하다. 하지만 post방식에 비해 속도가 빠르다.

Post 방식

  • 파라미터 값들을 요청 메세지의 본문(body)에 담아서 전송한다.
  • 때문에 get 방식과 다르게 데이터 크기의 제약이 없고, GET 방식의 파라미터와 같이 직접적으로 데이터가 노출되지 않는다. 그리고 get 방식에 비해 속도가 느리다.

따라서 일반적으로 GET방식은 서버로 부터 데이터를 요청할 때 사용하고, POST 방식은 서버의 값이나 상태를 바꾸기 위해 사용된다.

 

 

POST와 PUT 방식

POST와 PUT의 가장 큰 차이점은 PUT 메서드는 자원의 식별자를 이미 알고있는 상태여야 한다는 것이다.

PUT 메서드는 식별자의 자원을 HTTP 메세지로 함께 넘어온 엔티티로 교체한다.

 

만약 식별자와 일치하는 자원이 없다면, 넘어온 식별자를 ID로 하는 새 자원을 생성하고 201(created) 응답을 하게 된다.

새 자원을 생성한다는 점에서 POST와 같다고 생각할 수 있지만 POST는 ‘새로운 자원’을 생성해 내는 것이고, PUT은 HTTP 메세지와 함께 넘어온 식별자의 자원을 생성하는 것이다.

 

가령 같은 HTTP 메서드가 두번 날아오게 된다면 POST는 같은 게시물을 두번 만들게 되지만 PUT은 첫번째 요청에 생성된 자원을 교체하게 된다.

반응형