HTTP

sudyn·2023년 5월 4일

브라우저(웹)

목록 보기
6/8

HTTP(Hypertext Transfer Protocol)

HTTP는 HTML과 같은 문서를 전송하기 위한 Application Layer Protocol (애플리케이션 계층 프로토콜) 이다.
HTTP는 웹 브라우저(클라이언트)와 웹 서버의 소통을 위해 디자인되었다.

웹통신 : 서버(웹서버)와 클라이언트(웹브라우저) 간의 데이터 주고받기 위한 대화
프로토콜 : 웹에서 서버 ↔ 클라이언트간 주고 받은 상호간의 약속(프로토콜)을 HTTP 프로토콜

HTTP의 특징

Stateless(무상태성)

HTTP는 특정 상태를 유지하지 않는 특징(비동기 프로토콜)이 있다.

Connetionless(비연결성)

HTTP는 실제로 요청을 주고 받을 때만 연결을 유지하고 응답을 주고나면 서버와의 연결을 끊는다.

간단함

확장 가능하다. 상태가 없지만, 세션은 있다

요청(request)와 응답(response)

HTTP Message

클라이언트와 서버 사이에 데이터가 교환되는 방식
요청(request), 응답(response)의 두가지 메시지 타입이 있다.
ASCII로 인코딩된 텍스트 정보로 여러 줄로 작성되어 있다.

HTTP Request Message

HTTP Request Message는 공백(blank line)을 제외하고 3가지 부분으로 나누어진다.

start line

HTTP Request Message의 시작 라인으로 크게 3가지 부분으로 구성되어 있다.

GET /test.html HTTP/1.1
[HTTP Method][Request target] [HTTP version]

  • HTTP method : 요청의 의도를 담고 있는 메소드(GET, POST, PUT, DELETE)
  • Request target : HTTP Request가 전송되는 목표 주소
  • HTTP version : version에 따라 Request 메시지 구조나 데이터가 다를 수 있음

headers

해당 request에 대한 추가 정보(addtional information) 를 담고 있는 부분
예를 들어, request 메세지 body의 총 길이 (Content-Length) 등 Key:Value 형태로 구성

headers도 크게 3가지 부분으로 나뉨(general headers, request headers, entity headers)

  • Host: google.com
  • Accept: text/html
  • Accept-Encoding: gzip, deflate
  • Connection: keep-alive

Host : 요청하려는 서버 호스트 이름과 포트번호
User-agent : 클라이언트 프로그램 정보. 이 정보를 통해 서버는 클라이언트 프로그램(브라우저)에 맞는 최적의 데이터를 보내줄 수 있다.
Referer : 바로 직전에 머물렀던 웹 링크 주소
Accept : 클라이언트가 처리 가능한 미디어 타입 종류 나열
If-Modified-Since : 여기에 쓰여진 시간 이후로 변경된 리소스 취득. 페이지가 수정되었으면 최신 페이지로 교체한다.
Authorization : 인증 토큰을 서버로 보낼 때 쓰이는 Header
Origin : 서버로 Post 요청을 보낼 때 요청이 어느 주소에 시작되었는지 나타내는 값. 이 값으로 요청을 보낸 주소와 받는 주소가 다르면 CORS(Cross-Origin Resource Sharing) 에러가 발생한다.
Cookie : 쿠키 값이 key-value로 표현된다.

body

HTTP Request가 전송하는 데이터를 담고 있는 부분
전송하는 데이터가 없다면 body 부분은 비어있습니다.
보통 post 요청일 경우, HTML 폼 데이터가 포함되어 있습니다.

POST /test HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 83
Content-Type: application/json
Host: google.com
User-Agent: HTTPie/0.9.3
{
"test_id": "tmp_1234567",
"order_id": "8237352"
}

HTTP Response Message

Status line

응답의 첫 줄은 Status line이라고 부르며, 다음의 정보를 포함한다.
현재 프로토콜의 버전(HTTP/1.1)
상태 코드 – 요청의 결과를 나타냅니다. (200, 302, 404 등)
상태 텍스트 – 상태 코드에 대한 설명
Status line은 HTTP/1.1 404 Not Found. 처럼 생겼다.

