# HTTP
# HTTP(Hyper Text Transfer Protocol)란?
HTTP란 서버와 클라이언트가 서로 데이터를 주고받기 위해 사용되는 통신 규약이다.
HTTP는 상태 정보를 저장하지 않는 Stateless의 특징과 클라이언트의 요청에 맞는 응답을 보낸 후 연결을 끊는 Connectionless의 특징을 가지고 있다.
# 장점
- 통신간의 연결 상태 처리나 상태 정보를 관리할 필요가 없어 서버 디자인이 간단하다.
- 무상태성 환경으로 클라이언트가 상태 정보를 갖고 있기 때문에 서버의 스케일아웃(수평확장)에 유리하다.
- 서버의 자원을 효율적으로 관리하고 수 많은 클라이언트의 요청에 대응할 수 있다.
# 단점
- 이전 통신의 정보를 모르기 때문에 매번 인증을 해줘야 한다.
- 이를 해결하기 위해 쿠키(cookie)나 세션(session)을 사용해서 데이터를 처리한다.
- 상태를 저장하고 있지 않기 때문에 요청에 필요한 데이터가 많아진다.
# HTTP 상태 코드
- 1xx(정보): 요청을 받았으며 프로세스를 계속 진행
- 2xx(성공) : 요청을 성공적으로 받았으며 인식했고 수용
- 3xx(리다이렉션) : 요청 완료를 위해 추가 작업 조치가 필요
- 4xx(클라이언트 오류) : 요청의 문법이 잘못되었거나 요청을 처리할 수 없음
- 5xx(서버 오류) : 서버가 명백히 유효한 요청에 대한 충족을 실패
# HTTP 메세지 구조
HTTP 메시지는 위에서부터 차례대로 **시작 라인(Start Line), 헤더(Header), 공백 라인(Empty Line), 바디(Message Body)**로 구성되어 있다. 이 중 공백 라인은 HTTP 메시지의 헤더와 바디 값 구분을 하기 위한 라인으로 반드시 존재해야 한다.
# HTTP 메소드
HTTP 메소드란 클라이언트와 서버 사이에 이루어지는 요청과 응답 데이터를 전송하는 방식을 말한다.
# HTTP 메소드 종류
# 주요 메소드 5가지
- GET: 리소스 조회
- POST : 요청 데이터 처리, 주로 데이터 등록에 사용
- PUT : 리소스를 대체, 해당 리소스가 없으면 생성
- PATCH : 리소스를 일부만 변경
- DELETE : 리소스 삭제
# 기타 메소드 4가지
- HEAD: GET과 동일하지만 메시지 부분을 제외하고, 상태 줄과 헤더만 반환
- OPTIONS: 대상 리소스에 대한 통신 가능 옵션을 설명(주로 CORS에서 사용)
- CONNECT: 대상 자원으로 식별되는 서버에 대한 터널을 설정
- TRACE: 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행
# HTTP 메소드 특성
# 안전성(Safe)
- 호출해도 리소스 변경이 일어나지 않는 속성
- GET, HEAD
# 멱등성(Idempotent)
- 동일한 요청을 여러 번 보내도 한 번 보내는 것과 같은 것
- 같은 행위를 여러 번 반복하더라도 같은 효과를 받으며, 서버의 상태로 동일하게 남는다.
- 멱등성은 요청의 결과를 보고 판단
여기서의 요청의 결과가 의미하는 것은 응답 상태 코드가 아닌 서버의 상태이다.
- Timeout 등으로 클라이언트가 서버로부터 정상 응답을 받지 못했을 때 같은 요청을 다시 해도 되는지 판단하는 근거
- GET, PUT, DELETE
- GET: 몇 번을 조회하더라도 같은 결과가 조회된다.
- PUT: 결과를 대체한다. 따라서 같은 요청을 여러번해도 최종 결과는 같다.
- DELETE: 결과를 삭제한다. 같은 요청을 여러번 해도 삭제된 결과는 같다.
- POST: 멱등이 아니다. 두 번 호출하면 에러가 발생할 수 있다.
Tip
PUT과 PATCH 메소드의 차이점은 전체 교체, 일부 교체 행위의 차이가 아니라 PUT 메소드는 반드시 멱등성을 보장하지만 PATCH 메소드는 구현 방식에 따라 멱등성을 보장하지 않을 수도 있다는 것이다.
# 캐시 가능(Cacheable)
- 응답 결과를 캐시해 사용할 수 있는 속성
- GET, HEAD, POST, PATCH (단, Message Body의 캐시 키의 복잡성 문제로 실제로는 GET, HEAD만 사용)