본문 바로가기

FrontEnd+

협업을 위한 HTTP 기초

 

 

데이터를 주고받기 위해

다 같이 약속 🤙

월드와이드웹(www) 상에서 컴퓨터와 컴퓨터 간에 데이터를 주고받기 위해 전 세계적으로 약속한 방식이 있다. 이 과정은 다음과 같이 요약할 수 있다.

1. 클라이언트가 'HTTP 요청메세지'를 만든다.
2. Socket 라이브러리를 통해 IP와 포트를 연결한다.
3. 요청메세지에 제어정보를 더해 '패킷'이라는 단위로 포장을 마친다.
4. LAN 카드를 통해 패킷을 내보내, 지정한 IP 주소 및 포트에 패킷을 전달한다.
5. 패킷을 받은 서버는 요청 패킷 포장을 풀어 요청 메세지를 확인하고, 'HTTP 응답메세지'를 만든다.
6. 서버에서 클라이언트로 응답 패킷을 보낸다.
7. 응답 패킷을 받은 클라이언트는 포장을 풀고 응답 메세지를 확인한다.

 

이러한 약속을 네 가지로 계층화시켜 구분지은 것을 인터넷 프로토콜 스택(Internet Protocol Stack)이라고 부른다. 

1 애플리케이션 계층(Application Layer)
HTTP, FTP, DNS
전송 데이터
2 전송 계층(Transport Layer)
TCP, UDP
출발지 포트, 도착지 포트, 전송순서, 검증 정보, ...
3 인터넷 계층 (Internet Layer)
IPv4, IPv6
출발지 IP, 도착지 IP, ... 
4 네트워크 인터페이스 계층(Network Interface Layer)
LAN 카드, LAN 드라이버
이더넷 프레임 (mac 주소, ...)

 

HTTP 도 약속의 일환 🤙

인터넷 프로토콜 스택에서 가장 상위 계층인 애플리케이션 계층(번역해서 응용 계층이라고도 부른다.)은 어떤 방식으로 자원에 접근할 것인가 하는 약속이다. 이 글에서는 이 중 HTTP 라는 약속에 대해서 살펴보려고 한다.

HTTP는 '하이퍼텍스트 통신 규약(HyperText Transfer Protocol)'을 의미한다. 여기서 하이퍼텍스트(HyperText)란, 사용자가 문서 내에서 링크를 통해 관련된 다른 문서로 바로 접근할 수 있는 텍스트를 일컫는다. 하이퍼텍스트를 전송하려던 초기 목적에서 시작하여, 현재는 HTML, CSS, JS, 이미지 등 매우 다양한 데이터를 전송하는 데 사용되고 있다. 참고로 HTTP의 기본 포트는 80, HTTPS의 기본 포트는 443이다.

- 1991년, HTTP 0.9
- 1996년, HTTP 1.0
- 1997년, HTTP 1.1  - RFC2068
- 1999년, HTTP 1.1  - RFC2616 (~폐기)
- 2014년, HTTP 1.1  - RFC7230~7235
- 2015년, HTTP 2.0

 

 

HTTP 의 특징

무상태성 (Stateless)

서버가 클라이언트의 상태를 보존하지 않는다. 상태가 없기 때문에 서버를 확장해도 혹은, 변경해도 문제가 없긴 하지만, 클라이언트가 서버에게 데이터를 일일이 전송해주어야 한다.

비연결성 (Connectionless)

요청을 주고받은 후에는 연결을 끊어버린다. 각 연결당 서버 자원 사용량을 적게 유지해서 효율적으로 운영할 수 있지만, 매번 새로 연결하기 위해 TCP/IP 3 handshake를 해야 한다. (keep-alive, persistent connections로 보완)

 

 

HTTP 주요 메서드

GET

서버에 있는 데이터를 단순하게 가져올 때 사용한다. 보통 body를 전달하지 않고, 쿼리스트링으로 보낸다.
성공 시 주로 200 상태코드가 반환된다.

POST

서버에 있는 데이터를 새로 등록하거나 다양한 처리를 할 때 사용한다. body를 통해 데이터를 전달한다. 
성공 시 주로 201 상태코드가 반환된다.

PUT

서버에 있는 데이터를 덮어씌울 때 사용한다. 보통 POST 보다 더 구체적인 URI에 요청을 보낸다.
성공 시 주로 201 상태코드가 반환된다.

PATCH

서버에 있는 데이터를 부분적으로 변경할 때 사용한다.

