CS_Study

HTTP란?

HTTP는 HyperText Transfer Protocl의 줄임말로 www상에서 사용하는 프로토콜이다.

기존에는 하이퍼텍스트 문서들을 주고받기 위한 규약으로 만들었으며, 현재에는 문서들 뿐만 아니라 이미지, 비디오, 음성 등 거의 모든 형식의 데이터를 전송하는데 사용되고 있다.

HTTP는 서버와 클라이언트 사이에 요청과 응답을 주고 받는 프로토콜로 우리가 흔히 웹브라우저 주소창에 입력하는 웹 주소인 URL을 통해 요청과 응답이 이루어진다.

  • 하이터텍스트(HyperText): 참조(하이퍼링크)를 통해 한 문서에서 다른 문서로 즉시 접근할 수 있는 텍스트를 의미한다. 하이퍼 텍스트라는 용어는 1965년 테드 넬슨이라는 철학자가 만들었다.
  • 월드와이드 웹(www, World Wide Web): 인터넷이 연결된 컴퓨터를 통해 사람들이 정보를 공유할 수 있는 가상의 공간이다.

HTTP 버전

  • HTTP/0.9: 단순한 구성으로 이루어져 요청가능한 메서드는 GET이 유일했고, HTTP 헤더가 존재하지 않아 HTML 파일만 전송이 가능했다.
  • HTTP/1.0: HTTP 헤더 개념이 도입되어, 브라우저가 요청에 대한 성공과 실패를 알 수 있게 되었다. 데이터에 대한 정보를 담고있는 메타데이터 전송도 혀용하고, Content-Type의 추가는 HTML외에 다른 문서들도 전송 가능하게 하였다.
  • HTTP/1.1: HTTP의 표준 프로토콜이며 많은 부분들이 개선되었다. 개선된 부분중에는 커넥션 제어에 관한 두가지 모델의 추가도 있다. 하나는 커넥션이 재사용될 수 있는 모델로 서버를 다루다 보면 보게되는 Keep-Alive 옵션이다. 또 다른 하나는 파이프라이닝을 추가하여 요청에 대한 응답이 완전히 전송되기 이전에 두번째 요청을 전송 가능하게 하여 네트워크 지연을 줄이는 모델이다.

Untitled

  • HTTP/2: 구글이 만들었고, 네트워크 지연 시간을 줄이기 위한 성능에 목표를 둔 HTTP의 두번째 배전. HTTP 헤더 데이터 압축이나 서버 푸시기술 추가 등 많은 부분들이 보완되었다.

HTTP 메시지 구조

HTTP 메시지는 ASCII로 인코딩된 텍스트로 되어있다.

기본적인 메시지 구조는 다음과 같다.

Untitled

HTTP 메시지는 기본적으로 클라이언트가 요청하고 서버가 응답하는 구조이기 때문에 메시지는 요청이냐 응답이냐 에 따라 각 메시지의 구성 내용이 달라진다.

Untitled

Untitled

HTTP Method

HTTP Method는 클라이언트가 서버에 요청의 목록 및 종류를 알리는 수단이다.

HTTP요청 시에 메세지 시작줄에 표시된다.

RestFul API 구조등이 많이 사용되기 때문에 주로 GET, POST, PUT, DELETE 정도의 메서드 위주로 알아 두면 좋다.

메서드 설명
GET 리소스 요청
POST 서버에 내용(파일 포함)전송
HEAD 메세지 헤더(문서 정보)요청
PUT 리소스 전체 수정 요청
DELETE 리소스 제거 요청
OPTIONS 서버에서 제공하는 메서드 목록 요청
TRACE 요청 리소스가 수신되는 경로를 보여줌 메세지 loop-back 테스트 요청
CONNECT 프록시 서버와 같은 중간 서버 경유
PATCH 리소스 부분 수정 요청

HTTP 헤더

HTTP 메시지 구조를 보면 HTTP 헤더가 들어가는데 요청/응답 헤더, general 헤더, entity 헤더로 구분 된다. 헤더는 기본적으로 key : value 방식으로 표기되며, 헤더안에 들어갈 수 있는 종류는 매우 많다. 하지만 주로 많이 사용되는 헤더들을 정리해보자면 다음과 같다.

요청(Request) 헤더

