# HTTP

# HTTP 정의

HTTP = HyperText Transfer Protocol

  • 웹브라우저, 서버, 웹 애플리케이션이 HTML 파일을 주고받을 수 있도록 하는 소통 언어이자 방식이다.
  • Protocal (P in HTTP) is a communication rule between Client(browser) & Server.
  • 서로 다른 시스템들 사이에서 통신을 주고받게 하는 가장 기본적인 프로토콜
  • 서버에서 브라우저로 데이터를 전송하는 용도로 가장 많이 사용

# HyperText

HTML을 뜻한다. HTML은 문서와 문서가 링크로 연결되도록 하는 태그로 구성된 언어인데, 웹페이지를 만들기 위해서 웹 브라우저 위에서 동작하는 언어를 뜻한다.

# Transfer

웹사이트를 다른 컴퓨터에 전송할 수 있으며 보내는 주체와 받는 주체가 있다.

# Protocol

프로토콜은 협약, 통신 규약이라는 의미다. 물리적으로 떨어진 컴퓨터 사이에서 통신하기 위해서는 같은 방법으로 통신해야 하는데, 프로토콜은 어떻게 HTML을 주고 받을지에 대한 약속이다.

# HTTP의 특징

# Stateless

HTTP는 상태를 계속 유지하지 않는 스테이트리스 프로토콜이다. HTTP 프로토콜 독자적으로 리퀘스트와 리스폰스를 교환하는 동안에 상태를 관리하지 않는다. 결국 HTTP 프로토콜 레벨에서는 이전에 보냈던 리퀘스트나 이미 돌려준 리스폰스에 대해서는 전혀 기억하지 않는다.

즉 HTTP 통신은 독립적이기 때문에 과거의 통신에 대한 내용을 전혀 알지 못 하며, 매 통신마다 필요한 정보를 담아서 요청을 보내야 한다.

이렇게 간단하게 설계된 이유는 많은 데이터를 매우 빠르고 확실하게 처리하는 범위성 scalability을 확보하기 위해서다.

그러나 웹이 진화하면서 스테이트리스 특성만으로는 처리하기 어려운 일이 증가하게 되었다. 예를 들어 로그인 한 유저의 상태를 유지해야 하는데, 이를 위해 쿠키가 도입되었다. 쿠키로 인해 Stateless한 HTTP에서도 상태를 계속 관리할 수 있게 되었다.

# Request & Response

TCP/IP에 있는 다른 많은 프로토콜과 마찬가지로 HTTP는 클라이언트와 서버 간 통신을 한다. 이 때 통신은 리퀘스트와 리스폰스를 교환하여 성립한다. 서버 측은 리퀘스트를 받지 않고선 리스폰스를 송신하지 않는다.

HTTP transaction 출처 (opens new window)

# 리퀘스트

리퀘스트 메시지는 메소드, URI, 프로토콜 버전, 옵션 리퀘스트 헤더 필드, 엔티티로 구성

# 리스폰스

리스폰스 메시지는 프로토콜 버전, 상태 코드, 상태 코드를 설명한 프레이즈, 옵션의 리스폰스 헤더 필드와 바디로 구성

HTTP Response and Request 출처 (opens new window)

# 리퀘스트 URI로 리소스를 식별

HTTP는 URI를 사용하여 인터넷 상의 리소스를 지정한다. 클라이언트는 리소스를 호출할 때마다 리퀘스트를 송신할 때 리퀘스트 안에 URI를 포함해야 한다.

# HTTP 상태 코드

클래스 설명
1xx Informational 리퀘스트를 받아들여 처리 중
2xx Success 리퀘스트를 정상적으로 처리했음
3xx Redirection 리퀘스트를 완료하기 위해서 추가 동작이 필요
4xx Client Error 서버는 리퀘스트 이해 불가능
5xx Server Error 서버는 리퀘스트 처리 실패

# 200 OK

클라이언트가 보낸 리퀘스트를 서버가 정상 처리하였음

# 204 No Control

서버가 리퀘스트를 받아서 처리하는 데는 성공했지만 리스폰스에 엔티티 바디를 포함하지 않음. 클라이언트에서 서버에 정보를 보내는 것에 족하고 클라이언트에 대해서 새로운 정보를 보낼 필요가 없는 경우에 사용

# 206 Partial Content

Range에 의해 범위가 지정된 리퀘스트에 의해서 서버가 부분적인 GET 리퀘스트를 받았음.

# 301 Moved Permanently

리퀘스트된 리소스에는 새로운 URI가 부여되어 있기 때문에 이후에는 그 리소스를 참조하는 URI를 사용해야 한다는 것을 말함.

# 302 Found

리퀘스트된 리소스에는 새로운 URI가 할당되어 있기 때문에, 그 URI를 참조해 주길 바란다는 의미 301과 비슷하지만 302의 경우에는 영구적인 것이 아니라 일시적인 이동을 말함.

# 303 See Other

리퀘스트에 대한 리소스는 다른 URI에 있기 때문에 GET 메소드를 사용해서 얻어야 된다는 것을 말함. 302와 비슷하지만 리다이렉트 장소를 GET 메소드로 얻어야 한다고 명확하게 되어 있는 점이 다르다.

# 304 Not Modified

클라이언트가 조건부 리퀘스트를 했을 때 리소스에 대한 액세스는 허락하지만, 조건이 충족되지 않음을 표시. 304를 되돌려줄 때에는 리스폰스 바디에 어떤 것도 포함되면 안 됨.

# 307 Temporary Redirect

302 Found와 같은 의미. 하지만 302의 경우 POST로 부터 GET으로 치환이 금지되어 있어도 구현상 그렇게 되어 있음. 하지만 307에서는 브라우저 사양에 따라 POST에서 GET으로 치환하지 않음.

# 400 Bad Request

리퀘스트 구문이 잘못되었음. 리퀘스트 내용을 재검토하고 재송신해야 함.

# 401 Unauthorized

송신한 리퀘스트에 HTTP 인증 정보가 필요하다는 뜻.

# 403 Forbidden

리퀘스트된 리소스의 액세스가 거부되었음.

# 404 Not Found

리퀘스트한 리소스가 서버상에 없음.

# 500 Internal Server Error

서버에서 리퀘스트를 처리하는 도중에 에러가 발생하였음.

# 503 Service Unavailable

일시적으로 서버가 과부하 상태이거나 점검 중이기 때문에 현재 리퀘스트를 처리할 수 없음

Last Updated: a year ago