Network(HTTP, REST)

2023. 1. 14. 20:07개발/In-depth study

1) HTTP 프로토콜에 대한 이해
2) REST API


1) HTTP 프로토콜에 대한 이해
• TCP/IP 프로토콜

인터넷에서 표준으로 사용되는 네트워크 프로토콜이다. OSI 참조모델 3계층인 네트워크 계층인 IP를 비롯한 여러 프로토콜을 집합체를 묶어서 TCP/IP라고 부른다.

▫︎ 이 프로토콜은 데이터를 패킷으로 나누어서 보내는데, 각 패킷에는 목적지 주소(상대 IP)가 포함되어 있다. 여기서 TCP는 1개의 데이터를 여러개의 패킷으로 쪼개는 역할, IP는 쪼개진 패킷에 주소를 할당하고 전송하는 역할이다.
▫︎ TCP는 패킷이 제대로 전달되었는지 확인하므로 데이터 전달 신뢰성이 높고 정확하게 데이터를 송수신하는데 사용한다. 하지만 패킷 전달 확인 작업 또는 재송신 작업 때문에 TCP는 무거운 프로토콜이며, 반대로 정확성 대신 데이터 전달 속도를 중시하는 UDP라는 프로토콜이 존재한다. 

▫︎ OSI 참조 모델에 따라 TCP, IP, Ethernet 헤더로 감싸서 데이터를 전송한다.

 

• HTTP(HyperText Transfer Protocol) 프로토콜

텍스트 기반의 통신 규약으로 WWW에서 서버와 클라이언트 사이에 통신을 할 때 사용하는 네트워크이다. HTTP 프로토콜을 사용하면 인터넷에서 데이터를 주고받을 수 있다.(현재는 모든 형태 데이터 전송 가능)

HTTP 구조

▫︎ HTTP 메세지 형태
HTTP 메시지는 시작라인, 헤더, 바디로 나뉜다. 시작라인에는 요청 메서드와 http 버전, 헤더에는 요청데이터의 정보가 담긴 메타데이터가 포함(요청시간, 데이터 타입, 데이터 길이), 바디(본문)에는 요청하는 데이터가 무엇인지 포함된다.

HTTP 메시지 예시(요청메시지)

▫︎ HTTP 요청 메소드의 종류 및 응답 상태코드

요청 메서드는 종류가 여러개지만 주로 사용하는 메서드는 네가지이다. 자료를 요청, 생성, 수정, 삭제하는 내용을 담은 요청이다.

  • GET : 자료를 요청할 때 사용
  • POST : 자료의 생성을 요청할 때 사용
  • PUT : 자료의 수정을 요청할 때 사용
  • DELETE : 자료의 삭제를 요청할 때 사용

 

▫︎ HTTP 응답 상태 코드

응답 코드는 맨 앞자리에 따라 응답 종류를 구분할 수 있고 각 응답 상태마다 세분화된 코드가 존재한다.

  • 1XX (조건부 응답) : 요청을 받았으며 작업을 계속한다.
  • 2XX (성공) : 클라이언트가 요청한 동작을 수신하여 이해했고 승낙했으며 성공적으로 처리했음을 가리킨다.
  • 3XX (리다이렉션 완료) : 클라이언트는 요청을 마치기 위해 추가 동작을 취해야 한다.
  • 4XX (요청 오류) : 클라이언트에 오류가 있음을 나타낸다.
  • 5XX (서버 오류) : 서버가 유효한 요청을 명백하게 수행하지 못했음을 나타낸다.


▫︎ 
URL query

데이터베이스에 대한 사용자의 데이터 요청을 말한다. 그리고 Query string은 요청데이터 정보를 문자열로 만든 것이다.

 

- 물음표를 기준으로 시작하며 여러 조건을 &로 중첩해서 요청할 수 있다. 참고로 쿼리문을 만든다는 건 데이터를 요청할 수 있는 코드를 작성한다는 의미다. (ex. 3월달 개봉영화 목록 쿼리좀 짜봐)

Query string 예시

 

▫︎ Response(응답) 데이터의 형태

응답 데이터 형식은 크게 XML(eXtensible Markup Language), JSON(JavaScript Object Notation) 두가지로 나눌 수 있다. 과거에는 XML을 주로 사용했지만 최근에는 XML보다 장점이 많은 JSON을 더 많이 사용하고 있다.

 

- JSON 특징

  • 속성-값 또는 키-값처럼 딕셔너리 형태로 이루어진 데이터 포맷
  • 기계 뿐아니라 사람도 쉽게 읽을 수 있다.
  • 계층적인 데이터 구조를 가진다
  • 다양한 프로그래밍 언어에 의해 파싱될 수 있다
  • 사용하기 쉽다
  • 적은 메모리 공간을 사용하기 때문에 빠르다
  • 맵핑을 생성하지 않아도된다

 

  •  

 

2) REST API

• REST(Representational State Transfer)란?

소프트웨어 아키텍처의 한 형식으로 이름으로 자원을 구분하고 자원상태를 주고받는 것.