Headers

응답에 들어가는 HTTP headers는 요청 헤더와 동일한 구조를 가지고 있다.
대소문자 구분 없는 문자열과 콜론(:), 값을 입력한다.
값은 헤더에 따라 다르다.
HTTP_Response_Headers

요청의 헤더와 마찬가지로 몇 그룹으로 나눌 수 있다.
- General headers
메시지 전체에 적용된다.
- Response headers
Vary, Accept-Ranges와 같이 상태 줄에 넣기에는 공간이 부족했던 추가 정보를 제공한다.
- Entity headers
Content-Length와 같은 헤더는 body에 적용된다.
body가 비어있는 경우, entity headers는 전송되지 않는다.

Body

응답의 본문은 HTTP messages 구조의 마지막에 위치한다.
모든 응답에 body가 필요한 것은 아니다.
201, 204와 같은 상태 코드를 가지는 응답에는 본문이 필요하지 않다.
응답의 body는 다음과 같이 두 종류로 나눌 수 있다.
- Single-resource bodies(단일-리소스 본문)
길이가 알려진 단일-리소스 본문은 두 개의 헤더(Content-Type, Content-Length)로 정의한다.
길이를 모르는 단일 파일로 구성된 단일-리소스 본문은 Transfer-Encoding이 chunked 로 설정되어 있으며, 파일은 chunk로 나뉘어 인코딩되어 있다.
- Multiple-resource bodies(다중-리소스 본문)
서로 다른 정보를 담고 있는 body이다.

URL(Uniform Resource Locator)

웹에서 어느 사이트에 접속하기 위해 입력해야 하는 주소를 포함한 일련의 문자
(도메인을 포함한 경로로, 도메인의 상위 개념)

구조설명
URL전체 주소
https프로토콜
www.~도메인
path파일의 경로를 가리키며, / 뒤에 나온다. 컴퓨터의 폴더와 비슷한 개념이다.
parameter쿼리 스트링이라고 부르며, key(파라미터의 이름) = value(파라미 터의 값) 형태로 이루어진다.
?뒤에 나열되고, & 기호로 구분되어 여러 개가 존재할 수 있다.
fragment해시태그(hashtag), 앵커(ancher)라고도 부른다. 특정 요소를 지시할 수 있으며 파일 디렉토리 및 파일 이름과 유사한 역할로 쓰이기도 한다.

URI와 URL

URI(Uniform Resource Identifier) : 자원의 위치 뿐만 아니라 자원에 대한 고유 식별자로서 URL의 의미를 포함
URL(Uniform Resource Locator) : 자원이 실제로 존재하는 위치
URI는 식별하고, URL은 위치를 가리킨다.

메서드

GET - 조회
POST - 생성
PUT, PATCH - 수정(변경)
DELETE - 삭제

상태코드

클라이언트가 서버에 어떤 요청(request)을 하고 나면, 서버는 그에 맞는 응답(response)을 제공한다. 그 때 각 응답은 상태코드를 갖는다.

  • 1xx(정보) : 요청을 받았으며 프로세스를 계속 진행합니다.
  • 2xx(성공) : 요청을 성공적으로 받았으며 인식했고 수용하였습니다.
  • 3xx(리다이렉션) : 요청 완료를 위해 추가 작업 조치가 필요합니다.
  • 4xx(클라이언트 오류) : 요청의 문법이 잘못되었거나 요청을 처리할 수 없습니다.
  • 5xx(서버 오류) : 서버가 명백히 유효한 요청에 대한 충족을 실패했습니다.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Messages
https://hanamon.kr/%eb%84%a4%ed%8a%b8%ec%9b%8c%ed%81%ac-http-%eb%a9%94%ec%84%b8%ec%a7%80-message-%ec%9a%94%ec%b2%ad%ea%b3%bc-%ec%9d%91%eb%8b%b5-%ea%b5%ac%ec%a1%b0/

profile
개발계발하는 프론트엔드 개발자🍠

0개의 댓글