HTTP 란?
HTTP(Hypertext Transfer Protocol)은 여러가지 정보 취득이나 발신에 사용하는 인터넷의 핵심 프로토콜이다.
HTTP의 메세지는 사람이 읽을 목적으로 전달되는 것이 아닌, HTTP 서버와 HTTP 클라이언트(브라우저)가 읽고 해석할 목적으로 전단된다.
즉, HTTP는 조회형 프로토콜로서 서버의 80번 포트에 설정된 소켓에서 HTTP 요청과 응답을 교환함으로써 통신을 수행한다. 이때 HTTP는 TCP 서비스를 이용한다.
HTTP 트랜잭션
HTTP에서 클라이언트와 서버 간의 요청과 응답과정을 알아보자.
HTTP에서 클라이언트에서 서버로 보내는 명령은 요청(request) 메세지에 들어있고, 요청에 대한 파일 내용, 그 외의 정보는 응답(response) 메세지에 들어있다.
HTTP는 stateless 프로토콜이기 때문에 클라이언트에 대한 정보는 서버에 저장되어있지 않다.

요청(request) 메세지 구조

1. Request-line
HTTP request 메세지의 첫 번째 줄은 request-line 이다.
request- line은 Method, URL, HTTP version 3개의 필드로 구성된다.
Method 필드는 Requst Type을 나타낸다. 아래는 주요 Method이다.
Method 이름 | 설명 |
OPTIONS | 대상 리소스에 대해 사용가한 HTTP 메서드를 확인한다. |
GET | 서버로부터 데이터를 가져온다. (Read) ex) 웹페이지 요청 |
HEAD | 데이터의 헤더를 가져온다. |
POST | 서버로 데이터 전송, 새로운 리소스 생성한다. (멱등성을 보장하지 않는다.) ex) 사용자 로그인, 댓글 작성 |
PUT | 서버에 리소스를 덮어쓰기(전체 수정)한다. (Update) ex) 사용자 프로필 업데이트 |
DELETE | 서버의 리소스를 삭제한다. (Delete) ex) 게시글 삭제 |
PATCH | 리소스를 부분적으로 업데이트한다. (Update) |
2. Request-header-line
HTTP request 메세지의 두 번째 줄은 Request-header-line이다. 이 라인은 없을 수도 있다.
각 헤더 라인은 서버로 추가 정보를 전송한다.
일부 헤더 이름:
requset header | 설명 |
Accept | 클라이언트가 받아들이는 문서 형식 지정 |
Accept-Language | 클라이언트가 받아들일 수 있는 언어 지정 |
Accept-Encoding | 클라이언트가 받아들이는 문자 코드의 부호화 방식 지정 |
Accept-Charset | 클라이언트가 선호하는 문자 인코딩 지정 |
DNT | Do Not Tracking의 줄임말. 추적을 금지함 |
Cookie | 쿠키 정보 설정 |
Host | 호스트 이름과 포트 번호 지정 |
Referer | 현재 요청된 페이지의 이전 웹 페이지 주소 유입 경로 파악 가능 |
User-Agent | 클라이언트 애플리케이션 정보(PC, Mobile 브라우저) 어떤 환경에서 주로 접속하는지 통계 어떤 종류의 환경에서 장애가 발생하는지 파악 가능 |
참고: https://en.wikipedia.org/wiki/List_of_HTTP_header_fields
응답(response) 메세지 구조

