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 메시지는 시작 라인, 필드 라인, 메시지 본문으로 이루어져 있음
- 필드 라인은 없거나 여러 개 있을 수 있다.
- 메시지 본문은 없을 수 있다.
- 필드 라인과 메시지 본문 사이에는 빈 줄바꿈이 있다.
시작 라인
필드 라인(헤더 라인)
- 0개 이상의 HTTP 헤더가 명시
- HTTP 헤더: HTTP 통신에 필요한 부가 정보
- 실제로는 한 HTTP 메시지에 아주 다양한 HTTP 헤더들이 사용되는 것이 일반적
- 헤더이름: 헤더 값
- HTTP 헤더의 종류는 다양하다.
- 붉은 색 글씨가 HTTP 헤더

메시지 본문
- HTTP 요청 혹은 응답 메시지에서 본문이 필요할 경우 메시지 본문에 명시
- 메시지 본문은 존재하지 않을 수도 있고, 다양한 콘텐츠 타입이 사용될 수도 있다.
HTTP 메서드
GET
- 특정 자원을 조회할 때 사용되는 메서드
- 이것(자원)을 가져다 주세요.
- 가장 흔히 사용되는 메서드 중 하나
- 웹 브라우저를 통해 조회하는 자원은 대부분 GET 요청 메시지에 대한 응답
- Host 헤더에는 요청을 보낼 호스트가 명시
- GET 메서드에 요청 메시지 본문을 포함시키는 것은 바람직하지 않다. GET 요청 메시지에서는 메시지 본문보다 쿼리 문자열이 사용되는 경우가 많다.
HEAD
- 사실상 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번대: 리다이렉션 상태 코드
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)
- 현재 서비스를 일시적으로 이용할 수 없음
- 서버가 과부하 상태에 있거나 일시적인 점검 상태일 때 볼 수 있는 상태