질문, 피드백 등 모든 댓글 환영합니다.
HTTP는 데이터를 전송하는 방식 중 하나입니다.
인터넷에서 일어나는 대부분의 통신은 HTTP를 사용합니다.
텍스트, 사진, 영상, API, HTML까지 byte로 표현 가능한 모든 것을 HTTP를 사용하여 전송합니다.
HTTP는 클라이언트 - 서버 (Request - Response) 구조로 이루어져 있습니다.
클라이언트는 서버에 요청을 보내고 서버는 요청에 맞는 결과를 응답합니다. 이 때 전송할 데이터는 HTTP 메시지
에 담아 전송합니다.
HTTP 메시지는 start-line, header, message body로 구성되어 있으며 header와 message body 사이는 공백(CRLF)이 존재해야 합니다.
start line (시작 라인)
HTTP 요청 메시지에서 시작 라인(request line)은 서버가 수행해야 할 동작을 제어할 데이터가 포함됩니다.
requset line 구조는 HTTP method (공백) request-target (공백) HTTP-version으로 이루어집니다.
request-target은 절대 경로와 ?query
로 표현합니다.
ex) GET /members?hl=ko HTTP/1.1
HTTP 응답 메시지에서 시작 라인(response line) 구조는
HTTP-version (공백) status-code (공백) reason-phrase 로 이루어집니다.
status-code는 요청에 따른 서버의 수행 결과를 나타냅니다.
reason-phrase는 사람이 이해가능한 짧은 글로 나타냅니다.
ex) HTTP/1.1 200 OK
HTTP header (헤더)
헤더는 HTTP 전송에 필요한 부가 정보를 포함합니다.
메시지 바디의 내용, 크기, 압축, 인증, 브라우저 정보, 캐시 관리 정보 등 수많은 내용이 포함될 수 있습니다.
헤더의 구조는 field-name ":" OWS
field-value OWS
(OWS:띄어쓰기 허용)로 이루어집니다.
사용되는 헤더가 너무 많아 자세한 부분은 위키피디아 부탁드립니다.
자주 사용하는 헤더 위주로 간단히 정리해보겠습니다.
표현 헤더 / 요청, 응답 모두 사용
협상(content negotiation) 헤더 : 클라이언트가 선호하는 표현 요청(요청 시에 사용)
ex) Accept-Language: ko-KR,ko;q-0.9,en-US;q=0.8,en;q=0.7
ex) Accept: text/*, text/plain, text/plain;format=flowed
일반 정보 (요청에서 사용)
일반 정보 (응답에서 사용)
쿠키 정보
캐시 정보
검증 헤더
HTTP Message Body (메시지 바디)
HTTP 메시지 바디는 실제로 전송할 데이터를 포함합니다.
HTML, JSON, API, 문서, 이미지 등 byte로 표현 가능한 모든 데이터 전송이 가능합니다.
HTTP 요청과 응답은 무상태로 이루어집니다.
즉 클라이언트가 보낸 요청은 응답이 발생함에 따라 상태가 사라집니다
예를 들어 클라이언트가 HTTP 요청으로 @gudwn357
회원의 http0
을 요청하고 다시 HTTP 요청으로 http1
을 전달하게 된다면 서버는 이를 인지하지 못합니다.
첫 요청에 포함한 @gudwn357
에 대한 정보를 유지하지 않기 때문에 두 번째 요청에서도 이를 포함해야합니다.
때문에 클라이언트가 보다 많은 정보를 전송해야 한다는 단점이 있습니다.
서버가 상태를 유지하는 방향으로 프로토콜이 설계되어 있다면 클라이언트는 보다 적은 정보를 전송하면 되므로 편할 수 있겠지만 한 번 연결된 서버가 그 정보를 계속 유지해야 하므로 서버의 부담이 증가하고 또한 같은 서버로 계속 요청을 받아야 하므로 효율적이지 못합니다. 즉 무상태 프로토콜을 이용하면 요청 받는 서버의 제약이 없어지므로 응답 서버를 쉽게 바꿀 수 있어 서버 확장 시 용이합니다.
하지만 모든 정보를 무상태로 유지할 수는 없습니다. 로그인 등의 정보는 유지 되어야 하므로 이럴 때는 브라우저의 쿠키와 서버 세션 등을 활용하여 상태를 유지합니다.