HTTP
HTTP란
HyperText Transfer Protocol 의 약자로 웹에서 데이터를 주고 받기 위한 프로토콜 중 하나.
HTTP는 클라이언트와 서버 간의 통신을 담당하며, 주로 웹 브라우저와 웹 서버 간의 데이터 전송에 사용된다.
TCP/IP 5계층에서 Application Layer 에 속하는 프로토콜이다.
HTTP 동작
그렇다면 클라이언트와 서버간의 HTTP 통신은 어떤 식으로 동작하는가
클라이언트와 서버들은 메시지 교환에 의해서 통신한다.
클라이언트에 의해 전송되는 메시지를 request(요청) 이라고 부르며, 그에 대한 서버에서의 응답으로 전송되는 메시지를 response(응답) 라고 한다.
HTTP의 특징
Stateless(무상태) 프로토콜
HTTP는 상태를 저장하지 않는 stateless 프로토콜이다.
각 요청은 독립적이고 이전 요청과 관련이 없다.
stateless로 인한 장점은 크게 2가지가 있다.
- 스케일 아웃(확장)에 있어서 유리하다
어떤 서버와 통신하던 상태를 저장하지 않기 때문 - 서버에 상태를 저장하지 않기 때문에 상태 관리에 대한 부담이 적다.
하지만, 클라이언트 요청마다 더 많은 정보를 실어야하기 때문에 데이터 전송량이 좀 더 크다.
stateful한 시스템인 session을 사용하거나, token을 사용하는 방식으로 클라이언트의 정보를 확인한다.
Connectionless(비연결성)
HTTP는 클라이언트와 서버의 연결을 지속적으로 연결하지 않는다.
연결을 유지하지 않고 요청과 응답으로 작동한다.
연결을 계속 해서 유지하지 않기 때문에, 서버의 자원을 효율적으로 사용할 수 있다는 장점이 있다.
물론 한계도 있다. 한계와 개선방법을 알아보자.
비연결성의 한계 - 단기 커넥션
웹 브라우저로 사이트를 요청하면 HTML 뿐만 아니라 js,css, image 등 많은 Resource가 연쇄적으로 요청되는 경우가 많다.
하지만 HTTP의 비연결성으로 요청 시마다 새로 연결을 해야하면 상당한 비효율성이 생긴다.
HTTP는 TCP/IP 연결을 사용하는데, 매번 3way handshake를 한다는 말이 된다.
비연결성 극복 - HTTP 지속 연결
지속연결을 통해서 위 문제점을 해결한다.
소켓 연결을 일정 시간동안 더 유지시켜서, 필요한 resource들을 모두 다운받을 때 까지 연결이 종료되지 않게한다.
HTTP 메시지
HTTP 메시지는 아래와 같은 구조를 가진다.
크게 start line, header, empty line, message body로 구성된다.
공백 라인은 HTTP 메시지 값을 구분하기 위한 라인으로, 단순히 보기 좋게하기 위한 것은 아니므로 반드시 있어야한다.
HTTP 요청에 따라서 body는 포함될 수도 있고 안될 수도 있다.
요청 메시지
- Method : #HTTP Method.
- Path : 가져오려는 resource의 경로. 프로토콜, 도메인, port 를 제거한 resource의 URL
- Version of the protocol : 프로토콜버전
- Header : 서버에 대한 추가 정보를 전달하는 헤더들.
응답 메시지
- statuss code : #HTTP 상태 코드
- status message : 상태코드의 짧은 설명을 나타내는 메시지. 영향력은 없다.
- Header : 추가정보 헤더들.
HTTP Method
클라이언트와 서버 사이에 이루어지는 요청과 응답 데이터를 전송하는 방식
주어진 리소스에 수행하길 원하는 행동을 정의한다.
method 종류
9종류가 있지만, 그 중 주로 쓰이는 메서드는 5개 정도이다.
- GET : 리소스 조회
- POST : 요청 데이터 처리, 주로 데이터 등록에 사용
- PUT : 리소스를 대체, 해당 리소스가 없으면 생성
- PATCH : 리소스를 일부만 변경
- DELETE : 리소스 삭제
그외 - HEAD: GET과 동일하지만 메시지 부분을 제외하고, 상태 줄과 헤더만 반환
- OPTIONS: 대상 리소스에 대한 통신 가능 옵션을 설명(주로 CORS에서 사용)
- CONNECT: 대상 자원으로 식별되는 서버에 대한 터널을 설정
- TRACE: 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행
특성
안정성(safe)
- 호출해도 리소스 변경이 일어나지 않는 속성. 다른 요소는 고려X
- GET, HEAD가 안전한 method라고 할 수 있다.
멱등성(idempotent)
- 동일한 요청을 여러번 보내도 한번 보내는 것과 같은 것
- 요청의 결과를 보고 판단한다.
- GET, PUT, DELETE 가 멱등성을 만족한다고 할 수 있다.
- POST는 요청이 중복되면 에러가 발생할 수 있다.
캐시 가능(cacheable)
- 응답 결과를 캐싱해 사용할 수 있는 속성
- GET, HEAD, POST, PATCH가 캐시 가능하나, body 캐시키의 복잡성 문제로 주로 GET, HEAD만 사용.
HTTP 상태 코드
서버가 클라이언트에게 전송하는 3자리 숫자로 이루어진 코드.
HTTP 요청의 결과를 나타낸다.
다음은 표준 상태코드와 그 중 많이 사용되는 상태코드 들이다.
1xx(informational)
작업을 진행중이라는 의미. HTTP/1.0 이후 잘 안쓰이다가 최근들어 101 WebSocket등에서 사용
- 100 Continue
- 101 Switching Protocols
2xx(successfull)
작업을 성공적으로 받았고, 이해했음여, 받아들여졌다는 의미
- 200 OK: 요청이 성공적으로 처리
- 201 Created: 요청이 성공적으로 처리되었고, 새로운 리소스가 생성됨
- 204 No Content: 요청이 성공적으로 처리되었지만 응답 본문에 컨텐츠가 없음
3xx(redirection)
요청을 완료하기 위해서 리다이렉션이 이루어져야 한다는 의미
- 301 Moved Permanently: 리소스의 위치가 변경되었으며, 앞으로는 새로운 주소를 사용해야 함
- 302 Found (or Moved Temporarily): 리소스의 위치가 일시적으로 변경되었으며, 임시 주소를 사용해야 한다.
- 304 Not Modified: 클라이언트의 캐시가 최신이므로 서버는 컨텐츠를 다시 전송하지 않음
4xx(client error)
클라이언트의 요청이 올바르지 않다는 의미. 여기서부터는 브라우저에 직접 표출된다.
- 400 Bad Request: 서버가 요청을 이해하지 못했거나, 잘못된 요청
- 401 Unauthorized: 인증이 필요한 페이지에서 사용자가 유효한 자격 증명을 제공하지 않음
- 403 Forbidden: 서버가 요청을 거부
- 404 Not Found: 요청한 리소스를 찾을 수 없음
- 408 Request Timeout(요청시간 초과) : 요청 중 시간 초과
5xx(server error)
서버가 응답할 수 없다는 의미이며, 요청이 올바른지의 여부는 알 수 없다.
- 500 Internal Server Error: 서버에서 요청을 처리하는 중에 오류가 발생
- 502 Bad Gateway: 게이트웨이나 프록시 서버가 유효하지 않은 응답을 받았음
- 503 Service Unavailable: 서버가 현재 사용 불가능하며, 일시적으로 요청을 처리할 수 없음
- 504 Gateway Timeout : 게이트웨이가 연결된 서버로부터 응답을 받을 수 없을 때