HTTP란?
1. HTTP란?
HTTP(Hyper Text Transfer Protocol)
브라우저와 서버가 통신할 수 있도록 만들어주는 여러 프로토콜 가운데 한 종류
웹 브라우저와 웹 서버 간에 HTML 리소스를 주고받는데 쓰이는 통신 프로토콜
- HTTP는 웹에서 이루어지는 모든 데이터 교환의 기초이며, 클라이언트-서버 프로토콜이다.
- 보통 웹브라우저에서 이루어지며, 수신자 측에 의해 요청이 초기화된다.
- 하나의 완전한 문서는 텍스트, 레이아웃, 이미지, 비디오, 스크립트 등 불러온(fetched) 하위문서들로 재구성된다.
- 클라이언트와 서버는 개별적인 메세지 교환에 의해 통신된다.
- 클라이언트에서 전송되는 메세지를 Request(요청)
- 서버에서 전송되는 메세지를 Response(응답)
2. 통신 프로토콜이란?
통신 규약이라고도 하며 컴퓨터와 컴퓨터, 컴퓨터와 장비 사이에서 메세지(데이터)를 주고받는 양식과 규칙 체계이다.
여기에는 신호 체계, 데이터 표현방식, 인증, 오류 검증 등의 기능이 포함된다.
- 물리적 측면 : 매체, 단자, 전송 신호, 회선 규격
- 논리적 측면 : 자료 형식 단위, 자료 전송 절차
3. HTTP 프로토콜
위에서 언급했듯이 HTTP에서는 클라이언트가 서버에 요청 메세지를 보내고, 서버는 클라이언트의 요청에 대한 응답을 반환한다. 즉, 요청과 응답(request, response) 방식이다.
이 요청과 응답 사이에는 여러 개체들이 있다. 다양한 작업을 수행하는 게이트웨이, 캐시 역할을 하는 프록시 등이 있는데, 이는 웹의 계층적인 설계로 인해, 네트워크와 전송 계층 내로 숨겨진다.
HTTP는 애플리케이션 계층의 최상위에 있다.
일반적으로 전송 계층 프로토콜로 TCP를 사용하고, 네트워크 계층 프로토콜로 IP를 사용한다. 이 두 계층을 합쳐 많이들 들어본 TCP/IP라고 부른다. TCP/IP에서 IP 주소를 사용해 통신할 컴퓨터를 결정하고, 포트 번호를 통해 해당 컴퓨터의 어떤 프로그램과 통신할지를 결정한다.(HTTP의 기본 포트 : 80)
연결상태를 유지하지 않는 비연결성 프로토콜이 존재하는데, 이는 서버가 응답 메세지를 반환한 후에 클라이언트의 상태를 저장하지 않는다는 뜻이다. 이를 무상태성(stateless)라고 부른다.
상태가 없다는 무상태성은 데이터를 주고받기 위한 각각의 데이터 요청이 서로 독립적이라는 뜻으로, 이전 데이터 요청과 다음 데이터 요청이 서로 관련이 없다는 뜻이 된다.
여기서 발생하는 단점을 해결하기 위해, Cookie와 Session이 등장했다.
4. 클라이언트, 서버, 프록시
- 클라이언트(Client)
요청을 보내는 쪽으로 사용자를 대신하여 동작하는 모든 도구들이다. 일반적인 웹 관점으로는 브라우저를 의미한다.
- 서버(Server)
요청을 받는 쪽으로 요청에 대한 데이터를 보내준다. 논리적으로는 단일 기계이며, 일반적으로는 원격지의 컴퓨터를 의미한다. 서버는 단일 서버 혹은 각 부분을 담당하고 공유하는 서버들의 집합일 수도 있다.
- 프록시(Proxy)
웹 브라우저와 서버 사이에서는 수많은 컴퓨터와 머신이 HTTP 메세지를 이어 받고 전달한다. 여러 계층으로 이루어진 웹 계층 구조에서 이러한 컴퓨터/머신들은 대부분 전송, 네트워크 혹은 물리 계층에서 동작하며 성능에 영향을 준다. 그 중에서 애플리케이션 계층에서 동작하는 것들을 일반적으로 프록시라고 부른다.
프록시가 수행하는 기능들은 다음과 같다.
- 캐싱(공개, 비공개)
- 필터링(바이러스 백신 스캔, 유해 컨텐츠 차단)
- 로드 밸런싱(여러 서버들이 서로 다른 요청을 처리하도록 허용)
- 인증(다양한 리소스에 대한 접근 제어)
- 로깅(이력 정보 저장)
5. HTTP 메세지
- HTTP Request 메세지
- Request Line
- 시작되는 줄로, HTTP 메서드(GET, POST 등)을 사용해 서버가 수행해야 할 동작을 나타낸다.
- 요청 타겟(URL, 프로토콜, 포트, 도메인 등)을 나타내며, 이들은 요청 컨텍스트에 의해 특정 지어진다.
- HTTP 버전, 응답 메세지에 사용할 HTTP 버전을 알려준다.
- Header
- 대소문자 구분 없는 문자열 다음 콜론(:)이 붙으며, 그 뒤에 오는 값은 헤더에 따라 달라진다.
- General Header
- 요청과 응답에 모두 적용되지만, 데이터와 관련이 없는 헤더
- ex) Date, Connection(클라이언트-서버 간의 연결 옵션) 등
- Request Header
- 요청하는 클라이언트에 대한 자세한 정보를 포함하는 헤더
- ex) Host, User-agent, Cookie 등
- Entity Header
- 콘텐츠의 길이나 MIME 타입과 같이 Entity Body에 대한 자세한 정보를 포함하는 헤더
- ex) Content-Type, Content-Length 등
- Body
- request의 마지막 부분으로, 헤더에서 한줄 띄고 시작한다.
- 모든 요청에 들어가지 않으며, GET과 같이 리소스를 가지고 오는 요청은 대부분 Body를 필요로 하지 않는다.
- HTTP Response 메세지
- Status Line
- Response가 시작되는 줄이다.
- 프로토콜 버전, 보통 HTTP/1.1이다.
- 상태 코드, 요청의 성공 여부를 나타낸다.
- 상태 텍스트, 상태 코드에 대한 설명이 짧게 나타난다.
- Header
- 위와 마찬가지이며, Response Header가 존재한다.
- Response Header
- 서버 자체에 대한 정보, 응답에 대한 부가적인 정보를 포함한다.
- ex) Server, Allow, ETag, Access-Control-Allow-Origin 등
- Body
- 마찬가지로, 모든 응답에 들어가지 않고, 201, 204와 같은 상태 코드에서는 Body가 없다.
6. HTTP Method
요청하는 데이터에 특정 동작을 하도록 하는 것이 HTTP 요청 메소드이다.
- GET : 존재하는 자원에 대한 요청
- POST : 새로운 자원을 생성
- PUT : 존재하는 자원에 대한 변경
- DELETE : 존재하는 자원에 대한 삭제
- HEAD : 서버 헤더 정보를 획득, GET과 비슷하나 Response Body를 반환하지 않는다.
- OPTIONS : 서버 옵션들을 확인하기 위한 요청, CORS에서 사용한다.
7. HTTP Status Code
클라이언트의 요청에 대한 서버의 응답정보로, 에러 처리를 하는데 큰 도움을 준다.
- 2XX : Success
- 200 : GET 요청에 대한 성공
- 201 : 정상적으로 생성
- 204 : No Content. 성공했으나 Response Body에 데이터가 없음
- 205 : Reset Content. 성공했으나 클라이언트의 화면을 새로 고침하도록 권고
- 206 : Partial Content. 성공했으나 일부 범위의 데이터만 반환
- 3XX : Redirection
- 301 : Moved Permanently. 요청한 자원이 새 URL에 존재
- 303 : See Other. 요청한 자원이 임시 주소에 존재
- 304 : Not Modified. 요청한 자원이 변경되지 않았으므로 클라이언트에서 캐싱된 자원을 사용하도록 권고.
- 4XX : Client Error
- 400 : Bad Request. 잘못된 요청
- 401 : Unauthorized. 권한 없이 요청. Authorization 헤더가 잘못된 경우
- 403 : Forbidden. 서버에서 해당 자원에 대한 접근 금지
- 404 : Not Found. 요청한 자원이 서버에 존재하지 않음. 없는 url 혹은 존재하지 않는 api 요청
- 405 : Method Not Allowed. 허용되지 않은 요청메소드
- 409 : Conflict. 최신 자원이 아닌데 업데이트하는 경우
- 5XX : Server Error
- 501 : Not Implemented. 요청한 동작에 대해 서버가 수행할 수 없는 경우
- 503 : Service Unavailable. 서버가 과부화 또는 유지 보수로 내려간 경우