Spring boot

[HTTP] http 기본

모든 것이 HTTP

 

대부분의 웹개발에서 http를 기본으로 사용한다.

HTTP는 Hyper Text Transfer Protocol의 줄임말이지만, 현재 텍스트 이외에 이미지, JSON 등 거의 모든 형태의 데이터도 전송할 수 있다.

직접 TCP 연결을 맺어 통신하기보다 서버간에서도 HTTP로 통신하는 것이 대부분이다.

 

HTTP는 1.1버전이 가장 중요하다. 현재 HTTP2와 HTTP3 버전이 나왔지만 성능 개선의 정도이며

주요 기능은 1.1버전에서 추가되었다.

최근 1.1버전은 RFC7230~7235이므로 자료를 찾을 때 주의하자

 

HTTP는 1.1과 2에서는 TCP 프로토콜을 사용하나, 3버전부터는 성능 개선을 위해 UDP로 변경되었다.

 

HTTP는 클라이언트-서버 구조로, stateless와 비연결성을 지향한다.

아래에서 메세지 구조와 함께 더 알아보자.

 


클라이언트 서버 구조

 

클라이언트는 서버에 요청을 보내고, 응답을 대기한다.

서버는 요청에 대한 결과를 만들어 응답한다.

 

초기에는 서버와 클라이언트가 분리되지 않았었다.

둘을 분리함으로써 클라이언트는 UI를 그리는 것에 집중하여 발전할 수 있게 되고, 

서버는 트래픽 등에 집중할 수 있게 되었다.

 


Stateful, Stateless

 

Stateless란 서버가 클라이언트의 상태를 보존하지 않음을 뜻한다.

 

고객과 점원이 노트북에 관해 이야기를 나누다, 고객이 구매하겠다고 한 경우 stateful하다고 할 수 있다.

어떤 것을 구매할 것인지 말하지 않았기 때문이다. 만약 점원이 바뀐다면 점원은 고객이 어떤 것을 구매하는지 모른다.

stateless는 노트북을 구매하겠다고 모든 데이터를 밝히는 것을 뜻한다.

 

stateless하게 되면, 서버의 확장성이 높아진다.

이벤트 등 트레픽이 몰리는 상황에서 추가 서버를 증설(스케일 아웃)할 수 있게된다.

또한 통신하던 한 서버가 죽어도, 다른 서버와 통신을 이어갈 수 있다.

 

그러나 로그인 등 상태를 보존해야 하는 경우도 있다.

이런 경우 브라우저 쿠키와 서버 세션을 사용해 상태를 유지한다.

기본적으로 statless하게 설계하되, 꼭 필요한 경우만 상태 유지하자.

 


비 연결성(connectionless)

 

클라이언트와 서버의 TCP 연결을 끊지 않고 계속 유지한다면 

실제 통신은 많이 일어나지 않더라고 서버의 자원을 많이 사용하게 되므로

http는 기본적으로 비연결성을 지향한다.

 

그러나 통신을 할 때마다 TCP 3way handshake를 진행하는 것도 시간이 추가된다.

웹 브라우저 사이트를 요청하면 html과 더불어 css, 자바스크립트, 이미지 등이 연속적으로 요청된다.

이때마다 연결을 맺고 끊는다면 자원과 시간의 낭비가 발생한다.

 

지금은 일정 시간동안 연결을 유지하고 끊는 persistent connections형태이다.

http3에서는 연결 자체를 하지 않는 UDP방식으로 최적화가 진행되었다.

 


HTTP 메시지

 

출처 : https://deepwelloper.tistory.com/98

http 메세지 구조는 위와 같다.

request와 response 둘 다 이 구조를 사용한다.

 

 

Start Line

먼저 request를 자세히 알아보자면

start line은 request-line라고도 부르며 아래와 같은 형태이다.

start line(request-line) = 메소드 SP(공백이라는 뜻) 타겟 SP http버전 CRLF

request 메소드는 GET, POST, PUT, DELETE 등이 있는데, GET은 리소스 조회/ POST는 요청 내역 처리를 의미한다.

 

response의 경우

start line(status-line) = HTTP버전 SP 상태코드 SP 이유문구

상태코드는 200은 성공, 400은 클라이언트 요청오류, 500은 서버 오류를 뜻한다.

이유문구는 사람이 이해하기 쉽도록 나타낸 짧은 상태 메세지이다.

HTTP/1.1 200 OK 이렇게 사용된다.

 

 

HTTP 헤더

header-field = field-name: OWS(띄어쓰기 허용이라는 뜻) field-value OWS

헤더에는 http전송에 필요한 모든 부가정보가 포함된다.

List of HTTP header fields - Wikipedia

 

List of HTTP header fields - Wikipedia

Wikipedia list article HTTP header fields are a list of linefeed-separated HTTP data being sent and received by both the client program and server on every HTTP request. These headers are usually invisible to the end-user and are only visible to the backen

en.wikipedia.org

 

 

HTTP 바디

실제 전송할 데이터가 포함된다.

이미지, 문서, JSON등 byte로 표현가능한 모든 데이터가 전송가능하다.

'Spring boot' 카테고리의 다른 글

[HTTP] HTTP 메서드 활용  (0) 2021.10.27
[HTTP] HTTP 메서드  (0) 2021.10.13
[HTTP] URI와 웹브라우저 요청 흐름  (0) 2021.09.29
[HTTP] 인터넷 네트워크  (2) 2021.09.22
[기본] 빈 스코프  (0) 2021.08.24