[혼자 공부하는 네트워크] 5-2 HTTP

술술·2024년 9월 11일
0

HTTP의 특성

  • HTTP(Hypertext Transfer Protocol): 응용 계층에서 정보를 주고받는 데 사용되는 프로토콜

요청-응답 기반 프로토콜

  • 클라이언트와 서버가 서로 HTTP 요청 메시지와 HTTP 응답 메시지를 주고받는 구조
  • HTTP 요청 메시지와 HTTP 응답 메시지는 메시지 형태가 다름

미디어 독립적 프로토콜

  • 자원: HTTP가 요청하는 대상
  • HTTP는 자원의 특성을 제한하지 않으며, 자원과 상호 작용하는 데 사용할 수 있는 인터페이스를 정의할 뿐
  • 대부분의 자원은 URI로 식별
  • 미디어 타입(media type), MIME 타입(Multipurpose Internet Mail Extensions Type)
    • HTTP에서 메시지로 주고받는 자원의 종류
    • 타입/서브타입 형식으로 구성
    • 타입 - 데이터의 유형, 서브타입 - 주어진 타입에 대한 세부 유형
    • 부가적인 설명을 위해 선택적으로 매개변수가 포함될 수도 있다.
      • 타입/서브타입;매개변수=값
    • 종류는 매우 다양하며, 필요에 따라 새로운 미디어 타입을 등록할 수도 있다.
  • HTTP를 통해 송수신하는 정보의 종류는 미디어 타입으로 나타낼 수 있다.


스테이트리스 프로토콜

  • 상태를 유지하지 않는다.
  • 서버가 HTTP 요청을 보낸 클라이언트와 관련된 상태를 기억하지 않는다.
  • 클라이언트의 모든 HTTP 요청은 기본적으로 독립적인 요청으로 간주
  • 클라이언트가 실수로 특정 HTTP 요청 메시지를 서버에게 여러 번 전송 → 서버는 요청들을 각기 다른 요청으로 간주 → 클라이언트는 같은 응답 메시지 여러 번 받음
  • HTTP 서버는 일반적으로 많은 클라이언트와 동시에 상호 작용 → 모든 클라이언트의 상태 정보를 유지하는 것은 서버에 큰 부담
  • 서버는 여러 대로 구성될 수도 있음 → 모든 클라이언트의 상태를 유지하면 클라이언트는 여러 서버 동시에 이용하기 어려움
    • 모든 서버가 모든 클라이언트의 상태 정보를 공유하는 작업은 매우 번거롭고 복잡
  • HTTP가 상태를 유지한다면 클라이언트는 자신의 상태를 기억하는 특정 서버 하고만 상호 작용 할 수 있게 되어 특정 클라이언트가 특정 서버에 종속될 수 있다.
    • 한 서버에 문제가 발생하면 해당 서버에 종속된 클라이언트는 직전까지의 HTTP 통신 내역을 잃어버리는 상황 발생

📌 확장성(scalability)과 견고성(robustness): HTTP의 설계 목표

  • 상태를 유지하지 않고 모든 요청을 독립적인 요청으로 처리하는 것은 특정 클라이언트가 특정 서버에 종속되지 않도록하며, 서버의 추가나 문제 발생 시 대처가 용이하도록 함
  • 언제든 쉽게 서버를 추가할 수 있기 때문에 확장성이 높고, 서버 중 하나에 문제가 생겨도 쉽게 다른 서버로 대체가 가능하기 때문에 견고성이 높다.

지속 연결 프로토콜

  • 기본적으로 HTTP는 TCP 상에서 동작하는데, HTTP 비연결형 프로토콜 이지만 TCP는 연결형 프로토콜
  • 초기의 HTTP 버전(HTTP 1.0 이하)은 쓰리 웨이 핸드셰이크를 통해 TCP 연결을 수립한 후, 요청에 대한 응답을 받으면 연결을 종료하는 방식으로 동작
    • 비지속 연결: 추가적인 요청-응답을 하기 위해서는 다시 TCP 연결을 수립
  • 지속 연결(persistent connection), Keep-alive
    • 하나의 TCP 연결상에서 여러 개의 요청-응답을 주고받을 수 있는 기술
    • 더 빠르게 HTTP 요청과 응답 처리




