공부하고 기록하는, 경제학과 출신 개발자의 노트

학습일지/네트워크

HTTP

inspirit941 2020. 12. 4. 14:42
반응형

목차

HTTP

서버와 클라이언트가 텍스트, 이미지, 동영상 등의 데이터를 주고받을 때 사용하는 프로토콜. 기본적으로 텍스트를 전송한다.

특징

TCP/IP 기반으로 한 지점에서 다른 지점으로 요청을 보내고 받음.

  • 무상태성 (Stateless)

    • 클라이언트와 서버가 각각 HTTP로 통신할 때, 상대방의 State를 기억하거나 저장하지 않는다.
  • 비연결성 (Connectionless)

    • 요청을 받은 서버가 응답을 마치면, 소켓을 유지하지 않고 연결을 끊는다.
    • 요청에는 반드시 응답이 일대일로 대응된다.
      • 서버가 응답을 보내더라도, 클라이언트가 받지 못할 수 있으므로 클라이언트가 각 상황별 대응을 결정해야 함
      • 클라이언트는 일정 시간 응답이 없으면 timeout -> 요청 실패로 간주함
  • TCP 위에 텍스트 기반의 HTTP Header와 메시지를 사용하므로, 헤더 크기가 크다.

타임아웃 시간과 최대 재시도 횟수는

  • 전체 로직에서 서버 응답이 지닌 중요성
  • 서버의 평균 부하
  • 실패확률

등을 따져보고 결정해야 한다. 클라이언트가 기다려야 하는 최대 시간이 사용자 관점에서 납득 가능한지도 생각해야 함.

cf. TCP와의 차이점

  • TCP는 stateful. 주고받을 메시지가 없거나, 연결을 끊기 전까지는 연결이 유지된다.
  • Binary 데이터를 사용하므로 HTTP보다 패킷크기가 작고, 처리속도가 빠름. 많은 사용자를 처리해야 할수록 유리한 구조
  • 다만, 일반적으로 서비스는 통신 처리 시간 < 로직 처리 시간이므로 프로토콜 속도차이는 유의미하지 않다.

구조

Request Header

unnamed

첫 줄 = 요청 줄. 아래의 순서를 지킨다.

<요청 메소드> <URL경로> <HTTP버전>\r\n

GET / HTTP/1.1\r\n 형태일 경우

  • 요청 메소드는 GET, 루트 경로 (/) 요청, HTTP 버전은 1.1

User-Agent, Host, Connection - HTTP 헤더 값이며, 요청에 관련된 추가 설정.

  • Host : URL 제외한 경로 주소. 포트번호도 넣을 수 있지만 필수는 아님. HTTP : 포트 80, HTTPS : 포트 443
  • User-Agent : HTTP 요청이 발생한 웹 브라우저 정보.
  • Accept : 클라이언트가 처리할 수 있는 데이터 형태.
  • Content-Type: 메시지 바디의 형태를 표시.
    • 웹서비스에서 중요한 부분. Content Type값에 따라 브라우저의 동작이 바뀔 수 있기 때문.
      ex) application/json일 경우 브라우저는 보안을 이유로 메시지 바디에 있는 자바스크립트 동작을 막는다.
      악성 스크립트를 JSON으로 위장했을 경우가 있을 수 있음.
    • 위와 같은 사례를 CSRF (Cross-site Request Forgery) 또는 Json 하이재킹이라고 부른다.
    • 혹시라도 응답 과정에서 데이터가 변조될 수 있으므로 Content Type을 text/plain, application/json으로 명시하는 것이 좋다.
  • Content-length: 메시지 바디 길이
  • Connection: keep-alive : HTTP 1.1부터 지원.
    • HTTP 통신이 완료되더라도 일정 시간은 TCP 소켓이 연결을 유지한다.
    • 매번 통신할 때마다 TCP 연결을 새로 맺는 대신, 기존의 연결을 활용