DELETE

서버에 있는 데이터를 삭제할 때 사용한다.
성공 시 주로 204 상태코드가 반환된다.

 

HTTP 상태코드

100번대 - 정보

요청을 처리하는데 지금까지 문제가 없다는 것을 알려준다. 사용 빈도가 높지 않다.

100 Continue
101 Switching Protocol
103 Early Hints

200번대 - 성공

요청을 정상적으로 처리했다는 것을 알려준다.

200 OK
201 Created
202 Accepted
204 No Content

300번대 - 리다이렉션

리소스가 옮겨졌다는 것을 알려준다. 요청을 완료하기 위해 클라이언트의 추가 조치가 필요하다.

301 Moved Permanatly (메서드가 GET 으로 변경되면서 본문 내용이 날아갈 수 있다.)
302 Found(메서드가 GET 으로 변경되면서 본문 내용이 날아갈 수 있다.)
303 See Other
304
Not Modified
307 Temporary Redirect (302과 기능은 같지만 본문은 항상 유지된다.)
308 Permanent Redirect (301과 기능은 같지만 본문은 항상 유지된다.)

400번대 - 클라이언트 에러

클라이언트가 무언가 잘못된 요청을 했다는 것을 알려준다.

400 Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
405 Method Not Allowed

500-505 서버 에러

서버 내부에 무언가 문제가 있다는 것을 알려준다.

500 Internal Server Error
501 Not Implemented
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout

 

 

HTTP 헤더

HTTP 전송에 필요한 부가적인 정보를 헤더에 담는다. 헤더의 field name은 대소문자를 구분하지 않는다.

표현 헤더 (Representation Header)

표현 헤더는 Request, Response 모두에서 사용한다.

Content-Type: 데이터 형식 (e.g. application/json)
Content-Encoding: 데이터 압축방식 (e.g. gzip)
Content-Length: 데이터의 바이트 수 (e.g. 30)
Content-Language: 데이터의 언어 (e.g. ko-KR)

요청 헤더 (Request Header)

Request에서만 쓰이는 일반적인 정보를 담고있는 헤더는 다음과 같다.

Host: 가상호스팅으로 하나의 서버가 여러 도메인을 처리할 경우, 호스트를 구분하기 위한 정보
User-Agent: 웹 브라우저 정보
From: 유저 에이전트의 이메일 정보
Referer: 이전 웹페이지의 주소 (referrer의 오타인데 명세에 referer로 써있어서 고치지 못하고 있음)
Authorization: 클라이언트의 인증 정보 (e.g. Bearer 7cjxkjdekf...)
Cookie: 저장한 쿠키를 서버로 전달

* Cookie는 개발자가 작성하지 않아도 자동으로 요청 헤더에 들어가, 모든 요청에서 서버로 전달된다. 그럴 필요가 없는 경우라면, 웹스토리지 (localStorage, sessionStorage)를 활용하면 된다.

컨텐츠 협상 헤더 또한 Request 에서만 사용한다. 클라이언트가 선호하는 표현을 서버에 요청하는 헤더이다. 서버는 컨텐츠 협상 헤더를 참고하여 최대한 이를 맞춰준다. 가중치는 1이 기본 값으로, 생략하면 1의 값을 갖는다.

Accept: 클라이언트가 선호하는 미디어 타입 (e.g. text/*;q=0.3, text/html;q=0.7, */*;q=0.5)
Accept-Charset: 클라이언트가 선호하는 문자 인코딩
Accept-Encoding: 클라이언트가 선호하는 압축 인코딩
Accept-Language: 클라이언트가 선호하는 언어 (e.g. ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7)

응답 헤더 (Response Header)

Response에서만 쓰이는 일반적인 정보를 담고있는 헤더는 다음과 같다.

Server: 요청을 처리하는 Origin 서버의 정보 (e.g. nginx)
Allow: 서버에서 허용하는 HTTP 메서드 (e.g. GET, HEAD, PUT)
Date: 메세지가 발생한 시간 (e.g. Mon, 14 Jun 2021 21:41:31 GMT)
Location: 요청에 의해 생성된 리소스의 URI (201 Create), 또는 리디렉션할  Location 위치(3xx Redirection, 자동으로 이동됨)
Allow: 서버에서 허용하는 HTTP 메서드 (e.g. GET, HEAD, PUT)
WWW-Authenticate: 리소스 접근에 필요한 인증방법 정보 (401 Unauthorized)