1. Status-line
status-line에는 HTTP 버전, 상태 코드, 상태 문구 3개의 필드가 있다.
상태 코드 필드는 요청의 상태를 나타낸다.
100 범위: 요청 수신 후 처리 중 상태 (잘 사용하지 않음)
200 범위: 요청이 성공적으로 처리됨
300 범위: 클라이언트를 또 다른 URL로 재지정(리다이렉션, 요청 완료를 위해 추가 행동이 필요한 상태)
400 범위: 클라이언트 사이트 오류
500 범위: 서버 사이트 오류
상태 코드와 상태 문구:
상태 | 상태 코드 | 상태 문구 | 설명 |
성공 | 200 | OK | 클라이언트의 요청이 정상 처리됨 |
201 | Creat | 새로운 리소스 생성 | |
204 | No Content | 요청은 성공했지만, 응답 데이터가 없음 ex) 저장, 작성 버튼 클릭 |
|
206 | Patial Content | 정보의 일부를 응답함 | |
리다이렉션 | 301 | Moved Permanently | 요청된 자원은 다른 URL로 이동함 ( 요청 메서드가 GET으로 변하고 본문이 제거될 수 있다. ) |
304 | Not modified | 요청한 리소스는 수정되지 않음 캐시 목적으로 사용. 클라이언트가 캐시된 데이터를 조회하도록 유도 |
|
308 | Permanent Redirect | 리다이렉트시 요청 메서드와 본문이 유지된다. | |
클라이언트 오류 |
400 | Bad Request | 정확하지 않은 요청 ex) GET 메소드로 만들어진 API인데 POST로 보낸경우 |
401 | Unauthorized | 인증되지 않은 리소스임 | |
404 | Not Found | 요청된 URI(리소스)가 서버 상에 없음 | |
408 | Requst Timeout | 요청이 타임아웃 되었다. | |
서버 오류 | 500 | Internal Server Error | 서버 내부에 문제 발생 |
501 | Not Implemented | 클라이언트가 요청한 기능을 지원하지 않음 | |
503 | Service Unavailable | 서비스 이용 불가 |
2. Response-header-line
HTTP response 메세지의 두 번째 줄은 Response-header-line이다. 이 라인은 없을 수도 있다.
각 헤더 라인은 클라이언트에게 추가 정보를 전송한다.
일부 헤더 이름:
response header | 설명 |
Server | 요청을 처리하는 ORIGIN 서버의 Software 정보 |
Date | HTTP 요청이 발생한 날짜와 시간 |
Location | 생성된 리소스 URI, 리다이렉트 주소 1) 응답코드 3xx와 함께 응답되면 리다이렉트 주소 2) 응답코드 201(Created)와 함께 응답되면 생성된 리소스의 URI |
Allow | 허용 가능한 HTTP Method 405 (Method Not Allowed)와 함께 응답된다. |
Retry-After | 다음 요청까지 대기 해야하는 시간 503 (Service Unavailable)와 함께 서비스가 언제까지 사용이 불가한지 알려준다. (초단위/날짜 단위) |
Set-Cookie | 클라이언트의 웹 브라우저에 쿠키를 설정 보안에 민감한 개인정보 등은 저장하지 않는다. |
Last-Modified | 웹 페이지의 최종 갱신일 |
ETag | 웹 페이지 식별을 위한 유일한 정보를 지정 |
HTTP의 연결
HTTP 1.0은 비영속적 연결을 사용하지만, HTTP 1.1은 영속적 연결을 기본으로 규정한다.
1. 비영속적 연결(nonpersistent connection)
비영속적 연결에서는 각 요청/응답에 대해 하나의 TCP 연결이 만들어진다.
동작단계:
① 클라이언트가 TCP 연결을 열고 요청을 보낸다
② 서버는 응답을 보내고 연결을 닫는다.
③ 클라이언트는 end-of-file 표시가 나타날 때까지 데이터를 읽고 연결을 닫는다.
장점:
서버 자원을 효율적으로 사용할 수 있다.
단점:
요청이 추가적으로 오게되면 연결(3 way handshake)을 새로 해야하기 때문에 요청에 대한 응답 시간이 증가한다.
2. 영속적 연결(persistent connection)
서버는 응답을 전송한 후, 이후의 요청을 위해 연결을 열어놓은 상태로 유지한다.서버는 클라이언트의 요청에 따라 혹은 타임아웃이 될 경우 닫힌다.
서버는 보통 각 응답에 데이터의 길이를 송신한다. 하지만 문서가 동적으로 생성되는 경우 데이터의 길이를 알 수 없는 경우가 생긴다. 이 경우 서버는 클라이언트에게 길이를 알 수 없다는 것을 알리고, 데이터 전송 후 연결을 끊음으로서 클라이언트에게 데이터의 끝을 알린다.
'TIL > 네트워크' 카테고리의 다른 글
[TIL] AWS 인프라 구성 및 모니터링 (0) | 2025.06.28 |
---|---|
[TIL] Fetch를 활용한 웹 통신(+ GET & POST) (1) | 2024.11.04 |