\r\n\r\n - 헤더와 메시지 바디 경계 구분자.

Response Header

b3cb3b00-1511-11eb-980e-42068540b125

  • Response Code
    • 2xx : 정상
    • 4xx : 클라이언트 측 문제
    • 5xx : 서버 측 문제

메소드

  1. GET - 조회

    • 클라이언트가 서버에 페이지를 요청할 때 사용.
    • 읽기 요청이므로 메시지 바디값은 없음.
      • 요청주소에 ?와 &를 구분자로 사용하는 QueryString 사용.
      • ?는 첫 번째 파라미터, &는 파라미터 사이를 구분하는 용도
  2. POST - 생성

    • 클라이언트가 서버로 데이터를 전송해 새로운 값을 생성할 때 사용.
  3. PUT, PATCH

    • PUT: 리소스의 모든 필드를 교체할 때 사용. 일부만 전달할 경우, 전달한 값 외의 나머지는 Null 처리하는 것이 원칙
    • PATCH: 부분 교체. 리소스의 일부 필드를 교체할 때 사용.
  4. DELETE - 삭제

  5. OPTION - 특정 엔드포인트가 어떤 메소드를 허용하는지 확인하고자 할때 사용함.

    • Allow: HEAD, GET, POST, OPTIONS 형태

URI와 URL

http://도메인:포트/{Servlet Path}/{Path}?{name=value}&{name=value}

  • URL : Uniform Resource Locator.

    • HTTP에서 통신 대상을 식별할 때 사용한다.
    • 통신을 위한 IP주소를 사람이 보기 쉽게 매핑한 것
  • URI : Uniform Resource Identifier. 특정 자원의 고유 식별자를 지칭한다.

    • 문서나 영상과 같은 자원의 위치를 가리킬 때 사용하는 용어.
    • URL뿐만 아니라 XML 등에도 사용. URL -> URI는 의미상 통하지만, 그 역은 통하지 않는다.

ex) http://test.com/test.pdf?docid=111 이라는 주소가 있을 때

URL는 http://test.com/test.pdf. 해당 자원의 위치를 정의한 것.

URI는 ?docid=111까지 포함. 이 쿼리스트링에 따라 결과값이 달라질 수 있으므로, 원하는 자원을 요청할 유일한 식별자이기 때문

HTTP 버전

  • 1.1 : HTTP의 첫번째 표준.
    • Connection을 재사용 (keep-alive의 도입)
    • 파이프라이닝으로 latency 감소. 첫 번째 요청에 응답이 완전히 전송되기 전에 두 번째 요청을 전송할 수 있도록.
    • 텍스트 기반 프로토콜
  • 2.0
    • 요지: http1.1보다 빠르고, 통신 부하가 적도록 설정
    • Multiplexed Stream 도입. 한 번의 Connection으로 동시에 여러 개의 데이터를 주고받을 수 있음
    • Stream의 우선순위 설정 가능
    • Server push. html 문서에 필요한 정보는 클라이언트 요청 없이도 전송
    • 중복되는 헤더 값 압축
    • Binary 기반 프로토콜
    • 현재 많은 http 프로토콜이 사용하고 있는 버전. http1.1의 영향력이 점차 줄어들고 있음.

Nginx와 Apache

HTTP 표준에서 정의하는 기능을 바로 사용할 수 있는 웹서버 소프트웨어.

  • 아파치 : 오랜 역사가 입증한 안정성. 인증과 같은 많은 기능 제공.
    • 사용자 수가 늘어날수록 처리가 비효율적인 다중 프로세스 구조 사용
  • nginx : 아파치보다 뛰어난 성능과 가벼운 구조.
    • horizontal scale에 유리한 단일스레드 + 이벤트 기반 동작.

참고:

학교에서 알려주지 않는 17가지 실무 개발 기술
국내도서
저자 : 이기곤
출판 : 한빛미디어 2020.04.16
상세보기
반응형