HTTP 메시지 구조

  • HTTP 메시지는 시작 라인, 필드 라인, 메시지 본문으로 이루어져 있음
  • 필드 라인은 없거나 여러 개 있을 수 있다.
  • 메시지 본문은 없을 수 있다.
  • 필드 라인과 메시지 본문 사이에는 빈 줄바꿈이 있다.

시작 라인

  • HTTP 요청 메시지일 경우 시작 라인: 요청 라인

    • 메서드
      • 클라이언트가 서버의 자원(요청 대상)에 대해 수행할 작업의 종류
      • GET, POST, PUT, DELETE
      • 요청 대상이 같아도 메서드가 다르면 각기 다른 요청으로 처리

    • 요청 대상
    • HTTP 버전
      • 사용된 HTTP 버전
      • HTTP/버전 - HTTP/1.1

  • HTTP 응답 메시지일 경우 시작 라인: 상태 라인

    • HTTP 버전
    • 상태 코드(status code)
      • 요청에 대한 결과를 나타내는 세 자리 정수
      • 클라이언트는 상태 코드를 통해 요청이 어떻게 처리되었는지 판단
    • 이유 구문
      • 상태 코드에 대한 문자열 형태의 설명
    • 예시: HTTP/1.1 200 OK

필드 라인(헤더 라인)

  • 0개 이상의 HTTP 헤더가 명시
  • HTTP 헤더: HTTP 통신에 필요한 부가 정보
  • 실제로는 한 HTTP 메시지에 아주 다양한 HTTP 헤더들이 사용되는 것이 일반적
  • 헤더이름: 헤더 값
  • HTTP 헤더의 종류는 다양하다.
  • 붉은 색 글씨가 HTTP 헤더

메시지 본문

  • HTTP 요청 혹은 응답 메시지에서 본문이 필요할 경우 메시지 본문에 명시
  • 메시지 본문은 존재하지 않을 수도 있고, 다양한 콘텐츠 타입이 사용될 수도 있다.




HTTP 메서드


GET

  • 특정 자원을 조회할 때 사용되는 메서드
  • 이것(자원)을 가져다 주세요.
  • 가장 흔히 사용되는 메서드 중 하나
  • 웹 브라우저를 통해 조회하는 자원은 대부분 GET 요청 메시지에 대한 응답
  • Host 헤더에는 요청을 보낼 호스트가 명시
  • GET 메서드에 요청 메시지 본문을 포함시키는 것은 바람직하지 않다. GET 요청 메시지에서는 메시지 본문보다 쿼리 문자열이 사용되는 경우가 많다.

  • 사실상 GET과 동일한 역할
  • 차이는 응답 메시지에 메시지 본문이 포함되지 않는다는 것
  • HEAD 메서드를 사용하면 서버는 요청에 대한 응답으로 응답 메시지의 헤더만을 반환

POST

  • 서버로 하여금 특정 작업을 처리하도록 요청하는 메서드
  • 이것을 처리해 주세요
  • 범용성이 매우 넓은 메서드
  • GET 다음으로 많이 접한다.
  • 처리할 대상은 흔히 메시지 본문으로 명시
  • 많은 경우 클라이언트가 서버에 새로운 자원을 생성하고자 할 때 사용
  • 새로운 자원이 생성되면 서버는 응답 메시지의 Location 헤더를 통해 새로 생성된 자원의 위치를 클라이언트에게 알려 줄 수 있음

PUT

  • 덮어쓰기를 요청하는 메서드
  • 요청 자원이 없다면 메시지 본문으로 자원을 새롭게 생성
  • 이미 자원이 존재한다면 메시지 본문으로 자원을 완전히 대체