헤더명 설명
Host 요청하는 호스트에 대한 호스트 주소 및 포트번호
User-agent 클라이언트 소프트웨어(웹 브라우저 or 모바일)의 이름과 버전등의 정보
Accept 클라이언트가 원하는 미디어 타입 및 우선순위(* / *은 모든 파일 형식을 지원한다는 의미)
Accept-Language 클라이언트가 원하는 가능한 언어
Accept-Encoding 클라이언트가 원하는 문자 인코딩 방식
If-Modified-Since 제시한 일시 이후로 변경된 리소스 요청
Cookie 서버에 의해 Set-Cookie로 클라이언트에 설정된 쿠키 정보
Referer 특정 페이지에서 링크를 클릭하여 요청하였을 경우 직전에 머물렀던 링크 주소
Origin POST 같은 요청을 보낼 때, 요청이 어느 주소에서 시작되었는지 나타내며, Host와 Origin이 다르면 CORS 문제가 발생한다.

응답(Response) 헤더

헤더명 설명
Server 서버 소프트웨어 정보
Access-Control-Allow-Origin 요청을 보내는 프론트 주소와 백엔드 주소가 다르면 CORS 에러발생
Set-Cookie 서버에서 클라이언트로 쿠키 생성
Etag HTTP 컨텐츠가 바뀌었는지 검사하는 태그
Allow 서버에서 지원가능한 HTTP 메소드 리스트

general 헤더

헤더명 설명
Date HTTP 메시지 생성 일시
Connection 커넥션 정보 (keep-Alive / token list)
Cache-Control 캐싱 관련 옵션

entity 헤더

헤더명 설명
Content-Type 미디어 타입 정보

HTTP 상태 코드

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

출처: https://noahlogs.tistory.com/34

GET

GET은 클라이언트에서 서버로 어떠한 리소스로 부터 정보를 요청하기 위해 사용되는 메서드이다.

GET을 통한 요청은 URL 주소 긑에 파라미터로 포함되어 전송되며, 이부분을 쿼리 스트링 (query string)이라고 부른다.

방식은 URL끝에 “?”를 붙이고 그다음 변수명1 = 값1&변수명2 = 값2 형식으로 이어 붙이면 된다.

예를 들면

www.example.com/soccer/player?name=messi&position=striker

서버에서는 name과 position이라는 파라미터 명으로 각각 value1과 value2의 파라미터 값을 전달 받을 수 있다.

GET의 특징

  • GET 요청은 캐시가 가능하다
    • GET을 통해 서버에 리소스를 요청할 때 웹 캐시가 요청을 가로채 서버로부터 리소스를 다시 다운로드하는 대신 리소스의 복사본을 반환한다.

      HTTP 헤더에서 cache-control 헤더를 통해 캐시 옵션을 지정할 수 있다.

    • GET 요청은 브라우저 히스토리에 남는다.

    • GET 요청은 북마크 될 수 있다.

    • GET 요청은 길이 제한이 있다.

      • GET 요청의 길이 제한은 표준이 따로 있는건 아니고 브라우저마다 제한이 다르다고 한다.
    • GET 요청은 중요한 정보를 다루면 안된다.(보안)

      • GET 요청은 파라미터에 다 노출되어 버리기 때문에 최소한의 보안 의식이라 생각하자
    • GET은 데이터를 요청할 때만 사용된다.

POST

POST는 클라이언트에서 서버로 리소스를 생성하고나 업데이트하기 위해 데이터를 보낼 때 사용되는 메서드다. 예를들면 게시판에 게시글을 작성하는 작업등을 할 때 사용된다.

POST는 전송할 데이터를 HTTP 메시지 body부분에 담아서 서버로 보낸다.

POST로 데이터를 전송할 때 길이 제한이 따로 없으며 용량이 큰 데이터를 보낼 때 사용하거나 GET처럼 데이터가 외부적으로 드러나는건 아니라서 보안이 필요한 부분에 많이 사용된다.

POST를 통한 데이터 전송은 보통 HTTP form data를 이용한다.

POST의 특징

  • POST 요청은 캐시되지 않는다.
  • POST 요청은 브라우저 히스토리에 남지 않는다.
  • POST 요청은 북마크 되지 않는다.
  • POST 요청은 데이터 길이에 제한이 없다.