반응형
HTTP란?
웹 기술을 다루는 것중 가장 중요한건 브라우저다. 하지만 브라우저는 항상 HTML을 가지고 있지 않다.
따라서 서버와 브라우저간의 통신이 중요하다. 그러나 이 둘 사이 거리가 얼마나 되는지, 어떻게 통신해야하는지는 미지수이다.
통신을 하기 위한 많은 방법중 하나가 바로 HTTP이다.
핵심 기본 요소
1. URL
- 역할: URL은 웹 리소스를 식별하는 주소로서 클라이언트가 서버에 어떤 리소스를 요청할지를 명시하는 핵심적인 부분.
- 구조:
- 스키마(Scheme)
사용되는 프로토콜을 정의. https는 HTTP에 SSL/TLS로 암호화된 버전을 의미- EX) http://, https://
- 호스트(Host)
요청할 서버의 도메인 이름이나 IP 주소.- EX) www.example.com.
- 포트(Port)
서버가 사용하는 네트워크 포트를 명시함. HTTP의 기본 포트는 80, HTTPS의 기본 포트는 443이지만 명시적으로 다른 포트를 지정.- EX) :8080.
- 경로(Path):
서버 내에서 요청한 리소스의 경로를 나타냄.- EX) /images/logo.png.
- 쿼리 파라미터(Query Parameters): ?로 시작하는 쿼리 문자열로, 리소스에 전달할 추가 데이터를 포함. 여러 개의 쿼리 파라미터는 &로 구분됨.
- EX) ?id=123&name=test.
- 프래그먼트(Fragment): 리소스 내에서 특정 위치를 지정할 때 사용. 보통 웹페이지에서 앵커(#)로 구분되는 부분을 가리킴.
- EX) #section1.
- 스키마(Scheme)
예시:
https://www.example.com:8080/path/to/resource?id=123&name=test#section1
2. Header
- 역할: 헤더는 클라이언트와 서버 간의 메타데이터를 포함하며 요청이나 응답에 대한 추가 정보를 제공하고, 콘텐츠 형식, 인코딩, 쿠키, 인증 등에 대한 정보를 전달함.
- 종류:
- 요청 헤더(Request Headers): 클라이언트가 서버에 보내는 정보. 서버가 요청을 이해하고 처리하는 데 필요한 힌트를 제공.
- Host: 요청이 전송될 호스트. 가상 호스팅을 위한 필수 헤더.
- User-Agent: 클라이언트의 소프트웨어(브라우저, 운영체제 등)에 대한 정보.
- Accept: 클라이언트가 허용하는 콘텐츠 유형. 예: text/html, application/json.
- Authorization: 인증을 위해 사용하는 헤더로, JWT 토큰이나 Basic Auth 정보가 포함됨.
- 응답 헤더(Response Headers): 서버가 클라이언트에게 응답할 때 추가 정보를 제공함.
- Content-Type: 응답 데이터의 콘텐츠 형식. 예: text/html, application/json.
- Set-Cookie: 서버가 클라이언트에게 쿠키를 설정하는 데 사용됨.
- Cache-Control: 캐싱을 제어하는 헤더로, 데이터의 저장 및 만료 규칙을 지정.
- 엔티티 헤더(Entity Headers): 본문의 정보를 나타내는 헤더로, 요청과 응답 모두에 사용될 수 있음.
- Content-Length: 본문의 크기(바이트 단위).
- Content-Encoding: 본문의 인코딩 방식(gzip, deflate 등).
- 요청 헤더(Request Headers): 클라이언트가 서버에 보내는 정보. 서버가 요청을 이해하고 처리하는 데 필요한 힌트를 제공.
3. Body
- 역할: HTTP 본문은 요청이나 응답에서 실제 데이터를 담고 있는 부분이며 본문은 필수는 아니고, 필요에 따라 데이터를 실어 보낼 때 사용됨.
- 요청 본문(Request Body): 클라이언트가 서버에 보낼 데이터를 포함함. 주로 POST, PUT, PATCH 요청에서 사용돼.
- Content-Type 헤더를 통해 본문의 데이터 형식을 명시.
- EX) JSON, XML, 파일 업로드 등. JSON 데이터를 보내는 경우 Content-Type: application/json으로 설정.
- 응답 본문(Response Body): 서버가 클라이언트에게 반환하는 데이터를 포함함. 응답 본문은 HTML, JSON, 파일(이미지, 비디오 등) 등 다양한 형식일 수 있음.
- EX) 웹페이지의 HTML 소스, JSON 형태의 API 응답 등.
- 본문이 없는 요청과 응답: GET 요청이나 204 No Content 상태 코드의 응답은 보통 본문을 포함하지 않음.
4. Status Code
- 역할: 상태 코드는 서버가 요청을 어떻게 처리했는지에 대한 결과를 숫자로 나타내며 주로 3자리 숫자로 구성되고, 클라이언트에게 응답의 성공, 실패, 리다이렉션 등을 알려줌.
- 카테고리:
- 1xx (정보 응답): 서버가 요청을 처리하고 있다는 중간 상태를 나타냄.
- 100 Continue: 클라이언트가 요청을 계속 진행할 수 있음.
- 2xx (성공 응답): 요청이 성공적으로 처리되었음을 의미.
- 200 OK: 요청이 성공적으로 완료됨.
- 201 Created: 요청에 의해 리소스가 생성됨.
- 3xx (리다이렉션): 요청한 리소스를 다른 위치로 이동해야 함.
- 301 Moved Permanently: 리소스가 영구적으로 다른 URL로 이동됨.
- 302 Found: 리소스가 임시적으로 다른 URL에 있음.
- 4xx (클라이언트 오류): 클라이언트의 요청에 문제가 있을 때 발생.
- 400 Bad Request: 잘못된 요청(구문 오류 등).
- 401 Unauthorized: 인증이 필요하거나 실패함.
- 404 Not Found: 요청한 리소스를 찾을 수 없음.
- 5xx (서버 오류): 서버가 요청을 처리하는 과정에서 문제가 발생.
- 500 Internal Server Error: 서버 내부 오류로 인해 요청을 처리할 수 없음.
- 503 Service Unavailable: 서버가 일시적으로 사용 불가 상태.
- 1xx (정보 응답): 서버가 요청을 처리하고 있다는 중간 상태를 나타냄.
버전별 특징
1. HTTP/0.9
- 등장 시기: 1991년
- 특징:
- 단순한 구조로, 오직 GET 메서드만 지원.
- 헤더가 없고 응답으로 HTML 파일만 전송.
- 비지속 연결: 각 요청마다 TCP 연결을 새로 생성하여 성능이 비효율적임.
- 확장성이 부족하고, 데이터 타입 지원이 없음.
2. HTTP/1.0
- 등장 시기: 1996년
- 특징:
- GET, POST, HEAD 메서드를 지원.
- 헤더가 도입되어 콘텐츠 타입, 길이 등 메타데이터를 포함할 수 있음.
- 캐싱 지원: Expires 헤더를 통해 리소스의 유효 기간 명시.
- 쿠키 지원하지 않음: 쿠키는 실무에서 사용되었지만, 공식 표준은 아님.
- 비지속 연결: 요청마다 새로운 TCP 연결 필요.
3. HTTP/1.1
- 등장 시기: 1997년
- 특징:
- 지속 연결(persistent connection): 기본적으로 TCP 연결을 재사용하여 여러 요청 처리 가능.
- Host 헤더 도입: 하나의 IP 주소에서 여러 도메인을 처리할 수 있는 가상 호스팅 지원.
- 캐싱 메커니즘 개선: Cache-Control 헤더 도입으로 더 정교한 캐시 제어 가능.
- 쿠키와 같은 상태 유지 메커니즘이 확산.
- 압축 지원: 전송 인코딩으로 gzip과 같은 압축 기능 추가.
- 파이프라이닝(pipelining): 요청을 병렬로 처리 가능하나, 실무에서 잘 사용되지 않음.
4. HTTP/2.0
- 등장 시기: 2015년
- 특징:
- 이진 프로토콜: 텍스트 기반에서 이진 프레임으로 변경되어 효율적 데이터 전송 가능.
- 멀티플렉싱: 하나의 연결에서 여러 요청과 응답을 병렬로 처리하여 성능 개선.
- 헤더 압축: HPACK 방식으로 헤더를 효율적으로 압축하여 대역폭 절약.
- 서버 푸시: 서버가 클라이언트 요청을 예측하여 필요한 리소스를 미리 전송 가능.
5. HTTP/3.0
- 등장 시기: 2020년대 초반
- 특징:
- QUIC 프로토콜 기반: UDP를 사용하여 연결 성립이 빠르고 패킷 손실에 대한 회복이 신속함.
- 멀티플렉싱: HTTP/2.0의 멀티플렉싱을 유지하면서도 헤드 오브 라인 블로킹 문제 해결.
- 헤더 압축과 서버 푸시 기능이 여전히 지원됨.
느낀점
백엔드, 프론트엔드로 나누기 전 웹 개발자로서 HTTP에 대해서 어느정도 알고 있어야 겠다는 생각을 하게 되었습니다.
반응형
'나의 일상 > 생각정리' 카테고리의 다른 글
[생각정리] 어떤 리더가 되어야 하는가? (프로젝트 회고록) (2) | 2024.04.02 |
---|---|
[생각정리] 생각보다 쉬웠던 오픈소스 기여하기 (0) | 2022.09.03 |
[생각정리] 회사에서 절대 맡으면 안되는 업무 (0) | 2022.07.05 |
[생각정리] 포트폴리오 특강 by. 김루비 멘토 (0) | 2022.05.19 |
[생각정리] 사용자 스토리 기반으로 점진적 기능 개발 by. 차경묵 멘토 (0) | 2022.05.12 |