PATCH

  • 부분적 수정
  • 메시지 본문에 맞게 자원이 일부 수정

DELETE

  • 특정 자원을 삭제하고 싶을 때 사용하는 메서드

서버 개발자 입장

  • 어떤 URI(URL)에 어떤 메서드로 요청을 받았을 때 서버가 어떻게 행동해야 하는지 설계하는 것은 오로지 개발자의 몫
  • 같은 URL에 대한 요청일지라도 사용된 메서드가 다르면 각기 다른 요청으로 간주
  • 같은 URL에 대해 메서드별 동작을 여러 개 구현할 수도 있다.
  • 어떤 URL로 어떤 요청을 받았을 때 서버는 어떻게 응답할 것인가? → 이를 가장 잘 보여주는 문서가 API 문서
    • 어떤 URL에 어떤 메서드를 보낼 수 있는지, 어떤 쿼리 문자열(매개변수)이 사용될 수 있는지
    • 올바르게 요청을 보냈을 경우 어떤 응답 메시지를 받을 수 있는지 등
    • 위와 같은 것들이 명시되어 있다.




HTTP 상태 코드

  • 백의 자리 수를 기준으로 유형을 구분


200번대: 성공 상태 코드

  • 요청이 성공했음을 의미
  • 200(OK)
    • 서버가 요청을 성공적으로 받아들이고 처리한 경우, 서버는 요청한 자원과 함께 상태 코드를 포함한 응답 할 수 있음

  • 201(Created)
    • POST 요청을 통해 서버에 새로운 자원을 생성한 경우, 요청이 성공했으며 새로운 자원이 만들어졌음을 알릴 수 있다.

  • 202(Accepted)
    • 요청을 잘 받았으나, 아직 요청한 작업을 끝내지 않았음을 의미
    • 작업 시간이 긴 대용량 파일 업로드 작업이나 배치 작업과 같이 요청 결과를 곧바로 응답하기 어려운 상황

  • 204(No Content)
    • 요청 메시지에 대해 성공적으로 작업을 완료했더라도 마땅히 메시지 본문으로 표기할 것이 없을 경우



300번대: 리다이렉션 상태 코드

  • 리다이렉션(redirection)

    • 클라이언트가 요청한 자원이 다른 곳에 있을 때, 클라이언트의 요청을 다른 곳으로 이동시키는 것
      • 다른 곳은 URL이 될 수도 있고, 캐시가 될 수도 있다.
      • 캐시와 관련된 상태 코드 304(Not Modified) - 자원이 변경되지 않았음
    • 요청을 완수하기 위해 추가적인 조치가 필요한 상태
    • 클라이언트가 요청한 자원이 다른 URL에 있을 경우, 서버는 응답 메시지의 Location 헤더를 통해 요청한 자원이 위치한 URL 안내
    • 이를 수신한 클라이언트는 Location 헤더에 명시된 URL로 즉시 재요청을 보내어 새로운 URL에 대한 응답 받음


  • 영구적인 리다이렉션(permanent redirection)

    • 자원이 완전히 새로운 곳으로 이동하여 경로가 영구적으로 재지정
    • 기존의 URL에 요청 메시지를 보내면 항상 새로운 URL로 리다이렉트
    • 서버가 도메인을 이전하는 등 웹 사이트의 큰 개편이 있을 때
    • 어떤 URL에 요청을 보낸 결과로 영구적인 리다이렉션 관련 상태 코드를 응답 받았다면, 요청을 보낸 URL은 기억할 필요가 없다.
      • 앞으로는 새로운 URL로 요청을 보내면 되니까
    • 301(Moved Permanently), 308(Permanent Redirect)
      • 차이는 클라이언트의 재요청 메서드 변경 여부
    • 301(Moved Permanently)
      • 서버에 POST 메서드로 요청 메시지를 보냄
      • 클라이언트가 보내는 두 번째 요청 메서드는 GET으로 바뀔 수도 있다.

    • 308(Permanent Redirect)
      • 서버에 POST 메서드로 요청 메시지를 보냄
      • 두 번째 요청에서도 POST 메서드 유지

  • 일시적인 리다이렉션(temporary redirection)

    • 자원의 위치가 임시로 변경되었거나 임시로 사용할 URL이 필요한 경우에 주로 사용
    • 어떤 URL에 대해 일시적인 리다이렉션 관련 상태 코드를 응답 받았다면, 요청을 보낸 URL 기억해야 함
    • 302(Found), 303(See Other), 307(Temporary Redirect)
    • 302(Found)
      • 301(Moved Permanently)과 유사
      • 요청한 자원이 임시로 다른 곳으로 이동했음
      • GET이 아닌 요청 메서드를 사용한 클라이언트가 이 응답을 받았을 경우, 두 번째 요청 메서드는 GET으로 바뀔 수도 있다.

    • 307(Temporary Redirect)
      • 두 번째 요청 메서드를 변경하지 않는 상태 코드

    • 303(See Other)
      • 두 번째 요청 메서드를 GET으로 바꿔 주기 위해 사용