이름으로 자원을 구분한다는 의미는 대상을 구별할 수 있도록 이름을 짓는다는 뜻이다. 예를 들어 배달로 음식을 시키려면 메뉴이름을 말해야 주문이 가능하다. 그래야 음식점에서 어떤 음식을 요청하는지 알 수 있기 때문이다. 마찬가지로 서버에 존재하는 수많은 데이터(자원) 중에 내가 원하는 데이터를 요청하려면(ex. 자동차 이미지) 요청 대상의 이름이 필요한데, 단순히 숫자나 문자를 나열하는 대신 의미부여를 통해 직관적으로 쉽게 인지할 수 있는 이름을 사용하는 통신방식을 REST라고 하는 것이다. 만약 자동차 이미지의 이름이 "검정색 포르쉐2023년 모델"라면 이름이 "자동차사진1"인것 보다 대상의 구체적인 특징을 한눈에 알 수 있다. 이런 장점 때문에 네트워크 통신에서 REST방식을 사용하고 있다.

 

• REST 구성
▫︎ 자원 → URI /  행위 HTTP Method / 표현 (Representations)
▫︎ HTTP URI로 통해 자원을 명시하고, HTTP Method 행위를 통해 해당 자원(URI)에 대한 CRUD Operation을 적용한다.


• REST의 특징
▫︎ Uniform (유니폼 인터페이스)
HTTP 표준에만 따른다면, 안드로이드/IOS 플랫폼이든, 특정 언어나 기술에 종속되지 않고 모든 플랫폼에 사용할 수 있으며, URI로 지정한 리소스에 대한 조작이 가능한 아키텍처 스타일을 의미한다.

▫︎ Stateless (무상태성)
REST는 무상태성 성격을 가진다. 다시 말해 작업을 위한 상태정보를 따로 저장하고 관리하지 않는다. 세션 정보나 쿠키 정보를 별도로 저장하고 관리하지 않기 때문에 API 서버는 들어오는 요청만을 단순히 처리하면 된다. 그래서 서비스의 자유도가 높아지고 서버에서 불필요한 정보를 관리하지 않음으로써 구현이 단순해진다.

▫︎ Cacheable (캐시 가능)
REST의 가장 큰 특징 중 하나는 HTTP라는 기존 웹 표준을 그대로 사용하기 때문에, 웹에서 사용하는 기존 인프라를 그대로 활용할 수 있다. 따라서 HTTP가 가진 캐싱 기능이 적용할 수 있다. HTTP 프로토콜 표준에서 사용하는 Last-Modified 태그나 E-Tag를 이용하면 캐싱 구현이 가능하다.

▫︎ Self-descriptiveness (자체 표현 구조)
REST의 또 다른 큰 특징 중 하나는 REST API 메시지만 보고도 이를 쉽게 이해할 수 있는 자체 표현 구조로 되어 있다는 것이다.

▫︎ Client - Server 구조
REST 서버는 API 제공, 클라이언트는 사용자 인증이나 컨텍스트(세션, 로그인 정보) 등을 직접 관리하는 구조로 각각의 역할이 확실히 구분되기 때문에 클라이언트와 서버에서 개발해야 할 내용이 명확해지고 서로 간 의존성이 줄어들게 된다.

▫︎ 계층형 구조
REST 서버는 다중 계층으로 구성될 수 있으며 보안, 로드 밸런싱, 암호화 계층을 추가해 구조상의 유연성을 둘 수 있고 PROXY, 게이트웨이 같은 네트워크 기반의 중간매체를 사용할 수 있게 한다.


• REST의 장단점
▫︎ 장점
- HTTP 프로토콜의 인프라를 그대로 사용하므로 REST API 사용을 위한 별도의 인프라를 구출할 필요가 없다.

HTTP 프로토콜의 표준을 최대한 활용하여 여러 추가적인 장점을 함께 가져갈 수 있게 해준다.
HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용이 가능하다.
Hypermedia API의 기본을 충실히 지키면서 범용성을 보장한다.
REST API 메시지가 의도하는 바를 명확하게 나타내므로 의도하는 바를 쉽게 파악할 수 있다.
여러 가지 서비스 디자인에서 생길 수 있는 문제를 최소화한다.
서버와 클라이언트의 역할을 명확하게 분리한다.

▫︎ 단점
표준이 자체가 존재하지 않아 정의가 필요하다.

사용할 수 있는 메소드가 4가지밖에 없다.
HTTP Method 형태가 제한적이다.
브라우저를 통해 테스트할 일이 많은 서비스라면 쉽게 고칠 수 있는 URL보다 Header 정보의 값을 처리해야 하므로 전문성이 요구▫︎ 된다.
- 구형 브라우저에서 호환이 되지 않아 지원해주지 못하는 동작이 많다.(익스폴로어)

 

• REST API
REST 방식으로 구현한 API로서 각 요청이 어떤 내용을 담고 있는지 요청을 보고 그 자체로 추론 가능하다.(직관적)

REST API 작동 구조

<참고자료>
앨런 Swift문법 마스터 스쿨

그림으로 이해하는 네트워크 용어(https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=293277340)
https://vapor3965.tistory.com/33?category=975095

https://techblog.woowahan.com/2704/

http://www.incodom.kr/REST

https://velog.io/@surim014/HTTP%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

https://hazel-developer.tistory.com/145

https://www.karangoyal.cc/articles/how-get-query-parameter-url-django