400번대: 클라이언트 에러 상태 코드

  • 클라이언트에 의한 에러가 있음
  • 서버가 처리할 수 없는 형태로 요청을 보냈거나, 존재하지 않는 자원에 대해 요청을 보내는 경우
  • 400(Bad Request)
    • 클라이언트의 요청이 잘못되었음을 알려 주는 상태 코드
    • 클라이언트 요청 메시지의 내용이나 형식 자체에 문제가 있어 서버가 요청 메시지를 올바르게 처리할 수 없는 경우

  • 401(Unauthorized)
    • 웹 상에서 정보를 검색할 때 모든 자원에 접근이 가능한 것은 아니다.
    • 특정 자원에 접근하기 위해 인증이 필요할 때가 있다.
    • 반드시 WWW-Authenticate라는 헤더를 통해 인증 방법을 알려 주어야 한다

  • 403(Forbidden)
    • 클라이언트의 권한이 충분하지 않을 때
    • 자원에 접근할 권한이 없음
    • 인증 여부와 권한 부여 여부는 다른 개념
      • 인증이란 자신이 누구인지 증명하는 것
      • 권한 부여는 인증된 주체에게 작업을 허용하는 것

  • 404(Not Found)
    • 접근하고자 하는 자원이 존재하지 않음을 알리는 상태 코드
    • 존재하더라도 공개하지 않는 자원에 대해 응답하는 경우

  • 405(Method Not Allowed)
    • 구현되지 않은 메서드로 요청을 보냈을 경우 해당 메서드의 미지원을 알린다.



500번대: 서버 에러 상태 코드

  • 클라이언트가 올바르게 요청을 보냈을지라도 발생할 수 있는 서버 에러에 대한 상태 코드
  • 500(Internal Server Error)
    • 가장 자주 사용되는 상태 코드
    • 서버의 예기치 못한 상황으로 인해 요청을 처리할 수 없음
    • 서버 내 에러를 통칭하기도 함

  • 502(Bad Gateway)
    • 클라이언트와 서버 사이에 위치한 중간 서버의 통신 오류를 나타내는 상태 코드
    • 클라이언트와 서버 사이에 위치한 중간 서버가 유효하지 않거나 잘못된 응답을 받을 경우
      • 클라이언트와 서버는 일반적으로 일대일로 연결되어 통신하지 않는다.
      • 클라이언트와 서버 사이에는 게이트웨이를 비롯한 여러 중간 서버가 존재할 수 있다.

  • 503(Service Unavailable)
    • 현재 서비스를 일시적으로 이용할 수 없음
    • 서버가 과부하 상태에 있거나 일시적인 점검 상태일 때 볼 수 있는 상태
profile
Hello

0개의 댓글

관련 채용 정보